소개
재사용 가능한 플레이북은 개발과 운영의 답을 각각 하드코딩하는 대신 환경 데이터를 사용해야 합니다. 인벤토리 선택, 변수 범위, 대상 팩트가 각 노드에 전달되는 내용을 결정합니다.
서로 다른 SSH 노드를 선택하는 두 인벤토리를 사용하고, 각 소스 옆에 그룹 및 호스트 데이터를 저장하며, 하나의 플레이북으로 설정을 생성합니다. 또한 임시 추가 변수 덮어쓰기를 적용하고 안정된 기준 상태를 복원합니다.
환경별로 인벤토리 데이터 분리하기
이 단계에서는 개발과 운영에 별도의 인벤토리 소스와 그룹 변수 값을 제공합니다.
프로젝트로 이동합니다.
cd /home/labex/project
실습에는 작은 인벤토리 두 개가 제공됩니다. 자동화를 실행하기 전에 각각 읽어 보세요.
cat inventories/dev/hosts.ini
cat inventories/prod/hosts.ini
dev의 app 그룹에는 web1이 있고 prod의 app 그룹에는 web2가 있습니다. 주소와 SSH 설정은 준비되어 있습니다. 이들은 localhost의 두 이름이 아니라 실제로 별개인 노드입니다.
-i는 이번 호출의 인벤토리 소스를 선택하여 프로젝트 기본 인벤토리를 덮어씁니다. 각 환경을 별도로 미리 확인합니다.
ansible app -i inventories/dev/hosts.ini --list-hosts
ansible app -i inventories/prod/hosts.ini --list-hosts
dev에는 web1, prod에는 web2가 표시되어야 합니다. 격리된 환경을 흉내 내기 위해 두 소스를 결합하지 마세요. 소스는 병합될 수 있으며 같은 인벤토리 호스트 이름은 여전히 하나의 호스트를 식별합니다. 각 환경의 호출을 명시적으로 유지하세요.
변수는 자동화에서 사용하는 이름이 있는 값입니다. YAML 매핑은 name: value 줄을 사용합니다. Ansible은 인벤토리 옆의 group_vars/app.yml을 해당 app 그룹에 로드합니다. 각 환경에서 같은 그룹 이름에 서로 다른 데이터를 만듭니다.
cat > inventories/dev/group_vars/app.yml <<'EOF'
environment_label: development
release_channel: preview
EOF
cat > inventories/prod/group_vars/app.yml <<'EOF'
environment_label: production
release_channel: stable
EOF
해석된 인벤토리 데이터를 확인합니다. --list는 호스트 값을 위한 _meta.hostvars 객체가 포함된 JSON을 반환합니다.
ansible-inventory -i inventories/dev/hosts.ini --list
ansible-inventory -i inventories/prod/hosts.ini --list
dev 호스트는 development/preview로, prod 호스트는 production/stable로 해석되어야 합니다. 변수 파일은 의도한 인벤토리와 그룹이 실제로 로드할 때만 의미가 있습니다.
호스트 변수와 실제 팩트 사용하기
이 단계에서는 한 호스트의 그룹 값을 덮어쓰고 환경 데이터를 실제 관리 설정으로 생성합니다.
host_vars 아래의 파일 이름은 인벤토리 호스트에 맞춥니다. 같은 호스트와 키에 대해 호스트 변수는 여기서 사용하는 그룹 변수를 덮어씁니다. 개발 canary에 호스트별 릴리스 채널을 지정합니다.
cat > inventories/dev/host_vars/web1.yml <<'EOF'
release_channel: canary
EOF
개발 환경의 environment_label은 여전히 development이지만 web1의 release_channel은 이제 canary로 해석됩니다. 운영 환경은 stable로 유지됩니다. dev 해석 결과를 확인합니다.
ansible-inventory -i inventories/dev/hosts.ini --list
어느 인벤토리에서든 사용할 수 있는 재사용 가능한 플레이북 하나를 작성합니다.
cat > deploy-info.yml <<'EOF'
- name: Configure environment-specific application settings
hosts: app
gather_facts: true
vars:
banner_prefix: Managed environment
tasks:
- name: Write settings from variables and facts
ansible.builtin.copy:
dest: /home/automation/app-settings.conf
content: |
[application]
environment={{ environment_label }}
channel={{ release_channel }}
host={{ inventory_hostname }}
distribution={{ ansible_facts.distribution }}
label={{ banner_prefix }}
mode: "0640"
EOF
vars는 플레이 수준의 값 banner_prefix를 정의합니다. copy 콘텐츠 안의 {{ variable_name }}는 실행 시 값을 삽입합니다. 이는 기본적인 값 치환이며 이후 실습에서 독립된 Jinja 템플릿을 관리합니다.
YAML의 |는 그 아래 들여쓴 콘텐츠를 마지막 줄바꿈을 포함하는 여러 줄 텍스트로 유지합니다. inventory_hostname은 현재 인벤토리 이름입니다. gather_facts가 true이면 Ansible은 태스크 전에 대상 데이터를 수집하며 ansible_facts.distribution은 실제 운영 체제 배포판을 제공합니다. 이는 컨트롤러의 팩트가 아니라 대상 데이터입니다.
구문을 확인한 다음 각 환경에 대해 같은 플레이북을 별도로 실행합니다.
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml --syntax-check
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml
ansible-playbook -i inventories/prod/hosts.ini deploy-info.yml
각각의 인벤토리를 통해 실제 파일 둘을 읽습니다.
ansible app -i inventories/dev/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
ansible app -i inventories/prod/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
개발에는 environment=development, channel=canary, host=web1이 있어야 합니다. 운영에는 environment=production, channel=stable, host=web2가 있어야 합니다. 둘 다 distribution=Ubuntu와 label=Managed environment를 포함해야 합니다. 공통 플레이북이 서로 다른 데이터를 사용하여 서로 다른 대상 콘텐츠를 생성했습니다.
한 번의 호출에 덮어쓰기 적용 및 기준 상태 복원하기
이 단계에서는 저장된 인벤토리 데이터를 편집하지 않고 추가 변수를 사용한 다음 수렴된 기준 상태로 돌아갑니다.
-e는 이번 실행을 위한 추가 변수를 제공합니다. 여기서 보여 준 그룹 및 호스트 값을 덮어씁니다. 개발에만 임시로 hotfix 채널을 선택합니다.
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml -e release_channel=hotfix
생성된 dev 구성을 읽습니다.
ansible app -i inventories/dev/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
채널은 hotfix여야 합니다. 소스 group_vars와 host_vars 파일은 -e에 의해 편집되지 않았으며 운영 환경은 선택되지 않았습니다.
추가 변수 없이 실행하여 web1에 저장된 canary 채널을 복원합니다.
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml
이제 두 기준 환경을 모두 미리 확인합니다.
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml --check
ansible-playbook -i inventories/prod/hosts.ini deploy-info.yml --check
선택된 각 호스트는 대기 중인 변경 0과 실패/연결 불가 결과 없음을 보고해야 합니다. 여기서 연습한 제한된 우선순위 관계는 그룹 데이터, 호스트 덮어쓰기, 추가 변수 덮어쓰기입니다. 더 복잡한 우선순위 규칙은 이 연습의 범위 밖입니다.
요약
서로 다른 환경 인벤토리를 선택하고 그룹 데이터를 로드했으며 호스트별 덮어쓰기를 적용하고 공통 플레이북으로 실제 대상 팩트를 콘텐츠에 반영했습니다. 임시 추가 변수는 한 번의 호출을 변경했고 이후 기준 실행은 두 환경을 안정적인 선언 설정으로 되돌렸습니다.


