# Ansible 기술정보 # 0. 인프라 자동화를 위한 여행의 시작 it인프라 자동화를 위한 여정의 시작. ##### 시작은 이러했다. 내가 근무하던 한 회사는 고객사에 회사 솔루션을 구축 / 운영 하는 회사였는데, 일반적인 SI/SM 조직과는 다르게 고객사에서 제공해주는 부분은 물리 서버를 설치하기 위한 Rack, 전원, 그리고 업링크 구성을 위한 네트워크와 스위치만 제공해주고, 서버/OS/S/W를 모두 구성해야 하는... 그렇다. turnkey 방식으로 계약된 솔루션이였다. 배포만 전담으로 하고 있는 딜리버리 파트가 존재했는데 파트인원은 총 3명, 실무는 주로 외주인력을 사용했는데 총 6명의 인원이 각 고객사 전산센터에 상주근무를 하고 있었다. 대충 계산해보니 1명당 약 300대의 서버를 배포해야 하는 업무인데, 문제는 이 배포업무가 전부 수동으로 진행하고 있었다는 점이다. 300대의 서버. 많은 수량이 아닐수도 있지만, 작업절차 자체가 너무 복잡했다.(기본 Setup을 위해서는 약 40번의 수동배포 작업이 존재) 달인이 될수도 있지만, 달인이 되기까지 많은 시행착오를 거치게 될 것이고, 시행착오의 과정에서는 실수가 포함될 수 밖에 없는 구조였다. 현실이 이렇다 보니 외주 근무자는 아침 출근하자마자 퇴근전까지 커맨드만 죽으라고 치다가 퇴근해야하고, 시간내에 완료가 되지 않으면 밤 늦게까지 배포를 하다가 퇴근하는 일도 다반사였다. 늦게까지 일하면서 고생이란 고생은 다 하는 외주근무자들이 피드백은 배포실수로 인한 꾸지람밖에 없었다. 이렇게 살 수는 없었다. 저녁이 있는 삶이라 하지 않았던가? > 자동화... 자동화가 필요했다.
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/6zqimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/6zqimage.png)
perplexity에서 생성한 AI이미지
**자동화 Step#1 - Jenkins 도입** 당시에는 Puppet / Chef라는 Configure management 툴이 있었는데, 진입장벽이 너무 높았다.. 추후 유지보수에도 문제가 생길것이 뻔했다. 그래서 다음 타자로 고민 했던것이 허드슨(현재의 Jenkins)이였다. 데이터 흐름도는 단순했다. nfs서버에다가 데이터들을 배포해놓고 jenkins 와 jenkins slave로 연동해서 배포하는 절차로 구성했다.
Jenkins를 CI용으로 사용하는 경우가 다반사였지, CD용으로 사용하는 경우는 많지 않았던것으로 기억한다. 그걸. 우리파트원들이 해낸거다,.ㅜㅜ jenkins를 구축하고, 각 배포절차를 jenkins project단위로 쪼개고, Project별로 shell모듈을 이용해 배포절차를 만들어 냈다. 외주 근무자들에게 jenkins사용방법을 설명해주고 추후 운영시 어떤 절차를 통해서 스크립트를 개발하면 되는지, 안내를 해주었다. jenkins project에 구성된 스크립트를 통해 자동으로 실행되도록 구현을 하였다. 기본 배포업무의 시간이 단축되었다. (3주 -> 1~2주 소요) 외주 근무자들도 jenkins 빌드버튼을 눌러놓고 다음날 출근해서 결과화인만 하면 되는 수준으로 만들어졌다. 잘 된줄 알았는데 시간이 지날수록 또다른 문제가 생겼다. 각 외주 근무자들이 자기만의 스타일대로 스크립트를 짜다보니 A고객사에서 배포하는 절차를 B고객사에 이식이 불가능했다. 코드가 긴 절차를 작성자가 없이는 해석이 불가능한 절차들도 생겨나기 시작했다. 고민에 빠졌다. 개발코드도 아니고 쉘 스크립트 작성 표준안따위 만들 여유는 없었다. 필요하다는 생각도 없었다. 개발팀에 가서 협업을 위한 개발과정을 어떻게 하는지 엿보았다. git을 사용하고 있었다. 우리도. git 써보자 **자동화 Step#2 - Jenkins 고도화** Jenkins를 대체할. 혹은 고도화를 할 갈림길에서 고민하고 있던 찰나. Jenkins에 보안취약점이 발생했다. 심각도 최상이다. 고객사에서도 취약점 대상인지, 빠르게 패치해달라는 요구사항이 계속 들어왔다. ASAP으로 jenkins 업그레이드가 필요했다. ([https://knvd.krcert.or.kr/detailSecNo.do?IDX=4842](https://knvd.krcert.or.kr/detailSecNo.do?IDX=4842)) 그런데.. Jenkins 업그레이드가 쉽지 않았다. rpm으로 jenkins를 upgrade를 하고 Jenkins Project에 들어갔더니.... 난리났다. hudson에서 사용하는 xml버전은 1.0인데, jenkins 최신버전은 1.1로 버전에 올라갔다. 그 과정에서 연결된 플러그인도 버전이 올라가다 보니 hudson에서는 잘 되던 작업이 jenkins에서는 인식을 못하는 일이 생겨난것이다. 그동안 잘 되던 절차들이 업그레이드 되면서 또 다시 수동으로 돌아갈수도 있는 위기였다. 그래서 기존에 쓰던 Jenkins Project는 전부 수동으로 마이그레이션을 하고 겸사겸사 각 고객사별로 개별적으로 작성된 project도 통합하였다. 그리고 또 하나,. 저 시절 방안을 찾다가 Jenkins blueocean이라는 플러그인을 발견했다,. 이거 활용을 잘하면 pipeline처럼 사용할 수 있겠다... 싶었다. [![image.png](http://igoni.kr/uploads/images/gallery/2023-08/scaled-1680-/ukCimage.png)](http://igoni.kr/uploads/images/gallery/2023-08/ukCimage.png) Jenkins Project 페이지 하나에서 사용자가 선택하는 값을 기준으로 배포하도록 구성했다. Project에서 type이라는 변수를 놓고 type이 web일 경우, db일 경우 각각 별도의 pipeline은 타도록 설계하였고, WebUI는 BlueOcean을 보여주었다. 기존에 1개씩 직렬로 수행하던 작업을 병렬로 바꾸니 배포완료시간도 줄어들게 되었다. (1~2주 걸리던 작업이 4일로 단축되었다) 저때 고생을 좀 했는데, Jenkins 상위버전을 사용하기 위해서는 JDK 1.8이상 요구되었는데, 그때까지만 해도 사용하던 자바는 1.6버전이였다. 그렇다.... Oracle java 1.6에서는 Jenkins 2.x버전으로 구동이 되지 않았던 것이다.. 그래서 각 고객사 OS에 java 1.8버전을 설치해했다. 아울러 업무 문화를 만들었는데 상용환경에서 Jenkins Project를 생성 / 수정을 할 경우 내부에서 논의를 거쳐 각 고객사에 적용하도록 하였다.왜 만들었는지, 어떤방식으로 작동하는지, 타 고객사에 배포해두면 좋을지 등등. **자동화 Step#3 - Ansible 도입** 아까 앞에서 기술한 git 기억나는가? 기존에 배포코드는 jenkins ui에서만 만들어두었는데 고객사가 늘어나고 해야할 Project가 많아지니 배포 코드 관리하기가 어려워졌다. 개인적으로는 git을 경험한 적이 없었기 때문에 옆개발팀 팀원에게 두달정도 git 사용하는 방법을 들었고, git기반의 인프라관리, 즉.IaC를 구성하기로 하였다. 사내 솔루션도 클러스터 기반의 S/W들이 도입되기 시작하였고, kafaka / zookeeper 등 서버 단위로 클러스터 구성하기 위한 절차들이 생기는데 기존 Project가지고는 구현하기가 어렵다고 판단했다.. 이제 jenkins말고 다른걸 찾아봐야할 시기가 온 것이다. 한국 Redhat. Automation관련된 자료들을 소개. 성공사례를 끊임없이 내놓던 시기였다. Ansible 기반의 배포 자동화를 검토해보고 싶었다, Redhat담당자를 초청하여 기존 인프라 현황에 더불어 우리의 요구사항을 전달해주었다. 그후 몇일 뒤. 대략적인 아키텍쳐가 나왔다. 세부적인 Flow는 실제 프로젝트를 진행하면서 나올수 있는 절차였지만 대략적인 아키텍쳐만으로도 현재 수행하고 있는 절차에 비하면 훌륭했다. 간단한 기능 몇가지만 해보았는데 좋았다. 기존 jenkins기반에서 프로비져닝시 발생했던 문제들을 ansible에서는 해소가 되었다, 무엇보다 동일한 yaml 포맷을 사용하기 때문에 개발자 성향에 따라 달라지는 스크립트 내용따위도 줄어들었다. 외주 근무자들에게 Ansible시스템 소개 / 코드 작성 방법을 설명하고 GIt에 대해 알려주기 시작하였다. git을 쓰게 되니 내부에서 논의하던 Jenkins Project 설명을 굳이 하지 않아도 되었다. request merge할때 코멘트를 작성하면 해결되는 일이였다. 정말 이해하기 힘든 설명일 경우에만 메신저로 물어보는것으로 해결되었다. 그래서 Git 기반의 Ansible을 우리는 쓰기로 결정했다. 근데 아직 아쉬운 점이 있는데, Ansible로 배포하려면 서버에 원격접근하여 배포 행위를 수행해야 하는데 먼가... 불편해보였다. 심하게는 jenkins 보다 퇴보된 느낌이였다. Jenkins와 Ansible을 연동해보았다. 아쉬움이 생겼다. Foreman에 Ansible을 연동해보았다. 역시 아쉬움이 생겼다. Redhat에서는 Automation 상용제품을 만들어 냈는데, 거기에 대응하는 오픈소스 프로젝트가 있을터. 그렇다.. 찾았다 바로 AWX([https://github.com/ansible/awx)](https://github.com/ansible/awx)) 였다. AWS 약식 구성도
[![image.png](http://igoni.kr/uploads/images/gallery/2023-08/scaled-1680-/e1jimage.png)](http://igoni.kr/uploads/images/gallery/2023-08/e1jimage.png) Web기반에 Ansible을 사용할 수 있게 되었고, 굳이 서버에 접근하지 않고 WebUI기반으로 배포업무를 수행하면 되니 내가 생각했던 것들을 해결하기에는 완벽에 가까워졌다. 다만 외주 근무자들이 처음 ansible용 yaml 작성을 힘들어 했고, 특히 정기적인 pull을 안하다보니 충돌나는 등 적응기간이 필요했다. 그리고 우리는 기존보다 더 복잡해진 배포절차가 생겼음에도 불구하고, 단 하루만에 구축을 완료하는 엄청난 쾌거를 만들어 냈다. 처음엔 3주 소요되던 초기 setup절차가 단 하루만에 배포되는 절차를 성공시킨것이다. **자동화의 역설 - 밝은 미래, 어두운 관리** 배포 자동화에 성공했다. 단순히 서버만 배포하는것으로 끝이 아닌 전체 infra를 관리 할 수 있는 방안도 마련되었다. 그런데 이번엔 방향이 이상하게 흘러갔다. 6명에서 3주간 소요되던 배포일자가 하루, 이틀이면 끝나게 되니 굳이 6명 모두 다 필요한건지에 대한 첼린지가 들어온것이다. 이미 비용 감축을 위한 준비는 다 끝나있었고, 내가 6명 다 없어도 됩니다라는 말을 할때까지 보고사항에 대해 승인되지 않았다. 느낌이 좋지 않았다. 그동안 고생하면서 일했는데... 다양한 환경의 infra을 구성하기 위해서는 외주인원 6명 모두 필요하다는 나름대로 자료를 준비해서 보고했다,(Saltstack도 이때 준비해봣었다) 하지만 설득실패하였다.ㅠ 결국 외주근무자 6명중 2명만 유지하고 나머지는 각 소속사로 복귀. 최종적으로는 1명만 유지하게 되었다. 사용자의 최소한의 개입으로 안정되고 동일한 품질의 배포된다는 장점이 있기에 만족한다. 하지만 자동화의 역설을 보는것 같아 씁슬했다. reference - [https://cd.foundation/blog/2021/09/02/bringing-blue-ocean-into-the-future-of-jenkins/](https://cd.foundation/blog/2021/09/02/bringing-blue-ocean-into-the-future-of-jenkins/) - [https://yallalabs.com/devops/how-to-create-new-job-template-ansible-tower-awx/](https://yallalabs.com/devops/how-to-create-new-job-template-ansible-tower-awx/) - # 1- Ansible 이해하기 Ansible을 알기 위해서는 먼저 IaC(Infrastructure as Code)를 이해해야 하는데요. (알아요…. 개발자가 아닌이상 code라는 단어가 나오기 시작하면 머리가 아프기 시작하는거…ㅠㅠ) IaC는 일단 개념만 알아두고 넘어가요. 눈앞에 OS만 설치된 2대가 있다고 치죠. 이 서버를 apache 혹은 nginx 같은 어플리케이션을 설치한다고 하면, 서버 2대에 접속해서….. ```shell $ yum install apache 혹은 $ apt-get install nginx ``` 이런 명령어를 실행해서 어플리케이션을 설치할꺼예요. 그 다음은? mpm이나 vhost같이 apache 추가 설정해야 할 수도 있겠죠. 그러고 난 다음엔 웹 구동을 위한 docroot 설치도 해야 할꺼고, 기타 등등 블라블라~~ 우리는 IaC 개념을 접하기전까지는 저런 절차를 수동으로. 혹은 script를 만들어서 사용을 했을꺼예요. 그런데 어떠한가요? 편리한가요? 서버 수량이 2대가 아니라 50대, 100대라면..? 일일이 커맨드 치면 많이 힘들지 않을까요? (우리의 소중한 손가락 보호해요..ㅠㅠ) script로 할때는 어떨까요? 손으로 할때보다는 편리하겠지만 script 개발한 사람이 퇴사한 경우라면….? IaC(코드로 인프라 관리)는 수동으로 진행하는 업무를 code화 해서 운영자가 수동으로 하는 업무를 최대한 자동으로 관리한다는 개념..입니다. IaC를 완성시켜줄 수 있는 도구인 CM(Config Manange) Tool은 puppet / chef / Ansible 이 있는데요. 최근에 Ansible기반의 IaC를 구성해서 마무리가 되었는데요. 따끈따끈한 지식이 있을때 Ansible에 대한 포스팅을 진행하고자 합니다.
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/1DXimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/1DXimage.png)
perplexity 에서 생성한 AI이미지
왜? Ansible로 진행한 이유는…. 1. Opensource라서.. (License는 GPL 정책을 따릅니다.) 2. Windows / Linux / Network까지 두루두루 사용할 수 있어서 (Windows은 WinRM이라는 기능으로 접근하고 나머지는 ssh기반으로 접근해서 사용합니다.) 3. AWX라는 별도의 Opensource을 이용해 WebUI기능이 제공되기 때문에… 이런 사유로 puppet이나 Chef를 사용하지 않고 Ansible로 진행을 하게 되었습니다.
Ansible은 2015년에 Redhat에서 인수한뒤 [https://www.ansible.com/](https://www.ansible.com/) 에서 관리하고 있어요. # 2- Ansible 기본구조
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/3JVimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/3JVimage.png)
perplexity에서 생성한 AI이미지
1. Redhat기준으로 Ansible 구성은 이렇게 되어 있습니다.
컴포넌트명비 용OSS Project
Ansible CoreFreeAnsible [https://github.com/ansible/ansible](https://web.archive.org/web/20210418122625/https://github.com/ansible/ansible)
Ansible TowerCommercialAWX [https://github.com/ansible/awx](https://web.archive.org/web/20210418122625/https://github.com/ansible/awx)
2. Ansible에서 사용하는 용어를 정리하면...
**구성정보****용 도**
inventory배포 대상 정보가 기록된 정보
playbook – role – task – template – vars배포시 사용하는 배포코드 – 여러가지 배포업무가 수행될때 나눌 수 있는 리스트 – 배포 업무 수행 – 설정파일같은 템플릿화된 파일을 배포시 사용 – 배포코드 작성시 등록한 변수리스트
3. 프로비저닝 대상서버 접근 방식
**Target OS****접근방식 / 기본포트****추가 설명**
WindowsWinRM / tcp/5986Windows장비가 winrm 접근할 수 있게 설정되어 있어야 함 Windows7 이상부터 사용가능
Linux / Switchssh / tcp/22Telnet은 지원하지 않음
# 3- ansible 설치하기
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/3R2image.png)](http://igoni.kr/uploads/images/gallery/2025-06/3R2image.png)
perplexity에서 생성한 AI이미지
1. yum으로 설치하기 ```shell $> yum install epel-release -y $> yum install ansible -y ``` 2. pip으로 설치하기 ```shell $> pip install ansible ``` # 4- Ansible inventory 작성하기
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/wiTimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/wiTimage.png)
perplexity에서 생성한 AI이미지
ansible의 inventory는 배포대상 서버정보를 구성하는 파일입니다. rpm으로 설치할 경우 기본적으로 구성된 inventory는 /etc/ansible/hosts에서 작성할 수 있는데, playbook 작성에 따라 자체 inventory를 가질 수 있으니 참고만 해주세요. 1. inventory에서 작성할 수 있는항목은 group, children, vars 를 자주 사용하는데요. 2. 그룹명 web은 하위그룹으로 nginx, apache가 있다고 가정해보죠. 3. 192.168.10.10, 192.168.10.15까지는 nginx를 설치할꺼고 192.168.100.10부터 192.168.100.15까지는 apache를 설치할꺼예요. 4. playbook 코드도 그룹을 기준으로 설치할꺼예요. 5. ansible 접속을 위한 계정은 ansible이고, ssh포트는 2022를 사용할꺼예요 이렇게 구성하기 위한 인벤토리는 다음값으로 설정이 가능합니다. 인벤토리는 /home/ansible/inventory 파일로 작성할게요 ```shell $ vi /home/ansible/inventory [apache] 192.168.100.10 192.168.100.11 192.168.100.12 192.168.100.13 192.168.100.14 192.168.100.15 #혹은 이렇게 한줄 구성도 가능해요 192.168.100.[10:15] [nginx] 192.168.10.10 192.168.10.11 192.168.10.12 192.168.10.13 192.168.10.14 192.168.10.15 #혹은 이렇게 한줄 구성도 가능해요 192.168.10.[10:15] [web:children] apache nginx [all:vars] ansible_user=ansible ansible_ssh_port=2022 ``` 인벤토리 구성이 잘 되었는지 한번 테스트 해볼까요? ```shell $ ansible all -m ping -i /home/ansible/inventory #특정 그룹 혹은 inventory에 구성된 정보를 넣으면 all 대신에 그룹명 혹은 서버ip를 기재하면 됩니다. 192.168.10.15 | SUCCESS => {     "changed": false,     "ping": "pong" } 192.168.10.16 | SUCCESS => {     "changed": false,     "ping": "pong" } 192.168.100.15 | SUCCESS => {     "changed": false,     "ping": "pong" } ... ``` # 5- Ansible Playbook작성하기
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/wLCimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/wLCimage.png)
perplexity에서 생성한 AI이미지
지난번에는 에서 inventory를 작성하고 접속이 되는지까지 확인했는데요. 이제 실제로 어떤어떤 작업을 수행하겠다~를 작성하기 위해 playbook을 작성할꺼예요. 192.168.10.10 ~ 15번까지는 nginx 최신버전을 설치하고, 192.168.100.10 ~ 15번까지는 apache를 설치할꺼예요. Centos7 Base yum 에는 nginx가 없기 때문에 epel 리포지터리를 구성하고, nginx를 설치하는 절차입니다. ```shell vi /home/ansible/playbook.yml #nginx 그룹에 등록된 서버들 작업수행 name: Nginx Install # 작업 이름 hosts: "nginx"      # 배포대상 호스트 정보 gather_facts: yes   # 배포대상 서버들의 정보 수집 become: yes         # root로 작업시 tasks:              # 아래 나열된 작업을 수행 - name: epel enable # epel repository 활성화   yum:     name: https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm     state: present  - name: nginx install #nginx rpm 설치   yum:      name: nginx      state: latest  - name: nginx start  #nginx 서비스 실행, 재부팅후에도 활성화 적용   systemd:     name: nginx     daemon_reload: yes     state: started     enabled: yes ```
\#apache 그룹에 등록된 서버들 작업수행
```shell name: apache Install # 작업 이름 hosts: "apache"      # 배포대상 호스트 정보 gather_facts: yes   # 배포대상 서버들의 정보 수집 become: yes         # root로 작업시 tasks:              # 아래 나열된 작업을 수행 - name: apache install #httpd rpm 설치   yum:      name: httpd      state: latest  - name: httpd start  #httpd 서비스 실행, 재부팅후에도 활성화 적용   systemd:     name: httpd     daemon_reload: yes     state: started     enabled: yes ``` 코드를 작성 다 했으면 배포를 진행해보아요 ```shell $ ansible-playbook -i /home/ansible/inventory /home/ansible/playbook.yml -b ```
\# /home/ansible/inventory에 구성된 인벤토리를 가지고 /home/ansible/playbook.yml 파일에 구성된 작업절차를 수행하겠다는 Command 입니다.
배포코드 작성시 유의사항 - playbook은 yml 포맷으로 작성하기 때문에 tree구조를 띄어쓰기로 인식합니다 (탭키 인식 안함) 상 / 하위 개념 적용을 위해 띄어쓰기 잘 해주세요. - 작성된 예시코드는 ansible 2.9버전의 코드입니다. 2.10버전 이후부터는 문법이 바뀌었습니다. (https://docs.ansible.com/ansible/latest/ 참고) # 6 - AWX 설치절차
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/hZ8image.png)](http://igoni.kr/uploads/images/gallery/2025-06/hZ8image.png)
perplexity에서 생성한 AI이미지
Redhat에서는 Ansible Tower라는 software는 판매하고 있지요. 이 Ansible tower의 Opensource 버전이 AWX라는 녀석인데요. 이녀석을 설치해보려고 합니다. 참고로 AWX 18버전부터는 kubernetes operator을 이용해 설치해야 방식으로 변경이 되었고, 저는 14버전으로 설치하는 설차를 기록해놓으려고 합니다. 1. AWX컨테이너 용도 - awx\_web : AWX Frontend 용 Container - awx\_task : Ansible task용 Container - postgres : awx DB용 Container - redis : AWX Cache 관리용 Container 2. 설치정보 - Hardware : 2Core / 8G Mem 이상 / 60G Disk 이상 - OS : Centos7 이상 - Version : AWX 14.1.0 : Ansible 2.9.10 / python 3.6 / pip 20.1.1 / docker 18.09.7 3. software 설치 - Ansible 설치 ```shell $> yum install ansible or $> pip3 install ansible==2.9.5 ``` - Docker-CE 설치 / docker-compose 설치 ```shell $> yum install docker-ce -y $> pip install docker-compose ```
- AWX 다운로드 후 설정파일 변경(8081로 접근 설정) ``` $> git clone https://github.com/ansible/awx.git -b "14.1.0" $> cd awx/installer/ $> vi inventory ... postgres_data_dir="/svc/awx/pgdocker" docker_compose_dir="/svc/awx/awxcompose" ... host_port=8088 ... ```
- AWX 설치 ```shell $> ansible-playbook -i inventory install.yml ```
- awx-UI 구동을 위한 컨테이너 구동상태 확인 ```shell docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES abc490b5491a postgres:10 "docker-entrypoint.s…" 40 seconds ago Up 40 seconds 0.0.0.0:5432->5432/tcp awx_postgres 23a88b84555c ansible/awx:14.1.0 "tini -- /usr/bin/la…" 7 minutes ago Up 7 minutes 8052/tcp awx_task 998f87a22c50 ansible/awx:14.1.0 "tini -- /bin/sh -c …" 7 minutes ago Up 7 minutes 0.0.0.0:8081->8052/tcp awx_web 6efe1321bb04 redis "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 6379/tcp awx_redis ```
- postgres vacuum 설정 (postgres data 관리를 위한 설정) ```shell $> vi /data/awx/pgdocker/10/data/postgresql.conf ... track_counts = on autovacuum = on ... 설정 후 awx_postgres 컨테이너 재기동 필요 ```
4. AWX 접근 - 웹 브라우져에서 AWX 접근 ( http://{{서버IP}}:8088 ) - 최초 접근시 AWX is Upgrading 메세지 출력 (1회한) [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/scaled-1680-/dIuimage.png)](http://igoni.kr/uploads/images/gallery/2024-01/dIuimage.png) - 업그레이드 완료되면 로그인 진행 (admin / password , 패스워드 변경 필) [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/scaled-1680-/1A4image.png)](http://igoni.kr/uploads/images/gallery/2024-01/1A4image.png) # 7- awx에서 rest api 사용하기 ## awx에서 제공하는 restapi 사용방법 1. 전체 기능은 : http://192.168.20.10:8801/api/v2/ 에 접속하면 전체 api 기능 확인가능
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/L0Mimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/L0Mimage.png)
perplexity에서 생성한 AI이미지
## 사전작업 1. admin 계정으로 awx 로그인 2. 관리 → application → 새로생성 1. authorization grant type은 resource owner password=based, 2. client type → confidential 3. 관리 → user 에서 api용으로 사용할 서비스 계정 생성 후 token 생성 1. application에는 2번에서 생성한 application 선택 2. scope는 write로 선택 1.생성된 token값은 복사 (재 확인할 수 있는 절차가 없음) ## API 사용예제 1. inventory 조회 ```shell $ curl -X GET http://192.168.20.10:8801/api/v2/inventory/ \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer LQHjuUuJIn0jWjXLZ9LGVJEqXalvJM' | sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' ``` 2. Credential 정보 조회 ```shell $ curl -X GET http://192.168.20.10:8801/api/v2/credentials/ \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer LQHjuUuJIn0jWjXLZ9LGVJEqXalvJM' | sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' ``` 3. job templates조회 ```shell $ curl -X GET http://192.168.20.10:8801/api/v2/job_templates/ \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer LQHjuUuJIn0jWjXLZ9LGVJEqXalvJM' | sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' ``` 4. job template 실행 ```shell $ curl -X POST http://192.168.20.10:8801/api/v2/job_templates/46/launch/ \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer LQHjuUuJIn0jWjXLZ9LGVJEqXalvJM' \ --data '{     "inventory": 2,     "limit": "192.168.209.10",     "credentials": [2],     "extra_vars": {         "MAX_JOB": 1,         "SVC_USER": "user",         "INSTALL_PATH": "/home/",         "RUN_TYPE": "CMD",         "RUN_CMD":"ls -l"     } }' ``` - template ID가 46이고, inventory id가 2, credential id 가 2 인 job 수행 5. 호스트 등록 ```shell $ curl -X POST http://192.168.20.10:8801/api/v2/inventories/2/hosts/ \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer LQHjuUuJIn0jWjXLZ9LGVJEqXalvJM' \ --data '{     "name": "192.168.200.10",     "enabled": "true",     "variables": "use: yes\ntest: no" }' ``` - inventory id가 2이고, 182.168.200.10에 use, test라는 변수를 적용해서 호스트 등록 6. 그룹에 해당 호스트 추가 ```shell $ curl -X POST http://192.168.20.10:8801/api/v2/groups/6/hosts/ \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer LQHjuUuJIn0jWjXLZ9LGVJEqXalvJM' \ --data '{     "name": "192.168.200.10",     "enabled": true }' ``` - group id가 6번인 그룹에 192.168.200.10 호스트 등록 7. 호스트 삭제 ```shell $ curl -X POST http://192.168.20.10:8801/api/v2/inventories/2/hosts/ \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer LQHjuUuJIn0jWjXLZ9LGVJEqXalvJM' \ --data '{     "id": 75,     "disassociate": "True" }' ``` # 8- Ansible Role 이번엔 ansible role기반으로 배포절차를 만들어 보려고 합니다. 배포범위가 많아지면 하나의 플레이북으로 관리하기 힘들기 때문에 role이라는 이름으로 역활을 나누어서 배포할 수 있습니다.
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/02Dimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/02Dimage.png)
perplexity에서 생성한 AI이미지
1. playbook디렉토리에 roles 하위 디렉토리별로 수행해야할 역활을 기재해주시면 되고요.... 2. role기반의 디렉토리 구조는 다음과 같습니다. ``` $> tree -d -L 4 ./ ├── main.yml └── roles ├── os │   └── linux │   ├── setup │   │   ├── tasks │   │   │   ├── centos6.yml │   │   │   ├── centos7.yml │   │   │   ├── main.yml │   │   │   └── rocky8.yml │   │   └── templates │   │   ├── ntp.conf.j2 │   │   └── resolv.conf.j2 │   └── kernel_tune │      └── tasks │      └── main.yml └── software ├──apache │   ├── tasks │   │   ├── main.yml │   ├── templates │   │   ├── apache_logrotate.j2 │   │   ├── apache_systemd.j2 │   │   └── apache.conf.j2 │   └── vars │   └── vars.yml └── nginx    ├── tasks    │   ├── main.yml    ├── templates    │   ├── nginx_logrotate.j2    │   ├── nginx_systemd.j2    │   └── nginx.conf.j2    └── vars    └── vars.yml ``` 1. 세부디렉토리 정보는 다음과 같습니다. 1. main.yml --> 배포하는 yml파일 2. roles --> role 디렉토리 3. roles/os/linux/setup/task/ --> OS프로비져닝 하기 위한 플레이북 (default는 해당경로의 main.yml 파일을 실행) 4. roles/os/linux/setup/templates/ --> 해당 role에 templates 배포할떄 사용하는 디렉토리 5. roles/os/linux/setup/vars/ --> 해당 role에 정의할 외부변수 저장용 디렉토리 3. main.yml 파일내용은 다음과 같이 작성합니다. ``` $> cat main.yml --- - name: Setup hosts: "{{ target_hosts | default('all') }}" gather_facts: yes serial: "3" become: yes roles: - { role: os/linux/setup, tags: [ setup ] } #Linux초기 설치 Role template - { role: os/linux/tune, tags: [ tune ] } #nfs 서버 구성 후 마운트 template - { role: software/apache, tags: [ apache ] } #로그백업 스크립트 배포 template - { role: software/nginx, tags: [ nginx ] } # VCS구동을 위한 배포 Template ``` 4. role을 실행할때는 job\_tag라는 옵션(-t)으로 분리해서 사용하면 됩니다. nginx를 설치하기 위한 절차는 다음과 같이 사용하면 됩니다. ``` $>ansible-playbook -i host main.yml -t nginx ``` # 9-AWX 사용메뉴얼
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/2wVimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/2wVimage.png)
perplexity에서 생성한 AI이미지
### 대쉬보드
1. AWX로그인 후 첫 페이지, 작업상태 및 호스트상태, 최근 사용한 템플릿과 최근 실행한 작업 요약 확인 가능 ( ACCESS → DASHBOARD ) [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-cz2ozbjq.png)](http://igoni.kr/uploads/images/gallery/2022-09/EoFimage.png)
### 최근 실행 작업
1. 최근에 실행한 템플릿의 요약정보 확인 ( ACCESS → Jobs ) [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-divmhjqy.png)](http://igoni.kr/uploads/images/gallery/2022-09/wwcimage.png) 2. Job결과 확인 1. 아이콘 확인 1. [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-nyscnatk.png)](http://igoni.kr/uploads/images/gallery/2022-09/audimage.png) : 정상 작업 완료 2. [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-e54auwdb.png)](http://igoni.kr/uploads/images/gallery/2022-09/DCiimage.png) : 작업 실패 2. 작업관리 1. [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-6xukiuky.png)](http://igoni.kr/uploads/images/gallery/2022-09/gjXimage.png) : 동일한 vars값으로 재실행 2. [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-wisqk265.png)](http://igoni.kr/uploads/images/gallery/2022-09/3Cuimage.png) : 작업이력 삭제
### 스케쥴 확인
1. 스케쥴링 설정된 작업 리스트 (ACCESS → Schedules ) [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-bejouy2w.png)](http://igoni.kr/uploads/images/gallery/2022-09/WmIimage.png) 2. 스케쥴 작업 관리 (왼쪽에서부터)
**항목****설 명**
활성화체크+파란색 아이콘 : 활성화 체크X + 회색 아이콘 : 비활성화
NAME스케쥴 이름
TYPETemplate 유형
NEXT RUN다음 실행 시간 (빈칸일 경우 스케쥴링 실행되지 않음)
ACTION[![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-wl0p5hfs.png)](http://igoni.kr/uploads/images/gallery/2022-09/Essimage.png) : 스케쥴 정보 수정 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-s169iotk.png)](http://igoni.kr/uploads/images/gallery/2022-09/HrQimage.png): 스케쥴 정보 삭제
## 관리 메뉴 ### 조직관리
1. 사용자 / 팀 / 프로젝트 / 인벤토리를 관리하는 최 상단 그룹( ACCESS → ORGANIZATIONS)\\ 2. 조직 계층 구조 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-wuajyhuv.png)](http://igoni.kr/uploads/images/gallery/2022-09/PsYimage.png) 3. 조직생성 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-syg1dztr.png)](http://igoni.kr/uploads/images/gallery/2022-09/Sefimage.png) 버튼 선택) 1. 조직 생성 입력 화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-gxtvsxoe.png)](http://igoni.kr/uploads/images/gallery/2022-09/wK0image.png) 2. 항목별 상세설명
**항 목****값 설명****비 고**
NAME조직이름필수
DESCRIPTION조직에 대한 설명옵션
INSTANCE GROUPS인스턴스 그룹옵션
4. 조직 관리 1. USERS : 조직에 소속시킬 사용자 (계정명 선택) 2. PERMISSIONS : 조직의 권한설정
**항 목****설 명**
Admin전체 권한 부여
Execute프로젝트 실행만 가능
Project Admin프로젝트 생성 / 수정 / 읽기 가능
Inventory Admin인벤토리 생성 / 수정 / 읽기 가능
Credential Admin자격증명 생성 / 수정 / 읽기 가능
Workflow Admin워크 플로우 생성
Notification Admin알림 할당
Auditor읽기 전용 권한
Member템플릭을 제외한 모든 기능 읽기 가능
Read읽기 전용 권한
3. NOTIFICATIONS : 알람정책 관리 : 알람생성은 ( {{ 참조 }} )
### 사용자 관리
1. AWX에 접근하는 사용자의 관리 ( ACCESS → Users) 2. 사용자 생성 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-gax3xo7b.png)](http://igoni.kr/uploads/images/gallery/2022-09/AFuimage.png) 버튼 선택) 1. 사용자 입력 화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-k6b973p6.png)](http://igoni.kr/uploads/images/gallery/2022-09/LGeimage.png) 2. 항목별 상세 설명
**항 목****값 설명****비 고**
FIRST NAME사용자 이름 정보옵션
LAST NAME사용자 이름 정보옵션
ORGANIZATION계정 소속 조직필수
EMAIL해당 계정 이메일주소필수
USERNAME계정명필수
PASSWORD계정 패스워드필수
CONFIRM PASSWORD계정 패스워드 확인필수
USER TYPE계정 권한옵션
3. 사용자 관리 1. USER TYPE별 권한 정보
**권한명****설 명**
Normal User사용이 제한된 권한, 권한 정책에 따라 읽기/쓰기 가능
System Auditor모든 속성에 대해 읽기 권한
System Administrator모든 속성에 대해 읽기/쓰기 권한 (= superuser)
### 팀 관리
1. 사용자 / 프로젝트 권한을 설정할 수 있는 조직단위의 세부 구성 ( ACCESS → TEAM) 2. 팀 생성 1. 팀 생성 입력 화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-clga5m0m.png)](http://igoni.kr/uploads/images/gallery/2022-09/9alimage.png) 2. 항목별 상세설명
**항 목****값 설명****비 고**
NAME팀 이름필수
DESCRIPTION팀 설명옵션
ORGANIZAION소속된 조직필수
3. 팀 관리 1. USER : 팀 소속 사용자 2. PERMISSION : 템플릿 / 워크플로우 / 프로젝트 / 인벤토리 / 인증 / 조직별 권한 설정 1. 템플릿 권한
**항 목****설 명**
Admin선택한 템플릿의 전체 권한
Execute선택한 템플릿의 실행 / 점검권한
Read선택한 템플릿의 읽기 권한
2. 워크플로우 권한
**항 목****설 명**
Admin 선택한 템플릿의 전체 권한
Execute 선택한 템플릿의 실행 / 점검 권한
Read 선택한 템플릿의 읽기 권한
Approve작업승인여부 관리
3. 프로젝트 권한
**항 목****설 명**
Admin 선택한 프로젝트의 전체 권한
Execute 선택한 프로젝트의 설정 / 점검권한
Read 선택한 프로젝트의 읽기 권한
4. 인벤토리 권한
**항 목****설 명**
Admin 선택한 인벤토리의 전체권한
Update 인벤토리 업데이트 권한
Ad Hoc임시명령 (ping, win\_ping 등) 실행 가능 권한
Use 인벤토리 사용 권한
Read 인벤토리 읽기 권한
5. 조직 권한
**항 목****설 명**
Execute실행 / 점검 권한
Project Admin프로젝트 생성 / 수정 / 읽기 가능
Inventory Admin인벤토리 생성 / 수정 / 읽기 가능
Credential Admin자격증명 생성 / 수정 / 읽기 가능
Workflow Admin워크 플로우 생성
Notification Admin알림 할당
Job Template Admin템플릿 관리 권한
Auditor읽기 전용 권한
Read읽기 전용 권한
## 인증정보
1. AWX 사용에 필요한 계정정보 (RESOURCES → Credentials) 2. 인증정보 생성 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-4imidkd8.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택) 1. Machine 타입으로 인증생성 입력화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-rcrlkzdx.png)](http://igoni.kr/uploads/images/gallery/2022-09/XBmimage.png) 2. 항목별 상세설명
**항 목****설 명****비 고**
NAME 계정이름필수
DESCRIPTION 계정설명옵션
ORGANIZATION 소속 조직옵션
CREDENTIAL TYPE (Machine )winrm / ssh 등 장비로그인시 사용필수
USERNAME 실제 로그인하는 계정명필수
비밀번호 로그인시 사용하는 패스워드필수
PRIVILEGE ESCALATION METHOD상위 계정(root)을 권한 상승 방식옵션
PRIVILEGE ESCALATION USERNAME권한상승시 필요한 계정옵션
PRIVILEGE ESCALATION PASSWORD권한 상승하기 위한 패스워드 입력옵션
3. Source control 타입으로 인증생성 입력화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-ngqk2luf.png)](http://igoni.kr/uploads/images/gallery/2022-09/xvkimage.png) 4. 항목별 상세설명
**항 목****설 명****비 고**
NAME 계정이름필수
DESCRIPTION 계정설명옵션
ORGANIZATION 소속 조직옵션
CREDENTIAL TYPE (Machine )Git / subversion 로그인시 사용필수
USERNAME 실제 로그인하는 계정명필수
5.
### 프로젝트
1. playbook이 저장된 위치 설정 (RESOURCES → Project) 2. 프로젝트 생성 방법 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-ke9hv2ho.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택) 1. 프로젝트 생성 입력 화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-el0ai32b.png)](http://igoni.kr/uploads/images/gallery/2022-09/Bm5image.png) - 항목별 상세설명
**항 목****설 명****비 고**
NAME 프로젝트 이름필수
DESCRIPTION 프로젝트 설명옵션
ORGANIZATION 프로젝트 조직필수
SCM TYPE- Manual : 배포서버의 파일형태로 관리 (awx\_task 컨테이너 /var/lib/awx/project에 playbook이 저장되어 있어야 함) - git : git을 통해 관리 - subversion : subversion 을 통해 관리필수 배포시스템은 git을 통해 playbook 관리
SCM URLgit / subversion URL필수
SCM BRANCH/TAG/COMMIT특정 브랜치/태그를 이용해야 하는 경우 입력옵션 (공란인 경우 master / head)
GIT REFSPEC URLgit기반에서 원격 저장소 다운로드할 경로 참조시 입력옵션 (공란인경우 사용하지 않음)
SCM CREDENTIALgit / subversion 접근을 위한 계정정보필수 (인증정보에서 생성된 계정선택)
SCM UPDATE OPTIONS- CLEAN : 업데이트하기 전에 로컬 데이터 삭제 - DELETE ON UPDATE : 업데이트를 수행하기 전에 로컬저장소 전체 삭제 - UPDATE REVISION ON LAUNCH : 작업시작전에 업데이트 수행 - ALLOW BRANCH OVERRIDE : branch 변경이 필요할때 사용선택 선택 선택 선택안함
CACHE TIMEOUT (SECONDS)프로젝트를 최신상태로 인지하는 시간(초단위), 타임마아웃을 초과한 경우 프로젝트 소스를 다시 업데이트 함옵션 (0인 경우 사용안함)
### 인벤토리
1. 작업을 위한 호스트 모음 (RESOURCES → Inventories) 2. 인벤토리 생성 방법 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-3mz7ffac.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택) 1. 인벤토리 생성 입력화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-2sporp3x.png)](http://igoni.kr/uploads/images/gallery/2022-09/hcSimage.png) 2. 항목별 상세설명
**항 목****설 명****비 고**
NAME 인벤토리 이름필수
DESCRIPTION 인벤토리 설명옵션
ORGANIZATION 소속 조직필수
INSIGHTS CREDENTIALredhat Insights 계정선택옵션 (redhat Insightst사용시 선택)
Instance Group인벤토리의 인스턴스 그룹옵션 (사용하지 않음)
3. 인벤토리 추가 설정 1. 권한 설정 방법 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-v4i8jnqp.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택) 2. 권한설정 입력화면 : 추가할 계정명 선택 후 설정할 권한 정보 선택 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-brexusuq.png)](http://igoni.kr/uploads/images/gallery/2022-09/F00image.png) 3. 정책별 상세 설명
**항 목****설 명**
Admin모든 권한 부여
UpdateSCM업데이트시 프로젝트 업데이트 가능
Ad Hoc임시 명령 사용가능
Use템플릿에서 해당 인벤토리 접근 가능
Read읽기전용
1. 호스트 추가방법 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-dhhtnlsd.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택) 2. 호스트 추가 입력화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-r6qxjzlj.png)](http://igoni.kr/uploads/images/gallery/2022-09/e9Simage.png) 3. 항목별 상세설명
**항 목****설 명****비 고**
HOSTNAME타켓호스트 IP입력(호스트네임 입력 무방)필수 (호스트네임 입력시 ip와 매핑할 수 있는 정보 필요)
DESCRIPTION타켓호스트 설명옵션
VARIABLESssh포트, 접속 방법 등 해당 호스트의 추가 설정값 입력옵션 (기본은 ssh, tcp/22로 접근수행)
4. PERMISSIONS : 접근계정 권한설정 5. GROUPS : 각 호스트에 소속된 그룹정보 입력 1. 그룹추가 방법 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-8sic7cvk.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택) 2. 그룹추가 입력화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-pxif5xpt.png)](http://igoni.kr/uploads/images/gallery/2022-09/Aqmimage.png) 3. 항목별 상세설명
**항 목****설 명****비 고**
NAME그룹이름필수
DESCRIPTION그룹설명옵션
VALIABLES이 그룹에 소속된 모든 호스트에 적용할 값 입력(yaml / json 지원 가능)옵션
4. 생성된 그룹에 하위 그룹 생성 방법 (생성된 그룹 → GROUPS, [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-thrrzv93.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택) 1. 기존에 생성된 그룹의 경우 Existing Group 선택) 2. 하위그룹으로 관리할 그룹 명 선택 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-dgddcjeq.png)](http://igoni.kr/uploads/images/gallery/2022-09/nIlimage.png) 3. 새로운 그룹인 경우 New Group 선택 후 그룹정보 입력 5. 생성된 그룹에 소속시킬 호스트 등록 (생성된 그룹 → HOSTS) 1. 기존에 생성된 호스트의 경우 Existing HOSTS 선택) 2. 소속된 호스트 선택 6. 새로운 호스트의 경우 New HOSTS 선택 후 호스트정보 입력 6. HOTS : 해당 인벤토리에 등록할 호스트정보 등록 1. 호스트 추가방법 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-kiqjxuio.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택) 2. 호스트 추가 입력화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-eby6gvww.png)](http://igoni.kr/uploads/images/gallery/2022-09/GTrimage.png) 3. 항목별 상세설명
항 목설 명비 고
HOSTNAME타켓호스트 IP입력(호스트네임 입력 무방)필수 (호스트네임 입력시 ip와 매핑할 수 있는 정보 필요)
DESCRIPTION타켓호스트 설명옵션
VARIABLESssh포트, 접속 방법 등 해당 호스트의 추가 설정값 입력옵션 (기본은 ssh, tcp/22로 접근수행)
4. 4. 다수서버 등록시 방법 1. 인벤토리 신규 생성 2. AWX Task Container 로그인 ``` $> docker exec -i -t awx_task /bin/bash ``` 3. Inventory에 등록한 호스트파일 작성 ```bash $> vi add_list.txt [node] 1.2.3.4 5.6.7.8 [master] 10.20.30.40 50.60.70.80 [DB] 11.22.33.44 55.66.77.88 ``` 4. 작성한 호스트파일로 awx inventory 등록 ```bash bash-4.4# awx-manage inventory_import --inventory-name {{ 인벤토리명 }} --source list --force 2.703 INFO Updating inventory 15: {{ 인벤토리명 }} 3.443 INFO Reading Ansible inventory source: /var/lib/awx/list 3.446 INFO Using VIRTUAL_ENV: /var/lib/awx/venv/ansible 3.446 INFO Using PATH: /var/lib/awx/venv/ansible/bin:/usr/pgsql-10/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin: /bin 3.446 INFO Using PYTHONPATH: /var/lib/awx/venv/ansible/lib/python3.6/site-packages: 4.056 INFO Processing JSON output... 4.057 INFO Loaded 33 groups, 15 hosts 2020-07-17 02:12:40,663 DEBUG awx.main.models.inventory Going to update inventory computed fields, pk=15 2020-07-17 02:12:40,680 DEBUG awx.main.models.inventory Finished updating inventory computed fields, pk=15, in 0.014 seconds 4.305 INFO Inventory import completed for ({{ 인벤토리명 }} - 49) in 1.6s ```
### 템플릿
1. 실제 배포작업을 실행하기 위해 생성 (RESOURCES → Templates) 2. 기본 템플릿 생성방법([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-2kcpkvvz.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택 → Job Template 선택) 1. 템플릿 생성 입력화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-fby8mjda.png)](http://igoni.kr/uploads/images/gallery/2022-09/PoEimage.png) 2. 항목별 상세설명 PROMPT ON LAUNCH : 플레이북 실행시 선택창 출력
**항 목****설 명****비 고**
NAME템플릿 이름필수
DESCRIPTION템플릿 설명옵션
JOB TYPE- run : 실제 배포 수행 - check: 구문 오류테스트필수 (run 선택)
INVENTORY 템플릿에서 적용할 인벤토리 설정필수
PROJECT 템플릿에서 적용할 프로젝트 설정필수
PLAYBOOK템플릿에서 수행할 플레이북 선택필수
CREDENTIALS 템플릿에서 적용할 인증값 설정옵션
FORKS 플레이북 실행시 동시 프로세스옵션 (1 입력)
LIMIT 호스트 목록 제한시 입력옵션
VERBOSITY 로그 출력 레벨 (숫자가 높을수록 상세로그)0 선택 \* 디버깅 로그시 브라우저 탭이 잠기면서 작업완료 지연 보고 이슈 있음
JOB TAGS배포 작업별 설정되는 태그 입력템플릿별 고유의 태그 입력 필요
SKIP TAGS작업을 수행하지 않을 태그 입력옵션
LABELS템플릿을 설명하는 레이블 입력옵션
INSTANCE GROUPS템플릿을 실행할 인스턴스 그룹 선택옵션
JOB SLICING작업 슬라이스(다중 호스트 작업시 작업수를 분산) 설정옵션
TIMEOUT배포작업 최대 소요시간옵션 2400 입력
SHOW CHANGES작업시 변경되는 내용들 확인활성화
OPTIONS- ENABLE PRIVILEGE ESCALATION : 권한 상승이필요한 경우 선택 - ENABLE PROVISIONING CALLBACKS : awx api를 통해 작업 호출 허용시 선택 - ENABLE WEBHOOK : 웹 후크 사용시 선택 - ENABLE CONCURRENT JOBS : 템플릿 자체의 중복실행 허용시 선택 - ENABLE FACT CACHE : 배포 작업시 팩트 캐쉬를 사용할 경우 선택선택 미선택 미선택 선택 미선택
EXTRA VARIABLES추가로 설정해야할 변수 입력상기 이미지 내용 추가
3. WorkFlow 템플릿 생성방법([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-ps29wzm9.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택 → Workflow Template 선택) 1. 탬플릿 생성 입력화면 2. [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-hmjqsfeh.png)](http://igoni.kr/uploads/images/gallery/2022-09/Ngximage.png) 3. 항목별 상세 설명
**항 목****설 명****비 고**
NAME템플릿 이름필수
DESCRIPTION템플릿 설명옵션
ORGANIZATION템플릿 조직옵션
INVENTORY 템플릿에서 적용할 인벤토리 설정필수
LIMIT 호스트 목록 제한시 입력옵션
SCM BRANCH특정 branch / tag에서 가지고 와와야할 경우 입력옵션
LABELS템플릿을 설명하는 레이블 입력옵션
OPTIONS- ENABLE CONCURRENT JOBS : 템플릿 자체의 중복실행 허용시 선택 - ENABLE WEBHOOK : 웹 후크 사용시 선택선택 미선택
4. 템플릿 설정 1. PERMISSION (Templates → Permission , [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-swmopequ.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택) 1. 템플릿 접근권한 설정 방법 2. 접근할 계정 선택 3. 권한설정 입력 화면 4. [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-bgucivhe.png)](http://igoni.kr/uploads/images/gallery/2022-09/drzimage.png) 5. 권한별 상세 설명
**권 한****설 명**
Admin전체 권한
Execute실행/수정 권한
Read읽기모드 권한 (실행 불가)
2. NOTIFICATIONS 1. 템플릿 알람 수신 방법설정 (Templates → NOTIFICATION) 2. 생성된 notification 방식에 따라 알람 수신여부 설정 3. notification 설정 화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-aebywykp.png)](http://igoni.kr/uploads/images/gallery/2022-09/Bmqimage.png) 4. 항목별 상세 설명
**항목****설 명****비 고**
START템플릿 실행시 알람 전송[![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-jfmfk6hh.png)](http://igoni.kr/uploads/images/gallery/2022-09/PUAimage.png) : 활성화 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-28uwhncr.png)](http://igoni.kr/uploads/images/gallery/2022-09/mKyimage.png) : 비활성화
SUCCESS템플릿이 정상 종료된 경우 전송[![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-7rq0ever.png)](http://igoni.kr/uploads/images/gallery/2022-09/PUAimage.png) : 활성화 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-syoaefre.png)](http://igoni.kr/uploads/images/gallery/2022-09/mKyimage.png) : 비활성화
FAILURE템플릿이 실패한 경우 전송[![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-ycxeyr4r.png)](http://igoni.kr/uploads/images/gallery/2022-09/PUAimage.png) : 활성화 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-ycmyt6xg.png)](http://igoni.kr/uploads/images/gallery/2022-09/mKyimage.png) : 비활성화
3. COMPLETED JOBS 1. 해당 템플릿으로 수행한 작업이력 확인 (Templates → COMPLETED JOBS) 4. SCHEDULES 1. 해당 템플릿을 스케쥴로 수행할 때 선택 2. 스케쥴 생성 방법 (Templates → SCHEDULES, [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-mphkpu8e.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택) 3. 스케쥴 설정 화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-tbrwcts4.png)](http://igoni.kr/uploads/images/gallery/2022-09/ARkimage.png) 4. 항목별 상세 설명
**항 목****설 명****비 고**
NAME스케쥴 이름필수
START DATE시작 날짜필수
START TIME시작 시간필수
LOCAL TIME ZONE지역 시간대0OS에 설정된 시간대역에 맞추어 자동 표시, 수정 가능
REPEAT FREQUENCY반복 빈도 - none : 1회성 - Minute : 분단위 반복 - Hour : 시간단위 반복 - Day : 일 단위 반복 - Week : 주 단위 반복 - Month : 월 단위 반복 - Year : 년 단위 반복필수
Every반복 주기 설정반복설정시 화면에 노출 (필수)
END종료조건 - after : OCCURRENCES 횟수까지 실행 후 종료 - On Date : 특정날짜/시간 까지 실행 후 종료필수
5. EDIT SURVEY 1. 배포 작업시 추가 변수 전달이 필요한 경우 작성 (Templates → ADD SURVEY) 2. 서베이 설정화면 3. [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-ffldbxmw.png)](http://igoni.kr/uploads/images/gallery/2022-09/4lximage.png) 4. 항목별 세부설명
**항 목****설 명****비 고**
PROMPT사용자에 확인할 질문사항필수
DESCRIPTIONprompt에 대한 추가 설명옵션
ANSWER VARIABLE NAMEansible에 전달할 변수 이름필수
ANSWER TYPE답변 유형 선택 - text - textarea - Password - Multiple Choice (single Select) - Multiple Choice (Multiple Select) - integer - Float 일반 문자열 (1줄) 여러줄의 문자열 패스워드 형태 입력시 선택 1개만 선택할 수 있는 리스트 목록 여러개 선택할 수 있는 리스트 목록 숫자값 10진수
MININUM LENGTH최소 문자열text, textarea, password, integer, float 선택시 보임
MAXIMUM LENGTH최대 문자열text, textarea, password, integer, float 선택시 보임
DEFAULT ANSWER기본 항목prompt에 대한 기본값
REQUIRED필수여부선택시 배포작업시 필수항목으로 분류됨
5. 서베이 변경 1. 항목 수정시 : [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-wujspots.png)](http://igoni.kr/uploads/images/gallery/2022-09/vc3image.png) 아이콘 선택 후 항목 변경 후 SAVE 선택 2. 항목 삭제시 : [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-j7qki8fr.png)](http://igoni.kr/uploads/images/gallery/2022-09/Z88image.png) 아이콘 선택 후 삭제 후 SAVE 선택 3. 서베이 자체 삭제시 : DELETE SURVEY 선택 6. WORKFLOW VISUALIZER 1. 템플릿 유형이 workflow인 경우에만 출력하며, WebUI기반에서 생성 (Templates → WORKFLOW VISUALIZER) 2. Workflow 생성 화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-11dioskf.png)](http://igoni.kr/uploads/images/gallery/2022-09/pSTimage.png) 3. Add a NODE 세부 항목
**항 목****설 명****비 고**
Template생성된 템플릿 추가시
Project Sync프로젝트 동기화 시
Inventory Sync인벤토리 동기화 시
Approval작업건 승인여부 확인시webui noti항목에 출력됨
TIMEOUT승인여부 타임아웃 (타임아웃 초과시 거부됨)옵션, 0인 경우 무제한
RUN- Always : 성공 / 실패에 상관없이 계속 실행 - On Success : 앞 작업이 정상적으로 수행된 경우 실행 - On Failure : 앞 작업이 실패된 경우 실행필수, 최초 Node는 Alway만 표기됨
CONVERGENCE- Any : 앞 작업이 하나라도 완료되면 수행 - All : 앞 작업이 모두 완료되면 수행필수, Any가 기본
4. WorkFlow 생성 1. [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-rvugaqvu.png)](http://igoni.kr/uploads/images/gallery/2022-09/en9image.png) : 작업 생성 2. [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-glitzhmu.png)](http://igoni.kr/uploads/images/gallery/2022-09/VZJimage.png) : 기존 FLow(link) 수정 3. [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-kxjevv6i.png)](http://igoni.kr/uploads/images/gallery/2022-09/Ufmimage.png) : 현재 작업 삭제 5. Approval 화면 1. WEBUI 우측 상단 아이콘에 Approval 기능 제공 2. Approval 선택 화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-zjitzmhn.png)](http://igoni.kr/uploads/images/gallery/2022-09/3uMimage.png) 5. Template을 이용한 배포작업 수행 1. 배포수행하려는 템플릿의 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-30runtae.png)](http://igoni.kr/uploads/images/gallery/2022-09/07Gimage.png)아이콘 선택 2. Template별 생성된 서베이에 맞추어 선택후 마지막 PREVIEW 항목 확인 후 Launch 선택 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-gzlhnck2.png)](http://igoni.kr/uploads/images/gallery/2022-09/YC1image.png) 3. 작업결과 확인 (정상종료인 경우 좌측 상단에 STATUS에 Successful )표기 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-zdgpmtxl.png)](http://igoni.kr/uploads/images/gallery/2022-09/Aoximage.png) 4. 오류가 발생하는 경우 : 동일 위치에 FAILED로 표기, FAILED 발생 원인 분석 필요 5. [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-hc2aq1cd.png)](http://igoni.kr/uploads/images/gallery/2022-09/ITximage.png)
### 자격증명 관리 기존에 생성된 인증절차방식 외에 추가할경우 사용 (SSH / winrm / aws 등 대부분 내장된 기능으로 사용가능)
1. 인증정책 관리 (ADMINISTRATION → CREDENTIAL TYPES) 2. 인증절차 생성([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-t2jslu2u.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택) 1. 인증절차 사용자 입력화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-q741twgv.png)](http://igoni.kr/uploads/images/gallery/2022-09/TkVimage.png) 2. 항목별 상세 설명
**항 목****값 설명****비 고**
NAME자격증명 이름필수
DESCRIPTION자격증명 설명옵션
INPUT CONFIGURATION인증시 사용할 필드 구성옵션
INJECTION CONFIGURATION인증시 전달할 환경변수 구성옵션
### 알람관리 AWX에서 수행하는 Template에 대한 알람수신 방법 관리
1. 알람 정책 관리 (ADMINISTRATION → NOTIFICATION TEMPLATES) 2. 알람방법 생성([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-e0cwmfpl.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택) 1. 알람정책 사용자 입력화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-beskptyu.png)](http://igoni.kr/uploads/images/gallery/2022-09/y0pimage.png) 2. 항목별 상세 설명
**항 목****값 설명****비 고**
NAME알람정책 이름필수
DESCRIPTION정책 설명옵션
ORGANIZAION소속 조직필수
TYPE설정가능한 알람리스트 - Email - Grafana - HipChat - IRC - Mattermost - PagerDuty - Rocket.Chat - Slack - Twilio - Webhook필수
CUSTOMIZE MESSAGES메세지 발송시 작성되는 내용 변경시 선택 후 수정옵션
3. 알람설정 1. 이메일 설정 1. 이메일 정책 사용자 입력화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-8nybkkro.png)](http://igoni.kr/uploads/images/gallery/2022-09/W4Timage.png) 2. 항목별 상세설명
**항 목****설 명****비 고**
USERNAME발송계정 이름옵션
PASSWORD발송계정 패스워드옵션
HOST발송서버필수
RECIPIENT LIST수신자필수
SENDER EMAIL발송메일주소필수
PORT메일발송 포트필수
TIMEOUT발송최대 시간(초기준)필수, 최대 120초까지 설정 가능
EMAIL OPTIONSUSE TLS / USE SSL옵션TLS 나 SSL 사용시 선택
2. 그라파나 설정 1. 그라파나 정책 사용자 입력화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-vkd7tw9q.png)](http://igoni.kr/uploads/images/gallery/2022-09/XRGimage.png) 2. 항목별 상세설명
**항 목****설 명****비 고**
GRAFANA URL그라파나 api서비스 url필수
GRAFANA API KEY그라파나에서 할당받은 api key필수
ID OF THE DASHBOARD그라파나 계정에 대해 api키 만들때 고유한 ID로 대쉬보드 설정옵션
ID OF THE PANEL그라파나에서 패널/그래프를 추가한 경우 해당 ID옵션
TAGS FOR THE ANNOTATION이벤트 유형을 기재옵션
DISABLE SSL VERIFICATION그라파나 접속시 SSL 인증서 확인절차 제외 여부옵션
3. 힙챗 1. 힙챗 정책 사용자 입력화면 ㅂ 2. 항목별 상세설명
### 관리작업 Cleanup 작업 관리 (ADMINISTRATION → MANAGEMENT JOBS)
1. Cleanup Activity Stream (활동내역 삭제) 1. 수동 실행 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-hj9oxgdn.png)](http://igoni.kr/uploads/images/gallery/2022-09/o2Oimage.png)) 선택, 기본값은 별도 스케쥴링 없음[![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-3l3tuikk.png)](http://igoni.kr/uploads/images/gallery/2022-09/rooimage.png) 2. 보관기간 입력 후 LAUNCH 선택 3. 스케쥴 등록 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-hxne1mhl.png)](http://igoni.kr/uploads/images/gallery/2022-09/Rjaimage.png))선택, 기본값은 별도 스케쥴링 없음 필요한 스케쥴 등록 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-rm1pauja.png)](http://igoni.kr/uploads/images/gallery/2022-09/KO6image.png) 2. Cleanup Expired OAuth 2 Tokens (만료된 2차 토큰정보 삭제) 1. 수동 실행 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-j4bqgiiv.png)](http://igoni.kr/uploads/images/gallery/2022-09/yaXimage.png)) 2. 스케쥴 등록 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-aormnzhy.png)](http://igoni.kr/uploads/images/gallery/2022-09/Mjrimage.png))선택, 기본값은 별도 스케쥴링 없음 필요한 스케쥴 등록 3. Cleanup Expired Sessions (만료된 인증정보 삭제) 1. 수동 실행 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-tyvvrkxa.png)](http://igoni.kr/uploads/images/gallery/2022-09/yaXimage.png)) 2. 스케쥴 등록 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-vi2zaac5.png)](http://igoni.kr/uploads/images/gallery/2022-09/Mjrimage.png))선택, 기본값은 별도 스케쥴링 없음 필요한 스케쥴 등록 4. Cleanup Job Details (작업 내역 삭제) 1. 수동 실행 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-41s7s6dy.png)](http://igoni.kr/uploads/images/gallery/2022-09/yaXimage.png)) 보관기간 입력 후 LAUNCH 선택 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-cb8rwtwh.png)](http://igoni.kr/uploads/images/gallery/2022-09/Gmcimage.png) 2. 스케쥴 등록 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-i0vkz9bw.png)](http://igoni.kr/uploads/images/gallery/2022-09/Mjrimage.png))선택, 필요한 스케쥴 등록 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-iat2lzi6.png)](http://igoni.kr/uploads/images/gallery/2022-09/6WPimage.png)
### 인스턴스 그룹 인스턴스별 동작방식 및 작업 실행 방식 설정
1. 인스턴스 그룹 관리 (ADMINISTRATION → INSTANCE GROUPS) 2. 인스턴스 그룹 생성([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-8jr9e3zc.png)](http://igoni.kr/uploads/images/gallery/2022-09/mrFimage.png) 버튼 선택 → CREATE INSTANCE GROUP) 1. 사용자 입력 화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-ymupjrjt.png)](http://igoni.kr/uploads/images/gallery/2022-09/xymimage.png) 2. 항목별 세부설명
**항 목****값 설명****비 고**
NAME인스턴스명필수
POLICY INSTANCE MINIMUM그룹내에 유지할 최소 인스턴스 수기본값 : 0
POLICY INSTANCE PERCENTAGE신규 인스턴스가 소속될 있는 최대 가용가능한 인스턴스 수 (백분율)기본값 : 0 (무제한)
3. INSTANCES 설정화면 (다수의 AWX-UI 관리시 사용) [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-w5tz9kao.png)](http://igoni.kr/uploads/images/gallery/2022-09/wugimage.png) 1. 최대로 사용햘 Forks 갯수 설정 4. JOBS 1. 해당 인스턴스에 수행한 Job정보 확인
### AWX-UI 설정 UI기능 설정
1. Authentication 1. Azure / github / Google / LDAP / RADIUS 계정을 통해 로그인시 사용 2. Jobs 1. Ad hoc 을 사용할 수 있는 모듈 구성, 예약 작업 수 설정 가능 2. 설정 화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-ao0vuxsw.png)](http://igoni.kr/uploads/images/gallery/2022-09/LC3image.png) 3. 항목별 상세설명
**항 목****값 설명****비 고**
ANSIBLE MODULES ALLOWED FOR AD HOC JOBS임시작업으로 사용할 수 있는 명령어 종류
JOB EXECUTION PATH작업수행을 위한 임시 경로/tmp
MAXIMUM SCHEDULED JOBS최대 예약작업 갯수10
PATHS TO EXPOSE TO ISOLATED JOBS격리된 작업시 허용되는 경로 (전체 경로 정보 입력필요격리 작업 미사용
PATHS TO HIDE FROM ISOLATED JOBS격리된 작업시 숨길 경로 (전체 경로 정보 입력필요격리 작업 미사용
ENABLE JOB ISOLATION작업 격리기능 사용여부미설정
DEFAULT JOB TIMEOUT최대 작업 시간 (초단위)0(무제한)
DEFAULT INVENTORY UPDATE TIMEOUT최대 인벤토리 업데이트 시간 (초단위)0(무제한)
RUN PROJECT UPDATES WITH HIGHER VERBOSITY프로젝트 업데이트 실행시 자세한 정보 출력미설정
PER-HOST ANSIBLE FACT CACHE TIMEOUT호스트 단위로 팩트캐쉬 시간 (초단위)0(무제한)
PRIMARY GALAXY SERVER URL기본 ANSIBLE-GALAXY URL 변경시 사용galaxy.ansible.com
PRIMARY GALAXY SERVER NAMEprivate galaxy 접근시 사용하는 계정PRIVATE GALAXY 미사용
PRIMARY GALAXY SERVER PASSWORDprivate galaxy 접근시 사용하는 계정 패스워드PRIVATE GALAXY 미사용
PRIMARY GALAXY SERVER TOKENprivate galaxy 접근시 사용하는 토큰정보PRIVATE GALAXY 미사용
PRIMARY GALAXY AUTHENTICATION URLprivate galaxy 접근시 사용하는 인증경로PRIVATE GALAXY 미사용
ALLOW ACCESS TO PUBLIC GALAXY공개된 Galaxy사용여부활성화
ISOLATED HOST KEY CHECKING격리된 호스트 키 확인여부비활성화 격리 작업 미사용
ISOLATED STATUS CHECK INTERVAL격리정보 확인 (초단위)30
ISOLATED LAUNCH TIMEOUT최대 격리된 작업 실행 시간 (초단위)600 격리 작업 미사용
ISOLATED CONNECTION TIMEOUT최대 격리호스트 연결시간 (초단위)10 격리 작업 미사용
ENABLE DETAILED RESOURCE PROFILING ON ALL PLAYBOOK RUNS플래이북 실행시 리소스 프로파일링 설정여부비활성화
EXTRA ENVIRONMENTVARIABLESAWX-UI에서 사용할 추가 환경 변수
ANSIBLE CALLBACK PLUGINSansible에서 사용할 콜백용 플러그인
3. system 1. AWX-UI의 기본URL, URL및 기본 가시정보 설정 2. 설정화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-eylawwtd.png)](http://igoni.kr/uploads/images/gallery/2022-09/iqlimage.png) 3. 항목별 상세설명
**항 목****값 설명****비 고**
BASE URL OF THE TOWER HOSTAWX-UI URL정보
ALL USER VISIBLE TO ORGANIZATION ADMINS관리자가 모든 사용자 확인 가능 여부활성화
ORGANIZATION ADMINS CAN MANAGE USERS AND TEAMS관리자가 사용자 및 팀 관리 허용 여부활성화
IDLE TIME FORCE LOG OUT유휴세션 강제 로그아웃 (초단위)1800
MAXIMUM NUMBER OF SIMULTANEOUS LOGGED IN SESSIONS최대 동시 로그인 세션수-1 (비활성화)
ENABLE HTTP BASIC AUTHHTTP 인증기능 허용여부활성화
ALLOW EXTERNAL USERS TO CREATE OAUTH2 TOKENS외부사용자가 OATUTH2 토큰 생성 허용여부비활성화
LOGIN REDIRECT OVERRIDE URL미로그인 사용자가 로그인 하도록 리다이렉션 URL공란인 경우 기본 로그인 페이지
ACCESS TOKEN EXPIRATION엑세스 토큰 유효기간 (초단위)31536000000
REFRESH TOKEN EXPIRATION토큰 만료시 지속시간 (초단위)2628000
AUTHORIZATION CODE EXPIRATION로그인시 생서되는 인증코드 유효기간 (초단위)600
REMOTE HOST HEADER원격 호스트 IP / 호스트이름 추가기본값 : REMOTE\_ADDR, REMOTE\_HOST 리버스 프록시ip가 있는 경우 HTTP\_X\_FORWARDED\_FOR 추가
CUSTOM VIRTUAL ENVIRONMENT PATHS가상의 환경값 설정 경로비활성화
GATHER DATA FOR AUTOMATION ANAYTICSAWX-UI에서 수집된 데이터를 Redhat으로 전달비활성화
RED HAT CUSTOMER USERNAMEredhat 고객 IDRedhat과 별도 계약시 사용가능
RED HAT CUSTOMER PASSWORDredhat 고객 passwordRedhat과 별도 계약시 사용가능
AUTOMATION ANALYTICS UPLOAD URL자동화 분석을 위한 업로드 URL자동화 분석 미사용
AUTOMATION ANALYTICS GATHER INTERVAL자동화 분석을 위한 수집간격자동화 분석 미사용
4. User Interface 1. API-UI 기능 설정 2. 설정 화면 [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-yc7o0rnr.png)](http://igoni.kr/uploads/images/gallery/2022-09/AtKimage.png) 3. 항목별 상세설명
**항 목****설 명****비 고**
USER ANALYTICS TRACKING STATE사용자 분석 추적기능 활성화미사용
CUSTOM LOGO사용자 로그인시 노출될 이미지필요시 이미지 추가
CUSTOM LOGIN INFO로그인시 추가 텍스트 입력필요시 입력
# 10 - 데이터 백업/복구
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/7G6image.png)](http://igoni.kr/uploads/images/gallery/2025-06/7G6image.png)
perplexity에서 생성한 AI이미지
1. AWX 데이터 백업 ```bash $> tower-cli receive --all > backup.json ``` 2. AWX 데이터 복구 ```bash $> tower-cli send --insecure aps_ui.json ``` 3. 복구시 주의사항 1. 데이터 복구 절차는 credential, project, job template, workflow template 순으로 복구가 되어야 함. 순서가 어긋나는경우 참조할 수 있는 정보가 없다는 에러메시지 출력. (2~3차례 retry 하면 되기는 함) 2. Tower-cli로 복구하는경우 패스워드 필드는 $encrypted$ 문자열 그대로 복구가 되기 때문에, 백업파일에서 Description된 문자열을 적용해주어야 함 3. job template 이름에 한글이 포함된경우 인코딩 에러가 나면서 복구 불가능함. # 11-Foreman와 Ansible
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/LhTimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/LhTimage.png)
perplexity에서 생성한 AI이미지
#### 사전정보 1. Ansible core는 cli기반의 기능만 제공하고 있고, web ui는 제공하지 않음 2. Redhat에서는 Ansible Tower라는 상용 제품이 있긴 하지만, 가격이 매우 비쌈 3. Opensource기반에서는 AWX를 사용하면 되는데, AWX는 컨테이너 기반의 솔루션이라 컨테이너의 환경을 도입하기 어려운 곳에서 Foreman을 사용해서 ansible을 연동 #### 설치구성 1. foreman 설치를 위한 리포지터리 구성 ``` $ yum -y install https://yum.puppet.com/puppet6-release-el-7.noarch.rpm $ yum-config-manager --enable extras $ yum -y install epel-release centos-release-scl-rh $ curl https://yum.theforeman.org/releases/2.5/el7/x86_64/foreman-release.rpm -O $ yum install ./foreman-release.rpm ``` 2. foreman 패키지 설치 ``` $ yum install foreman foreman-installer -y $ foreman-installer 2021-06-24 10:53:34 [NOTICE] [root] Loading installer configuration. This will ta 2021-06-24 10:53:38 [NOTICE] [root] Running installer with log based terminal out 2021-06-24 10:53:38 [NOTICE] [root] Use -l to set the terminal output log level t, or DEBUG. See --full-help for definitions. 2021-06-24 10:53:41 [NOTICE] [configure] Starting system configuration. 2021-06-24 10:54:52 [NOTICE] [configure] 250 configuration steps out of 1334 steps complete. 2021-06-24 10:55:23 [NOTICE] [configure] 500 configuration steps out of 1336 steps complete. 2021-06-24 10:55:35 [NOTICE] [configure] 750 configuration steps out of 1347 steps complete. 2021-06-24 10:59:24 [NOTICE] [configure] 1000 configuration steps out of 1357 steps complete. 2021-06-24 11:01:15 [NOTICE] [configure] 1250 configuration steps out of 1357 steps complete. 2021-06-24 11:01:24 [NOTICE] [configure] System configuration has finished. Executing: foreman-rake upgrade:run `/usr/share/foreman` is not writable. Bundler will use `/tmp/bundler20210624-32690-b2erjo32690' as your home directory temporarily. Success! * Foreman is running at https://1.2.3.4 Initial credentials are admin / 1234 * Foreman Proxy is running at https://1234:8443 The full log is at /var/log/foreman-installer/foreman.log ``` 3. webui 로그인 - [https://1.2.3.4](https://1.2.3.4) (계정명은 상단 credentials 정보 확인) [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/scaled-1680-/qhcimage.png)](http://igoni.kr/uploads/images/gallery/2024-01/qhcimage.png) #### Foreman과 ansible연동 1. foreman이 설치된곳에 ansible 설치 - [3- ansible 설치하기](http://igoni.kr/books/5-iac/page/3-ansible) 2. ansible에 foreman 연동 ``` $ vi /etc/ansible/ansible.cfg [defaults] ... callback_whitelist = foreman ... [callback_foreman] url = https://skb-djk-master-1.cluster.local ssl_cert = /etc/puppetlabs/puppet/ssl/certs/skb-djk-master-1.cluster.local.pem ssl_key = /etc/puppetlabs/puppet/ssl/private_keys/skb-djk-master-1.cluster.local.pem verify_certs = /etc/puppetlabs/puppet/ssl/certs/ca.pem ``` 3. foreman에 ansible 연동 ``` $ foreman-installer --enable-foreman-plugin-ansible --enable-foreman-proxy-plugin-ansible $ foreman-installer --enable-foreman-plugin-remote-execution --enable-foreman-proxy-plugin-remote-execution-ssh ``` # 12-awx구동시 AWX Upgrading 무한반복 출력 해결방법 ### 사전작업 1. AWX 설치 - [6 - AWX 설치절차](http://igoni.kr/books/5-iac/page/6-awx)
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/inRimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/inRimage.png)
perplexity에서 생성한 AI이미지
### 발생현상 및 조치방법 1. AWX 설치 후 웹 UI 접근시 아래메시지창이 수십분이 흘러도 계속 출력함 ![](https://blog.kakaocdn.net/dn/VAwV8/btrOQh7Yy3M/KW99MyzulWJnabH4sJ3bv0/img.png) 2. 컨테이너 로그 확인시 아래메시지 지속 출력 ``` #> docker logs awx_task The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/conf/settings.py", line 76, in _ctit_db_wrapper yield File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/conf/settings.py", line 413, in __getattr__ value = self._get_local(name) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/conf/settings.py", line 356, in _get_local setting = Setting.objects.filter(key=name, user__isnull=True).order_by('pk').first() File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/models/query.py", line 653, in first for obj in (self if self.ordered else self.order_by('pk'))[:1]: File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/models/query.py", line 274, in __iter__ self._fetch_all() File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/models/query.py", line 1242, in _fetch_all self._result_cache = list(self._iterable_class(self)) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/models/query.py", line 55, in __iter__ results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1138, in execute_sql cursor = self.connection.cursor() File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/base/base.py", line 256, in cursor return self._cursor() File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/base/base.py", line 233, in _cursor self.ensure_connection() File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/base/base.py", line 217, in ensure_connection self.connect() File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/utils.py", line 89, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/base/base.py", line 217, in ensure_connection self.connect() File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/base/base.py", line 195, in connect self.connection = self.get_new_connection(conn_params) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/postgresql/base.py", line 178, in get_new_connection connection = Database.connect(**conn_params) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/psycopg2/__init__.py", line 126, in connect conn = _connect(dsn, connection_factory=connection_factory, **kwasync) django.db.utils.OperationalError: could not connect to server: Connection refused Is the server running on host "postgres" (172.18.0.2) and accepting TCP/IP connections on port 5432? ``` 3. AWX관련 전체 컨테이너 중지 ``` #> docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 33de793adbef ansible/awx:14.1.0 "/usr/bin/tini -- /u…" 23 minutes ago Up 23 minutes 8052/tcp awx_task 175225136ee7 ansible/awx:14.1.0 "/usr/bin/tini -- /b…" 23 minutes ago Up 23 minutes 0.0.0.0:8080->8052/tcp awx_web 0ee6f7788971 postgres:10 "docker-entrypoint.s…" 23 minutes ago Up 23 minutes 0.0.0.0:5432->5432/tcp awx_postgres 6a265ef642ec redis "docker-entrypoint.s…" 23 minutes ago Up 23 minutes 6379/tcp awx_redis #> docker stop 33de793adbef 175225136ee7 0ee6f7788971 6a265ef642ec ``` 4. AWX전체 컨테이너 재기동 ``` #> cd /home/awx/awxcompose #> docker-compose up -d Creating awx_postgres ... done Creating awx_redis ... done Creating awx_web ... done Creating awx_task ... done ``` 5. AWX Task 컨테이너 로그 재 확인 ``` #> docker logs awx_task Using /etc/ansible/ansible.cfg as config file 127.0.0.1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "elapsed": 0, "match_groupdict": {}, "match_groups": [], "path": null, "port": 15432, "search_regex": null, "state": "started" } Using /etc/ansible/ansible.cfg as config file 127.0.0.1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "db": "awx" } 2020-11-24 06:59:48,589 INFO rbac_migrations Computing role roots.. 2020-11-24 06:59:48,591 INFO rbac_migrations Found 0 roots in 0.000689 seconds, rebuilding ancestry map 2020-11-24 06:59:48,591 INFO rbac_migrations Rebuild ancestors completed in 0.000013 seconds 2020-11-24 06:59:48,591 INFO rbac_migrations Done. 2020-11-24 06:59:52,929 INFO rbac_migrations Computing role roots.. 2020-11-24 06:59:52,931 INFO rbac_migrations Found 0 roots in 0.000256 seconds, rebuilding ancestry map 2020-11-24 06:59:52,931 INFO rbac_migrations Rebuild ancestors completed in 0.000008 seconds 2020-11-24 06:59:52,932 INFO rbac_migrations Done. ```