티스토리 뷰
AWX의 프로젝트, 인벤토리, Job Template은 Ansible 자동화의 핵심 구성 요소야. 여기서는 이들을 활용하는 Playbook 작성 팁과 AWX 기능 연계 방법을 살펴본다.
Job Template의 추가 변수 (Extra Variables) 활용
- Job Template 실행 시 추가 변수에 YAML 형식으로 값을 넘겨주면 Playbook에서 바로 사용할 수 있어. CI/CD 연동 시 동적으로 값을 전달할 때 매우 유용.
# playbook.yml # AWX Job Template의 "추가 변수"에서 아래와 같이 YAML로 변수 전달 가능: # --- # package_name: "htop" # deploy_env: "production" # user_email: "user@example.com" - name: Job Template 추가 변수 사용 hosts: localhost tasks: - name: 전달받은 패키지 이름 출력 ansible.builtin.debug: msg: "설치할 패키지: {{ package_name | default('vim') }}" - name: 배포 환경에 따른 작업 ansible.builtin.debug: msg: "현재 환경은 {{ deploy_env }} 입니다." when: deploy_env == "production"
Job Template의 "Survey (설문)" 기능으로 사용자 입력 받기
- AWX Job Template 설정에서 설문 탭 > +추가 클릭.
- 질문(프롬프트), 설명, 답변 변수 이름(예: target_version), 답변 유형(텍스트, 정수, 선택 목록 등), 기본값, 필수 여부 등을 설정.
- Playbook에서는 이 변수 이름을 일반 변수처럼 사용:
# playbook.yml
- name: Survey 변수 사용
hosts: all
tasks:
- name: 사용자가 입력한 버전으로 애플리케이션 배포
ansible.builtin.debug: # 실제로는 배포 모듈 사용
msg: "애플리케이션 버전 {{ target_version }}을(를) 배포합니다."
when: target_version is defined and target_version != ""
- Job Template 실행 시 사용자에게 입력폼을 보여주고, 입력값을 Playbook 변수로 전달해.
AWX의 동적 인벤토리와 연동 (클라우드 태그 기반 그룹핑 예시)
- AWX 인벤토리 소스(Source)를 AWS EC2 (또는 Azure, GCP)로 설정하고, 인스턴스 필터나 키 지정 그룹 옵션으로 특정 태그(예: Environment:production)를 가진 인스턴스만 가져오거나 그룹화하도록 설정.
- Playbook에서는 이렇게 동적으로 생성된 그룹을 사용:
# playbook.yml
- name: 프로덕션 환경 웹서버 설정
hosts: tag_Environment_production_web # AWS 태그 'Environment=production'과 'Role=web'을 가진 인스턴스 그룹 (AWX 인벤토리 설정에 따라 그룹명 달라짐)
become: yes
roles:
- nginx_prod_config
- 클라우드 환경에서 서버가 자동으로 늘어나거나 줄어들어도 Playbook 수정 없이 적용 가능.
Job Template에서 특정 자격증명(Credentials) 정보 활용 (환경변수 예시)
- AWX Job Template에 특정 자격증명(예: "My Cloud API Key")을 연결하면, Ansible 실행 환경에 해당 자격증명의 일부 정보가 환경 변수로 설정될 수 있어 (자격증명 유형에 따라 다름).
- 예를 들어, 사용자 정의 자격증명을 만들고 필드에 MY_API_TOKEN을 정의했다면:
# playbook.yml
- name: 자격증명 환경변수 사용
hosts: localhost
tasks:
- name: API 토큰 환경변수 확인 (lookup 사용)
ansible.builtin.debug:
msg: "환경변수로 전달된 API 토큰: {{ lookup('env', 'AWX_MY_API_TOKEN') }}"
# AWX는 Job Template에 연결된 자격증명의 필드명을 기반으로 AWX_ 접두사를 붙여 환경변수로 전달할 수 있음 (설정 확인 필요)
# 또는 자격증명 플러그인을 통해 직접 접근
- 더 일반적인 방법: Ansible Tower/AWX Credential Plugin을 사용하거나, Vault 자격증명을 통해 안전하게 전달.
프로젝트 업데이트 후 특정 Playbook 실행 (SCM 업데이트 연계)
- AWX 프로젝트 설정에서 시작 시 프로젝트 개정 업데이트 옵션을 활성화하면, Job Template 실행 전에 항상 Git 저장소의 최신 코드를 가져와.
- Playbook은 항상 최신 버전을 기준으로 실행되므로, CI/CD 파이프라인에서 코드 변경 후 바로 AWX Job Template을 호출하면 최신 변경사항이 반영된 자동화가 실행돼.
Job Template에서 "Limit" 옵션 활용
- Job Template 실행 시 제한 (Limit) 필드에 특정 호스트명, 그룹명, 또는 패턴 (예: webservers:!db01*)을 입력하면, 인벤토리의 전체 호스트가 아닌 지정된 호스트에 대해서만 Playbook이 실행돼.
- Playbook 자체를 수정하지 않고도 실행 대상을 유연하게 바꿀 수 있어. 예를 들어, 전체 웹서버 중 특정 서버 하나만 패치할 때 유용.
Job Template에서 "Tags" 또는 "Skip Tags" 옵션 활용
- Role이나 작업에 태그를 지정해두었다면 (예: tags: [install, configure]), Job Template 실행 시 태그 필드에 install만 입력하면 설치 관련 작업만 실행. 건너뛸 태그에 configure를 입력하면 설정 작업은 건너뛰어.
- 큰 Playbook의 일부만 선택적으로 실행할 때 유용해.
상세 로깅을 위한 debug 모듈 및 verbosity 활용
- AWX Job Template 실행 시 상세 정보 (Verbosity) 레벨을 조절하여 Playbook 실행 로그의 상세도를 변경할 수 있어. debug 모듈의 verbosity와 연계하여 디버깅에 활용.
# playbook.yml - name: 변수 값 및 중간 결과 확인 hosts: all tasks: - name: 중요한 변수 값 확인 ansible.builtin.debug: var: my_critical_variable verbosity: 1 # -v 옵션 이상일 때만 출력 - name: 복잡한 데이터 구조 확인 ansible.builtin.debug: msg: "{{ lookup('template', 'debug_output.j2') }}" verbosity: 2 # -vv 옵션 이상일 때만 출력 # templates/debug_output.j2 # User: {{ user_info.name }} # Home: {{ user_info.home }} # Groups: {{ user_info.groups | join(', ') }}
Job Template 실행 시점에서 외부 시스템과 통신 (API 호출 등)
- 배포 완료 후 Slack, Jira, 모니터링 시스템 등에 알리거나 상태를 업데이트할 때 사용.
# playbook.yml - name: 외부 서비스에 배포 완료 알림 hosts: localhost # 또는 delegate_to: localhost connection: local gather_facts: no vars: slack_webhook_url: "{{ lookup('env', 'SLACK_WEBHOOK_URL') }}" # AWX 자격증명 또는 환경변수로 관리 release_version: "{{ app_version | default('N/A') }}" tasks: - name: Slack으로 알림 보내기 ansible.builtin.uri: url: "{{ slack_webhook_url }}" method: POST body_format: json body: text: "애플리케이션 배포 완료! 버전: {{ release_version }} (호스트: {{ inventory_hostname if inventory_hostname else 'N/A' }})" # inventory_hostname은 실제 대상 서버 status_code: 200 when: slack_webhook_url is defined and slack_webhook_url != "" # delegate_to: localhost 를 사용하면 inventory_hostname이 localhost로 나올 수 있으니 주의. # 실제 배포 작업 후 실행되는 경우, 이전 register된 변수 등으로 실제 대상 호스트 정보 사용 가능
인벤토리 변수와 Job Template 변수의 우선순위 활용
- AWX Job Template의 추가 변수는 인벤토리 변수보다 우선순위가 높아.
- 이를 이용해 기본 설정은 인벤토리 변수에 두고, 특정 Job Template 실행 시에만 일부 값을 덮어써서 실행할 수 있어.
- 예: 인벤토리 group_vars/all.yml에 log_level: INFO 설정, 특정 디버깅용 Job Template에서는 추가 변수에 log_level: DEBUG를 전달.
댓글