티스토리 뷰

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를 전달.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함