# 5. 자동화/IaC

# Ansible 기술정보

# 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에 대한 포스팅을 진행하고자 합니다.

<table border="1" id="bkmrk-perplexity-%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/1DXimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/1DXimage.png)

</td></tr><tr><td class="align-right">perplexity 에서 생성한 AI이미지</td></tr></tbody></table>

왜? Ansible로 진행한 이유는….

1. Opensource라서.. (License는 GPL 정책을 따릅니다.)
2. Windows / Linux / Network까지 두루두루 사용할 수 있어서  
    (Windows은 WinRM이라는 기능으로 접근하고 나머지는 ssh기반으로 접근해서 사용합니다.)
3. AWX라는 별도의 Opensource을 이용해 WebUI기능이 제공되기 때문에…

이런 사유로 puppet이나 Chef를 사용하지 않고 Ansible로 진행을 하게 되었습니다.

<div class="wikimodel-emptyline" id="bkmrk-">  
</div>Ansible은 2015년에 Redhat에서 인수한뒤 <span class="wikiexternallink">[https://www.ansible.com/](https://www.ansible.com/)</span> 에서 관리하고 있어요.

# 2- Ansible 기본구조

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; font-size: 14px; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/3JVimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/3JVimage.png)</td></tr><tr><td class="align-right">perplexity에서 생성한 AI이미지</td></tr></tbody></table>

1. Redhat기준으로 Ansible 구성은 이렇게 되어 있습니다.  
    <table border="1"><colgroup><col></col><col></col><col></col></colgroup><thead><tr><td>컴포넌트명</td><td>비 용</td><td>OSS Project</td></tr></thead><tbody><tr><td>Ansible Core</td><td>Free</td><td>Ansible [https://github.com/ansible/ansible](https://web.archive.org/web/20210418122625/https://github.com/ansible/ansible)</td></tr><tr><td>Ansible Tower</td><td>Commercial</td><td>AWX [https://github.com/ansible/awx](https://web.archive.org/web/20210418122625/https://github.com/ansible/awx)</td></tr></tbody></table>
2. Ansible에서 사용하는 용어를 정리하면...  
    <table border="1" style="border-collapse: collapse;"><colgroup><col style="width: 50.0671%;"></col><col style="width: 50.0671%;"></col></colgroup><thead><tr><td class="align-center">**구성정보**</td><td class="align-center">**용 도**</td></tr></thead><tbody><tr><td>inventory</td><td>배포 대상 정보가 기록된 정보</td></tr><tr><td>playbook  
    – role  
    – task  
    – template  
    – vars</td><td>배포시 사용하는 배포코드  
    – 여러가지 배포업무가 수행될때 나눌 수 있는 리스트  
    – 배포 업무 수행  
    – 설정파일같은 템플릿화된 파일을 배포시 사용  
    – 배포코드 작성시 등록한 변수리스트</td></tr></tbody></table>
3. 프로비저닝 대상서버 접근 방식  
    <table border="1" style="border-collapse: collapse;"><colgroup><col style="width: 22.0134%;"></col><col style="width: 25.2608%;"></col><col style="width: 52.5915%;"></col></colgroup><thead><tr><td class="align-center">**Target OS**</td><td class="align-center">**접근방식 / 기본포트**</td><td class="align-center">**추가 설명**</td></tr></thead><tbody><tr><td>Windows</td><td>WinRM / tcp/5986</td><td>Windows장비가 winrm 접근할 수 있게 설정되어 있어야 함  
    Windows7 이상부터 사용가능</td></tr><tr><td>Linux / Switch</td><td>ssh / tcp/22</td><td>Telnet은 지원하지 않음</td></tr></tbody></table>

# 3- ansible 설치하기

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/3R2image.png)](http://igoni.kr/uploads/images/gallery/2025-06/3R2image.png)

</td></tr><tr><td class="align-right">perplexity에서 생성한 AI이미지</td></tr></tbody></table>

1. yum으로 설치하기 ```shell
    $> yum install epel-release -y
    $> yum install ansible -y
    ```
2. pip으로 설치하기 ```shell
    $> pip install ansible
    ```

# 4- Ansible inventory 작성하기

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/wiTimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/wiTimage.png)

</td></tr><tr><td class="align-right">perplexity에서 생성한 AI이미지</td></tr></tbody></table>

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작성하기

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/wLCimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/wLCimage.png)

</td></tr><tr><td class="align-right">perplexity에서 생성한 AI이미지</td></tr></tbody></table>

지난번에는 에서 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

```

<div class="box" id="bkmrk-%23apache-%EA%B7%B8%EB%A3%B9%EC%97%90-%EB%93%B1%EB%A1%9D%EB%90%9C-%EC%84%9C%EB%B2%84%EB%93%A4-"><div class="code"><div class="linenoswrapper"><div>  
</div><div>  
</div><div>\#apache 그룹에 등록된 서버들 작업수행  
</div></div></div></div><div class="box" id="bkmrk-"><div class="box"><div class="code"><div class="linenoswrapper"><div class="linenos">  
</div><div>  
</div></div></div></div></div>```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

```

<div class="box" id="bkmrk-%23-%2Fhome%2Fansible%2Finve"><div class="code"><div class="linenoswrapper"><div>\# /home/ansible/inventory에 구성된 인벤토리를 가지고 /home/ansible/playbook.yml 파일에 구성된 작업절차를 수행하겠다는 Command 입니다.  
</div></div></div></div>배포코드 작성시 유의사항

- playbook은 yml 포맷으로 작성하기 때문에 tree구조를 띄어쓰기로 인식합니다 (탭키 인식 안함)  
    상 / 하위 개념 적용을 위해 띄어쓰기 잘 해주세요.
- 작성된 예시코드는 ansible 2.9버전의 코드입니다. 2.10버전 이후부터는 문법이 바뀌었습니다. (https://docs.ansible.com/ansible/latest/ 참고)

# 6 - AWX 설치절차

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/hZ8image.png)](http://igoni.kr/uploads/images/gallery/2025-06/hZ8image.png)</td></tr><tr><td class="align-right">perplexity에서 생성한 AI이미지</td></tr></tbody></table>

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
        ```
        
        <div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl" style="padding-left: 40px;"><div style="padding-left: 40px;"><div class="syntaxhighlighter sh-emacs nogutter  bash" id="bkmrk-" style="padding-left: 40px;"></div></div></div></div>
    - 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
        ...
        ```
        
        <div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl" style="padding-left: 40px;"><div style="padding-left: 40px;"><div class="syntaxhighlighter sh-emacs nogutter  bash" id="bkmrk--0" style="padding-left: 40px;"></div></div></div></div>
    - AWX 설치
        
        ```shell
        $> ansible-playbook -i inventory  install.yml
        ```
        
        <div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl" style="padding-left: 40px;"><div style="padding-left: 40px;"><div class="syntaxhighlighter sh-emacs nogutter  bash" id="bkmrk--1" style="padding-left: 40px;"></div></div></div></div>
    - 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
        ```
        
        <div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl" style="padding-left: 40px;"><div style="padding-left: 40px;"><div class="syntaxhighlighter sh-emacs nogutter  bash" id="bkmrk--2" style="padding-left: 40px;"></div></div></div></div>
    - postgres vacuum 설정 (postgres data 관리를 위한 설정)
        
        ```shell
        $> vi /data/awx/pgdocker/10/data/postgresql.conf
        ...
        track_counts = on
        autovacuum = on
        ...
         
        설정 후 awx_postgres 컨테이너 재기동 필요
        ```
        
        <div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-name="code"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-rdark nogutter  bash" id="bkmrk--3"></div></div></div></div>
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 기능 확인가능

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="border-collapse: collapse; width: 99.0476%; height: 563px;"><colgroup><col style="width: 100%;"></col></colgroup><tbody><tr style="height: 635.891px;"><td style="height: 635.891px;">[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/L0Mimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/L0Mimage.png)

</td></tr><tr style="height: 29.7969px;"><td class="align-right" style="height: 29.7969px;">perplexity에서 생성한 AI이미지</td></tr></tbody></table>


## 사전작업

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이라는 이름으로 역활을 나누어서 배포할 수 있습니다.

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/02Dimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/02Dimage.png)

</td></tr><tr><td class="align-right">perplexity에서 생성한 AI이미지</td></tr></tbody></table>

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 --&gt; 배포하는 yml파일
        2. roles --&gt; role 디렉토리
        3. roles/os/linux/setup/task/ --&gt; OS프로비져닝 하기 위한 플레이북 (default는 해당경로의 main.yml 파일을 실행)
        4. roles/os/linux/setup/templates/ --&gt; 해당 role에 templates 배포할떄 사용하는 디렉토리
        5. roles/os/linux/setup/vars/ --&gt; 해당 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 사용메뉴얼

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="border-collapse: collapse; width: 100%; height: 1282.19px;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr style="height: 1252.39px;"><td style="height: 1252.39px;">[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/2wVimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/2wVimage.png)

</td></tr><tr style="height: 29.7969px;"><td class="align-right" style="height: 29.7969px;">perplexity에서 생성한 AI이미지</td></tr></tbody></table>


### 대쉬보드

<div class="page-content" id="bkmrk-awx%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%9B%84-%EC%B2%AB-%ED%8E%98%EC%9D%B4%EC%A7%80%2C-%EC%9E%91%EC%97%85%EC%83%81%ED%83%9C"><div dir="auto">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)

</div></div>### 최근 실행 작업

<div class="page-content" id="bkmrk-%EC%B5%9C%EA%B7%BC%EC%97%90-%EC%8B%A4%ED%96%89%ED%95%9C-%ED%85%9C%ED%94%8C%EB%A6%BF%EC%9D%98-%EC%9A%94%EC%95%BD%EC%A0%95%EB%B3%B4-%ED%99%95%EC%9D%B8"><div dir="auto">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) : 작업이력 삭제

</div></div>### 스케쥴 확인

<div class="page-content" id="bkmrk-%EC%8A%A4%EC%BC%80%EC%A5%B4%EB%A7%81-%EC%84%A4%EC%A0%95%EB%90%9C-%EC%9E%91%EC%97%85-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%28acc"><div dir="auto">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. 스케쥴 작업 관리 (왼쪽에서부터) <table border="1" class="confluenceTable" data-ke-align="alignLeft" style="border-collapse: collapse; border-width: 1px;"><colgroup><col></col><col></col></colgroup><thead><tr><td class="confluenceTh" style="text-align: center;">**항목**</td><td class="confluenceTh" style="text-align: center;">**설 명**</td></tr></thead><tbody><tr><td class="confluenceTd">활성화</td><td class="confluenceTd">체크+파란색 아이콘 : 활성화 체크X + 회색 아이콘 : 비활성화</td></tr><tr><td class="confluenceTd">NAME</td><td class="confluenceTd">스케쥴 이름</td></tr><tr><td class="confluenceTd">TYPE</td><td class="confluenceTd">Template 유형</td></tr><tr><td class="confluenceTd">NEXT RUN</td><td class="confluenceTd">다음 실행 시간 (빈칸일 경우 스케쥴링 실행되지 않음)</td></tr><tr><td class="confluenceTd">ACTION</td><td class="confluenceTd">[![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): 스케쥴 정보 삭제</td></tr></tbody></table>

</div></div>## 관리 메뉴

### <span style="letter-spacing: -0.006em;">조직관리</span>

<div class="page-content" id="bkmrk-%EC%82%AC%EC%9A%A9%EC%9E%90-%2F-%ED%8C%80-%2F-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%2F-%EC%9D%B8%EB%B2%A4%ED%86%A0"><div dir="auto">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. 항목별 상세설명 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="height: 116px; width: 98.3572%;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><thead><tr><td class="confluenceTh align-center">**항 목**</td><td class="confluenceTh align-center">**값 설명**</td><td class="confluenceTh align-center">**비 고**</td></tr></thead><tbody><tr><td class="confluenceTd">NAME</td><td class="confluenceTd">조직이름</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">DESCRIPTION</td><td class="confluenceTd">조직에 대한 설명</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">INSTANCE GROUPS</td><td class="confluenceTd">인스턴스 그룹</td><td class="confluenceTd">옵션</td></tr></tbody></table>
4. 조직 관리 
    1. USERS : 조직에 소속시킬 사용자 (계정명 선택)
    2. PERMISSIONS : 조직의 권한설정 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="height: 272px; width: 98.2159%;"><colgroup><col style="width: 49.9281%;"></col><col style="width: 49.9281%;"></col></colgroup><thead><tr><td class="confluenceTh" style="text-align: center;">**항 목**</td><td class="confluenceTh" style="text-align: center;">**설 명**</td></tr></thead><tbody><tr><td class="confluenceTd">Admin</td><td class="confluenceTd">전체 권한 부여</td></tr><tr><td class="confluenceTd">Execute</td><td class="confluenceTd">프로젝트 실행만 가능</td></tr><tr><td class="confluenceTd">Project Admin</td><td class="confluenceTd">프로젝트 생성 / 수정 / 읽기 가능</td></tr><tr><td class="confluenceTd">Inventory Admin</td><td class="confluenceTd">인벤토리 생성 / 수정 / 읽기 가능</td></tr><tr><td class="confluenceTd">Credential Admin</td><td class="confluenceTd">자격증명 생성 / 수정 / 읽기 가능</td></tr><tr><td class="confluenceTd">Workflow Admin</td><td class="confluenceTd">워크 플로우 생성</td></tr><tr><td class="confluenceTd">Notification Admin</td><td class="confluenceTd">알림 할당</td></tr><tr><td class="confluenceTd">Auditor</td><td class="confluenceTd">읽기 전용 권한</td></tr><tr><td class="confluenceTd">Member</td><td class="confluenceTd">템플릭을 제외한 모든 기능 읽기 가능</td></tr><tr><td class="confluenceTd">Read</td><td class="confluenceTd">읽기 전용 권한</td></tr></tbody></table>
    3. NOTIFICATIONS : 알람정책 관리 : 알람생성은 ( {{ 참조 }} )

</div></div>### 사용자 관리

<div class="page-content" id="bkmrk-awx%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%98%EB%8A%94-%EC%82%AC%EC%9A%A9%EC%9E%90%EC%9D%98-%EA%B4%80%EB%A6%AC-%28-"><div dir="auto">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. 항목별 상세 설명 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="height: 260px; width: 99.4877%;"><colgroup><col style="width: 33.2386%;"></col><col style="width: 33.2386%;"></col><col style="width: 33.2386%;"></col></colgroup><thead><tr><td class="confluenceTh" style="text-align: center;">**항 목**</td><td class="confluenceTh" style="text-align: center;">**값 설명**</td><td class="confluenceTh" style="text-align: center;">**비 고**</td></tr></thead><tbody><tr><td class="confluenceTd">FIRST NAME</td><td class="confluenceTd">사용자 이름 정보</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">LAST NAME</td><td class="confluenceTd">사용자 이름 정보</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">ORGANIZATION</td><td class="confluenceTd">계정 소속 조직</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">EMAIL</td><td class="confluenceTd">해당 계정 이메일주소</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">USERNAME</td><td class="confluenceTd">계정명</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">PASSWORD</td><td class="confluenceTd">계정 패스워드</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">CONFIRM PASSWORD</td><td class="confluenceTd">계정 패스워드 확인</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">USER TYPE</td><td class="confluenceTd">계정 권한</td><td class="confluenceTd">옵션</td></tr></tbody></table>
3. 사용자 관리   
    
    1. USER TYPE별 권한 정보 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="width: 99.3464%; height: 99.3907px;"><colgroup><col style="width: 32.5592%;"></col><col style="width: 67.4441%;"></col></colgroup><thead><tr style="height: 10px;"><td class="confluenceTh" style="text-align: center; height: 10px;">**권한명**</td><td class="confluenceTh" style="text-align: center; height: 10px;">**설 명**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Normal User</td><td class="confluenceTd" style="height: 29.7969px;">사용이 제한된 권한, 권한 정책에 따라 읽기/쓰기 가능</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">System Auditor</td><td class="confluenceTd" style="height: 29.7969px;">모든 속성에 대해 읽기 권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">System Administrator</td><td class="confluenceTd" style="height: 29.7969px;">모든 속성에 대해 읽기/쓰기 권한 (= superuser)</td></tr></tbody></table>

</div></div>### 팀 관리

<div class="page-content" id="bkmrk-%EC%82%AC%EC%9A%A9%EC%9E%90-%2F-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%C2%A0-%EA%B6%8C%ED%95%9C%EC%9D%84-%EC%84%A4%EC%A0%95%ED%95%A0-"><div dir="auto">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. 항목별 상세설명 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="height: 84px; width: 99.3464%;"><colgroup><col style="width: 33.2859%;"></col><col style="width: 33.2859%;"></col><col style="width: 33.2859%;"></col></colgroup><thead><tr><td class="confluenceTh align-center">**항 목**</td><td class="confluenceTh align-center">**값 설명**</td><td class="confluenceTh align-center">**비 고**</td></tr></thead><tbody><tr><td class="confluenceTd">NAME</td><td class="confluenceTd">팀 이름</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">DESCRIPTION</td><td class="confluenceTd">팀 설명</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">ORGANIZAION</td><td class="confluenceTd">소속된 조직</td><td class="confluenceTd">필수</td></tr></tbody></table>
3. 팀 관리 
    1. USER : 팀 소속 사용자
    2. PERMISSION : 템플릿 / 워크플로우 / 프로젝트 / 인벤토리 / 인증 / 조직별 권한 설정  
        
        1. 템플릿 권한 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="width: 101.307%; height: 99.3907px;"><colgroup><col style="width: 25.1852%;"></col><col style="width: 74.8148%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="confluenceTh" style="text-align: center; height: 29.7969px;">**항 목**</td><td class="confluenceTh" style="text-align: center; height: 29.7969px;">**설 명**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Admin</td><td class="confluenceTd" style="height: 29.7969px;">선택한 템플릿의 전체 권한</td></tr><tr style="height: 10px;"><td class="confluenceTd" style="height: 10px;">Execute</td><td class="confluenceTd" style="height: 10px;">선택한 템플릿의 실행 / 점검권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Read</td><td class="confluenceTd" style="height: 29.7969px;">선택한 템플릿의 읽기 권한</td></tr></tbody></table>
        2. 워크플로우 권한 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="height: 148.984px; width: 99.9626%;"><colgroup><col style="width: 25.1473%;"></col><col style="width: 74.855%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="confluenceTh align-center" style="height: 29.7969px;">**항 목**</td><td class="confluenceTh align-center" style="height: 29.7969px;">**설 명**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Admin </td><td class="confluenceTd" style="height: 29.7969px;">선택한 템플릿의 전체 권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Execute </td><td class="confluenceTd" style="height: 29.7969px;">선택한 템플릿의 실행 / 점검 권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Read </td><td class="confluenceTd" style="height: 29.7969px;">선택한 템플릿의 읽기 권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Approve</td><td class="confluenceTd" style="height: 29.7969px;">작업승인여부 관리</td></tr></tbody></table>
        3. 프로젝트 권한 <table class="relative-table confluenceTable wrapped" data-ke-align="alignLeft" style="width: 100.112%; height: 41px;"><colgroup><col style="width: 25.2847%;"></col><col style="width: 74.6779%;"></col></colgroup><thead><tr><td class="confluenceTh" style="text-align: center;">**항 목**</td><td class="confluenceTh" style="text-align: center;">**설 명**</td></tr></thead><tbody><tr><td class="confluenceTd">Admin </td><td class="confluenceTd">선택한 프로젝트의 전체 권한</td></tr><tr><td class="confluenceTd">Execute </td><td class="confluenceTd">선택한 프로젝트의 설정 / 점검권한</td></tr><tr><td class="confluenceTd">Read </td><td class="confluenceTd">선택한 프로젝트의 읽기 권한</td></tr></tbody></table>
        4. 인벤토리 권한 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="width: 99.6638%; height: 100px;"><colgroup><col style="width: 25.6664%;"></col><col style="width: 74.3336%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="confluenceTh align-center" style="height: 29.7969px;">**항 목**</td><td class="confluenceTh align-center" style="height: 29.7969px;">**설 명**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Admin </td><td class="confluenceTd" style="height: 29.7969px;">선택한 인벤토리의 전체권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Update </td><td class="confluenceTd" style="height: 29.7969px;">인벤토리 업데이트 권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Ad Hoc</td><td class="confluenceTd" style="height: 29.7969px;">임시명령 (ping, win\_ping 등) 실행 가능 권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Use </td><td class="confluenceTd" style="height: 29.7969px;">인벤토리 사용 권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Read </td><td class="confluenceTd" style="height: 29.7969px;">인벤토리 읽기 권한</td></tr></tbody></table>
        5. 조직 권한 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="height: 278.172px; width: 99.9626%;"><colgroup><col style="width: 26.0849%;"></col><col style="width: 73.9175%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="confluenceTh" style="text-align: center; height: 29.7969px;">**항 목**</td><td class="confluenceTh" style="text-align: center; height: 29.7969px;">**설 명**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Execute</td><td class="confluenceTd" style="height: 29.7969px;">실행 / 점검 권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Project Admin</td><td class="confluenceTd" style="height: 29.7969px;">프로젝트 생성 / 수정 / 읽기 가능</td></tr><tr style="height: 10px;"><td class="confluenceTd" style="height: 10px;">Inventory Admin</td><td class="confluenceTd" style="height: 10px;">인벤토리 생성 / 수정 / 읽기 가능</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Credential Admin</td><td class="confluenceTd" style="height: 29.7969px;">자격증명 생성 / 수정 / 읽기 가능</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Workflow Admin</td><td class="confluenceTd" style="height: 29.7969px;">워크 플로우 생성</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Notification Admin</td><td class="confluenceTd" style="height: 29.7969px;">알림 할당</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Job Template Admin</td><td class="confluenceTd" style="height: 29.7969px;">템플릿 관리 권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Auditor</td><td class="confluenceTd" style="height: 29.7969px;">읽기 전용 권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Read</td><td class="confluenceTd" style="height: 29.7969px;">읽기 전용 권한</td></tr></tbody></table>

</div></div>## <span style="color: #000000;">인증정보</span>

<div class="page-content" id="bkmrk-awx-%EC%82%AC%EC%9A%A9%EC%97%90-%ED%95%84%EC%9A%94%ED%95%9C-%EA%B3%84%EC%A0%95%EC%A0%95%EB%B3%B4-%28re"><div dir="auto">1. <span style="color: #000000;">AWX 사용에 필요한 계정정보 (RESOURCES → Credentials)</span>
2. <span style="color: #000000;"><span style="color: #000000;">인증정보 생성 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-4imidkd8.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png)</span></span> 버튼 선택) 
    1. <span style="color: #000000;">Machine 타입으로 인증생성 입력화면</span>  
        [![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. <span style="color: #000000;">항목별 상세설명</span>  
          
        <table class="confluenceTable" data-ke-align="alignLeft" style="width: 100.477%; height: 249px;"><colgroup><col style="width: 48.622%;"></col><col style="width: 42.3228%;"></col><col style="width: 9.05512%;"></col></colgroup><thead><tr><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">항 목</span>**</td><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">설 명</span>**</td><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">비 고</span>**</td></tr></thead><tbody><tr><td class="confluenceTd"><span style="color: #000000;">NAME </span></td><td class="confluenceTd"><span style="color: #000000;">계정이름</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">DESCRIPTION </span></td><td class="confluenceTd"><span style="color: #000000;">계정설명</span></td><td class="confluenceTd"><span style="color: #000000;">옵션</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">ORGANIZATION </span></td><td class="confluenceTd"><span style="color: #000000;">소속 조직</span></td><td class="confluenceTd"><span style="color: #000000;">옵션</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">CREDENTIAL TYPE (Machine )</span></td><td class="confluenceTd"><span style="color: #000000;">winrm / ssh 등 장비로그인시 사용</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">USERNAME </span></td><td class="confluenceTd"><span style="color: #000000;">실제 로그인하는 계정명</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">비밀번호 </span></td><td class="confluenceTd"><span style="color: #000000;">로그인시 사용하는 패스워드</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">PRIVILEGE ESCALATION METHOD</span></td><td class="confluenceTd"><span style="color: #000000;">상위 계정(root)을 권한 상승 방식</span></td><td class="confluenceTd"><span style="color: #000000;">옵션</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">PRIVILEGE ESCALATION USERNAME</span></td><td class="confluenceTd"><span style="color: #000000;">권한상승시 필요한 계정</span></td><td class="confluenceTd"><span style="color: #000000;">옵션</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">PRIVILEGE ESCALATION PASSWORD</span></td><td class="confluenceTd"><span style="color: #000000;">권한 상승하기 위한 패스워드 입력</span></td><td class="confluenceTd"><span style="color: #000000;">옵션</span></td></tr></tbody></table>
    3. <span style="color: #000000;">Source control 타입으로 인증생성 입력화면</span>  
        [![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. <span style="color: #000000;">항목별 상세설명</span><table class="confluenceTable" data-ke-align="alignLeft" style="height: 167px; width: 100.053%;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><thead><tr><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">항 목</span>**</td><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">설 명</span>**</td><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">비 고</span>**</td></tr></thead><tbody><tr><td class="confluenceTd"><span style="color: #000000;">NAME </span></td><td class="confluenceTd"><span style="color: #000000;">계정이름</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">DESCRIPTION </span></td><td class="confluenceTd"><span style="color: #000000;">계정설명</span></td><td class="confluenceTd"><span style="color: #000000;">옵션</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">ORGANIZATION </span></td><td class="confluenceTd"><span style="color: #000000;">소속 조직</span></td><td class="confluenceTd"><span style="color: #000000;">옵션</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">CREDENTIAL TYPE (Machine )</span></td><td class="confluenceTd"><span style="color: #000000;">Git / subversion 로그인시 사용</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">USERNAME </span></td><td class="confluenceTd"><span style="color: #000000;">실제 로그인하는 계정명</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr></tbody></table>
    5.

</div></div>### <span style="color: #000000;">프로젝트</span>

<div class="page-content" id="bkmrk-playbook%EC%9D%B4-%EC%A0%80%EC%9E%A5%EB%90%9C-%EC%9C%84%EC%B9%98-%EC%84%A4%EC%A0%95%C2%A0"><div dir="auto">1. <span style="color: #000000;">playbook이 저장된 위치 설정 (RESOURCES → Project)</span>
2. <span style="color: #000000;">프로젝트 생성 방법 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-ke9hv2ho.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택)</span>
    1. <span style="color: #000000;">프로젝트 생성 입력 화면  
        </span>  
        [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-el0ai32b.png)](http://igoni.kr/uploads/images/gallery/2022-09/Bm5image.png)
    
    
    - <span style="color: #000000;">항목별 상세설명</span>  
          
        <table class="confluenceTable" data-ke-align="alignLeft"><colgroup><col></col><col></col><col></col></colgroup><thead><tr><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">항 목</span>**</td><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">설 명</span>**</td><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">비 고</span>**</td></tr></thead><tbody><tr><td class="confluenceTd"><span style="color: #000000;">NAME </span></td><td class="confluenceTd"><span style="color: #000000;">프로젝트 이름</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">DESCRIPTION </span></td><td class="confluenceTd"><span style="color: #000000;">프로젝트 설명</span></td><td class="confluenceTd"><span style="color: #000000;">옵션</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">ORGANIZATION </span></td><td class="confluenceTd"><span style="color: #000000;">프로젝트 조직</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">SCM TYPE</span></td><td class="confluenceTd"><span style="color: #000000;">- Manual : 배포서버의 파일형태로 관리 (awx\_task 컨테이너 /var/lib/awx/project에 playbook이 저장되어 있어야 함)</span>  
        <span style="color: #000000;">- git : git을 통해 관리</span>  
        <span style="color: #000000;">- subversion : subversion 을 통해 관리</span></td><td class="confluenceTd"><span style="color: #000000;">필수 배포시스템은 git을 통해 playbook 관리</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">SCM URL</span></td><td class="confluenceTd"><span style="color: #000000;">git / subversion URL</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">SCM BRANCH/TAG/COMMIT</span></td><td class="confluenceTd"><span style="color: #000000;">특정 브랜치/태그를 이용해야 하는 경우 입력</span></td><td class="confluenceTd"><span style="color: #000000;">옵션 (공란인 경우 master / head)</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">GIT REFSPEC URL</span></td><td class="confluenceTd"><span style="color: #000000;">git기반에서 원격 저장소 다운로드할 경로 참조시 입력</span></td><td class="confluenceTd"><span style="color: #000000;">옵션 (공란인경우 사용하지 않음)</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">SCM CREDENTIAL</span></td><td class="confluenceTd"><span style="color: #000000;">git / subversion 접근을 위한 계정정보</span></td><td class="confluenceTd"><span style="color: #000000;">필수 (인증정보에서 생성된 계정선택)</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">SCM UPDATE OPTIONS</span></td><td class="confluenceTd"><span style="color: #000000;">- CLEAN : 업데이트하기 전에 로컬 데이터 삭제 - DELETE ON UPDATE : 업데이트를 수행하기 전에 로컬저장소 전체 삭제  
        - UPDATE REVISION ON LAUNCH : 작업시작전에 업데이트 수행  
        - ALLOW BRANCH OVERRIDE : branch 변경이 필요할때 사용</span></td><td class="confluenceTd"><span style="color: #000000;">선택 선택 선택 선택안함</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">CACHE TIMEOUT (SECONDS)</span></td><td class="confluenceTd"><span style="color: #000000;">프로젝트를 최신상태로 인지하는 시간(초단위), 타임마아웃을 초과한 경우 프로젝트 소스를 다시 업데이트 함</span></td><td class="confluenceTd"><span style="color: #000000;">옵션 (0인 경우 사용안함)</span></td></tr></tbody></table>
    
    <span style="color: #000000;">  
    </span>

</div></div>### <span style="color: #000000;">인벤토리 </span>

<div class="page-content" id="bkmrk-%EC%9E%91%EC%97%85%EC%9D%84-%EC%9C%84%ED%95%9C-%ED%98%B8%EC%8A%A4%ED%8A%B8-%EB%AA%A8%EC%9D%8C%C2%A0%28resou"><div dir="auto">1. <span style="color: #000000;">작업을 위한 호스트 모음 (RESOURCES → Inventories)</span>
2. <span style="color: #000000;">인벤토리 생성 방법 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-3mz7ffac.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택)</span>
    1. <span style="color: #000000;">인벤토리 생성 입력화면</span>  
        [![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. <span style="color: #000000;">항목별 상세설명</span><table class="confluenceTable" data-ke-align="alignLeft" style="height: 142px; width: 99.4877%;"><colgroup><col style="width: 33.2386%;"></col><col style="width: 33.2386%;"></col><col style="width: 33.2386%;"></col></colgroup><thead><tr><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">항 목</span>**</td><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">설 명</span>**</td><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">비 고</span>**</td></tr></thead><tbody><tr><td class="confluenceTd"><span style="color: #000000;">NAME </span></td><td class="confluenceTd"><span style="color: #000000;">인벤토리 이름</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">DESCRIPTION </span></td><td class="confluenceTd"><span style="color: #000000;">인벤토리 설명</span></td><td class="confluenceTd"><span style="color: #000000;">옵션</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">ORGANIZATION </span></td><td class="confluenceTd"><span style="color: #000000;">소속 조직</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">INSIGHTS CREDENTIAL</span></td><td class="confluenceTd"><span style="color: #000000;">redhat Insights 계정선택</span></td><td class="confluenceTd"><span style="color: #000000;">옵션 (redhat Insightst사용시 선택)</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">Instance Group</span></td><td class="confluenceTd"><span style="color: #000000;">인벤토리의 인스턴스 그룹</span></td><td class="confluenceTd"><span style="color: #000000;">옵션 (사용하지 않음)</span></td></tr></tbody></table>
        
        <span style="color: #000000;">  
        </span>
3. <span style="color: #000000;">인벤토리 추가 설정</span>
    1. <span style="color: #000000;">권한 설정 방법 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-v4i8jnqp.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택)</span>
    2. <span style="color: #000000;"><span style="color: #000000;">권한설정 입력화면 : 추가할 계정명 선택 후 설정할 권한 정보 선택  
        </span></span>[![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. <span style="color: #000000;"> 정책별 상세 설명</span><table class="confluenceTable" data-ke-align="alignLeft" style="width: 94.8242%; height: 166px;"><colgroup><col style="width: 19.0909%;"></col><col style="width: 80.9091%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="confluenceTh" style="text-align: center; height: 29.7969px;">**<span style="color: #000000;">항 목</span>**</td><td class="confluenceTh" style="text-align: center; height: 29.7969px;">**<span style="color: #000000;">설 명</span>**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;"><span style="color: #000000;">Admin</span></td><td class="confluenceTd" style="height: 29.7969px;"><span style="color: #000000;">모든 권한 부여</span></td></tr><tr style="height: 46.5938px;"><td class="confluenceTd" style="height: 46.5938px;"><span style="color: #000000;">Update</span></td><td class="confluenceTd" style="height: 46.5938px;"><span style="color: #000000;">SCM업데이트시 프로젝트 업데이트 가능</span></td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;"><span style="color: #000000;">Ad Hoc</span></td><td class="confluenceTd" style="height: 29.7969px;"><span style="color: #000000;">임시 명령 사용가능</span></td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;"><span style="color: #000000;">Use</span></td><td class="confluenceTd" style="height: 29.7969px;"><span style="color: #000000;">템플릿에서 해당 인벤토리 접근 가능</span></td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;"><span style="color: #000000;">Read</span></td><td class="confluenceTd" style="height: 29.7969px;"><span style="color: #000000;">읽기전용</span></td></tr></tbody></table>
        
        <span style="color: #000000;">  
        </span>
    
    
    1. <span style="color: #000000;">호스트 추가방법 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-dhhtnlsd.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택)</span>
    2. <span style="color: #000000;">호스트 추가 입력화면</span>  
        [![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. <span style="color: #000000;">항목별 상세설명</span><table class="confluenceTable" data-ke-align="alignLeft"><colgroup><col></col><col></col><col></col></colgroup><thead><tr><td class="confluenceTh" style="text-align: center;">**항 목**</td><td class="confluenceTh" style="text-align: center;">**설 명**</td><td class="confluenceTh" style="text-align: center;">**비 고**</td></tr></thead><tbody><tr><td class="confluenceTd">HOSTNAME</td><td class="confluenceTd">타켓호스트 IP입력(호스트네임 입력 무방)</td><td class="confluenceTd">필수 (호스트네임 입력시 ip와 매핑할 수 있는 정보 필요)</td></tr><tr><td class="confluenceTd">DESCRIPTION</td><td class="confluenceTd">타켓호스트 설명</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">VARIABLES</td><td class="confluenceTd">ssh포트, 접속 방법 등 해당 호스트의 추가 설정값 입력</td><td class="confluenceTd">옵션 (기본은 ssh, tcp/22로 접근수행)</td></tr></tbody></table>
    4. <span style="color: #000000;">PERMISSIONS : 접근계정 권한설정</span>
    5. <span style="color: #000000;">GROUPS : 각 호스트에 소속된 그룹정보 입력</span>
        1. <span style="color: #000000;">그룹추가 방법 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-8sic7cvk.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택)</span>
        2. <span style="color: #000000;"><span style="color: #000000;">그룹추가 입력화면  
            </span></span>[![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. <span style="color: #000000;">항목별 상세설명</span><table class="confluenceTable" data-ke-align="alignLeft"><thead><tr><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">항 목</span>**</td><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">설 명</span>**</td><td class="confluenceTh" style="text-align: center;">**<span style="color: #000000;">비 고</span>**</td></tr></thead><tbody><tr><td class="confluenceTd"><span style="color: #000000;">NAME</span></td><td class="confluenceTd"><span style="color: #000000;">그룹이름</span></td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">DESCRIPTION</span></td><td class="confluenceTd"><span style="color: #000000;">그룹설명</span></td><td class="confluenceTd"><span style="color: #000000;">옵션</span></td></tr><tr><td class="confluenceTd"><span style="color: #000000;">VALIABLES</span></td><td class="confluenceTd"><span style="color: #000000;">이 그룹에 소속된 모든 호스트에 적용할 값 입력(yaml / json 지원 가능)</span></td><td class="confluenceTd"><span style="color: #000000;">옵션</span></td></tr></tbody></table>
            
            <span style="color: #000000;">  
            </span>
        4. <span style="color: #000000;">생성된 그룹에 하위 그룹 생성 방법 (생성된 그룹 → 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) 버튼 선택)</span>
            1. <span style="color: #000000;">기존에 생성된 그룹의 경우 Existing Group 선택)</span>
            2. <span style="color: #000000;">하위그룹으로 관리할 그룹 명 선택 </span>  
                [![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. <span style="color: #000000;">새로운 그룹인 경우 New Group 선택 후 그룹정보 입력</span>
        5. <span style="color: #000000;">생성된 그룹에 소속시킬 호스트 등록 (생성된 그룹 → HOSTS)</span>
            1. <span style="color: #000000;">기존에 생성된 호스트의 경우 Existing HOSTS 선택)</span>
            2. <span style="color: #000000;">소속된 호스트 선택</span>
        6. <span style="color: #000000;">새로운 호스트의 경우 New HOSTS 선택 후 호스트정보 입력</span>
    6. <span style="color: #000000;">HOTS : 해당 인벤토리에 등록할 호스트정보 등록</span>
        1. <span style="color: #000000;">호스트 추가방법 ([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-kiqjxuio.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png) 버튼 선택)</span>
        2. <span style="color: #000000;">호스트 추가 입력화면</span>  
            [![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. <span style="color: #000000;">항목별 상세설명</span><table class="confluenceTable" data-ke-align="alignLeft"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th class="confluenceTh" style="text-align: center;">항 목</th><th class="confluenceTh" style="text-align: center;">설 명</th><th class="confluenceTh" style="text-align: center;">비 고</th></tr><tr><td class="confluenceTd">HOSTNAME</td><td class="confluenceTd">타켓호스트 IP입력(호스트네임 입력 무방)</td><td class="confluenceTd">필수 (호스트네임 입력시 ip와 매핑할 수 있는 정보 필요)</td></tr><tr><td class="confluenceTd">DESCRIPTION</td><td class="confluenceTd">타켓호스트 설명</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">VARIABLES</td><td class="confluenceTd">ssh포트, 접속 방법 등 해당 호스트의 추가 설정값 입력</td><td class="confluenceTd">옵션 (기본은 ssh, tcp/22로 접근수행)</td></tr></tbody></table>
        4.
4. <span style="color: #003366;">다수서버 등록시 방법</span>
    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
        ```

</div></div>### <span style="color: #000000;">템플릿</span>

<div class="page-content" id="bkmrk-%EC%8B%A4%EC%A0%9C-%EB%B0%B0%ED%8F%AC%EC%9E%91%EC%97%85%EC%9D%84-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%B4-%EC%83%9D%EC%84%B1%C2%A0"><div dir="auto">1. <span style="color: #000000;">실제 배포작업을 실행하기 위해 생성 (RESOURCES → Templates)</span>
2. <span style="color: #000000;">기본 템플릿 생성방법([![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 선택)</span>
    1. <span style="color: #000000;">템플릿 생성 입력화면</span>  
        [![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. <span style="color: #000000;">항목별 상세설명</span>  
        PROMPT ON LAUNCH : 플레이북 실행시 선택창 출력 <table class="confluenceTable" data-ke-align="alignLeft"><colgroup><col></col><col></col><col></col></colgroup><thead><tr><td class="confluenceTh" style="text-align: center;">**항 목**</td><td class="confluenceTh" style="text-align: center;">**설 명**</td><td class="confluenceTh" style="text-align: center;">**비 고**</td></tr></thead><tbody><tr><td class="confluenceTd">NAME</td><td class="confluenceTd">템플릿 이름</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">DESCRIPTION</td><td class="confluenceTd">템플릿 설명</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">JOB TYPE</td><td class="confluenceTd">- run : 실제 배포 수행 - check: 구문 오류테스트</td><td class="confluenceTd">필수 (run 선택)</td></tr><tr><td class="confluenceTd">INVENTORY </td><td class="confluenceTd">템플릿에서 적용할 인벤토리 설정</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">PROJECT </td><td class="confluenceTd">템플릿에서 적용할 프로젝트 설정</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">PLAYBOOK</td><td class="confluenceTd">템플릿에서 수행할 플레이북 선택</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">CREDENTIALS </td><td class="confluenceTd">템플릿에서 적용할 인증값 설정</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">FORKS </td><td class="confluenceTd">플레이북 실행시 동시 프로세스</td><td class="confluenceTd">옵션 (1 입력)</td></tr><tr><td class="confluenceTd">LIMIT </td><td class="confluenceTd">호스트 목록 제한시 입력</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">VERBOSITY </td><td class="confluenceTd">로그 출력 레벨 (숫자가 높을수록 상세로그)</td><td class="confluenceTd">0 선택 \* 디버깅 로그시 브라우저 탭이 잠기면서 작업완료 지연 보고 이슈 있음</td></tr><tr><td class="confluenceTd">JOB TAGS</td><td class="confluenceTd">배포 작업별 설정되는 태그 입력</td><td class="confluenceTd">템플릿별 고유의 태그 입력 필요</td></tr><tr><td class="confluenceTd">SKIP TAGS</td><td class="confluenceTd">작업을 수행하지 않을 태그 입력</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">LABELS</td><td class="confluenceTd">템플릿을 설명하는 레이블 입력</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">INSTANCE GROUPS</td><td class="confluenceTd">템플릿을 실행할 인스턴스 그룹 선택</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">JOB SLICING</td><td class="confluenceTd">작업 슬라이스(다중 호스트 작업시 작업수를 분산) 설정</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">TIMEOUT</td><td class="confluenceTd">배포작업 최대 소요시간</td><td class="confluenceTd">옵션 2400 입력</td></tr><tr><td class="confluenceTd">SHOW CHANGES</td><td class="confluenceTd">작업시 변경되는 내용들 확인</td><td class="confluenceTd">활성화</td></tr><tr><td class="confluenceTd">OPTIONS</td><td class="confluenceTd">- ENABLE PRIVILEGE ESCALATION : 권한 상승이필요한 경우 선택  
        - ENABLE PROVISIONING CALLBACKS : awx api를 통해 작업 호출 허용시 선택  
        - ENABLE WEBHOOK : 웹 후크 사용시 선택  
        - ENABLE CONCURRENT JOBS : 템플릿 자체의 중복실행 허용시 선택  
        - ENABLE FACT CACHE : 배포 작업시 팩트 캐쉬를 사용할 경우 선택</td><td class="confluenceTd">선택 미선택  
        미선택  
        선택  
        미선택</td></tr><tr><td class="confluenceTd">EXTRA VARIABLES</td><td class="confluenceTd">추가로 설정해야할 변수 입력</td><td class="confluenceTd">상기 이미지 내용 추가</td></tr></tbody></table>
3. WorkFlow <span style="color: #000000;">템플릿 생성방법([![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-ps29wzm9.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png)</span><span style="color: #000000;"> 버튼 선택 </span><span style="color: #000000;">→ Workflow Template 선택</span><span style="color: #000000;">)</span>
    1. <span style="color: #000000;">탬플릿 생성 입력화면</span><span style="color: #000000;">  
        </span>
    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. <span style="color: #000000;">항목별 상세 설명</span><table class="confluenceTable" data-ke-align="alignLeft" style="height: 265.172px; width: 100.053%;"><thead><tr style="height: 29.7969px;"><td class="confluenceTh align-center" style="width: 22.6428%; height: 29.7969px;">**항 목**</td><td class="confluenceTh align-center" style="width: 62.131%; height: 29.7969px;">**설 명**</td><td class="confluenceTh align-center" style="width: 15.1377%; height: 29.7969px;">**비 고**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="width: 22.6428%; height: 29.7969px;">NAME</td><td class="confluenceTd" style="width: 62.131%; height: 29.7969px;">템플릿 이름</td><td class="confluenceTd" style="width: 15.1377%; height: 29.7969px;">필수</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="width: 22.6428%; height: 29.7969px;">DESCRIPTION</td><td class="confluenceTd" style="width: 62.131%; height: 29.7969px;">템플릿 설명</td><td class="confluenceTd" style="width: 15.1377%; height: 29.7969px;">옵션</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="width: 22.6428%; height: 29.7969px;">ORGANIZATION</td><td class="confluenceTd" style="width: 62.131%; height: 29.7969px;">템플릿 조직</td><td class="confluenceTd" style="width: 15.1377%; height: 29.7969px;">옵션</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="width: 22.6428%; height: 29.7969px;">INVENTORY </td><td class="confluenceTd" style="width: 62.131%; height: 29.7969px;">템플릿에서 적용할 인벤토리 설정</td><td class="confluenceTd" style="width: 15.1377%; height: 29.7969px;">필수</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="width: 22.6428%; height: 29.7969px;">LIMIT </td><td class="confluenceTd" style="width: 62.131%; height: 29.7969px;">호스트 목록 제한시 입력</td><td class="confluenceTd" style="width: 15.1377%; height: 29.7969px;">옵션</td></tr><tr style="height: 10px;"><td class="confluenceTd" style="width: 22.6428%; height: 10px;">SCM BRANCH</td><td class="confluenceTd" style="width: 62.131%; height: 10px;">특정 branch / tag에서 가지고 와와야할 경우 입력</td><td class="confluenceTd" style="width: 15.1377%; height: 10px;">옵션</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="width: 22.6428%; height: 29.7969px;">LABELS</td><td class="confluenceTd" style="width: 62.131%; height: 29.7969px;">템플릿을 설명하는 레이블 입력</td><td class="confluenceTd" style="width: 15.1377%; height: 29.7969px;">옵션</td></tr><tr style="height: 46.5938px;"><td class="confluenceTd" style="width: 22.6428%; height: 46.5938px;">OPTIONS</td><td class="confluenceTd" style="width: 62.131%; height: 46.5938px;">- ENABLE CONCURRENT JOBS : 템플릿 자체의 중복실행 허용시 선택  
        - ENABLE WEBHOOK : 웹 후크 사용시 선택</td><td class="confluenceTd" style="width: 15.1377%; height: 46.5938px;">선택  
        미선택</td></tr></tbody></table>
        
        <span style="color: #000000;">  
        </span>
4. 템플릿 설정 
    1. PERMISSION (Templates → Permission ,<span style="color: #000000;"> [![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-swmopequ.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png)</span><span style="color: #000000;"> 버튼 선택)</span>
        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. 권한별 상세 설명 <table class="confluenceTable" data-ke-align="alignLeft" style="width: 84.2734%; height: 119.188px;"><thead><tr style="height: 29.7969px;"><td class="confluenceTh" style="text-align: center; width: 29.3103%; height: 29.7969px;">**권 한**</td><td class="confluenceTh" style="text-align: center; width: 70.6897%; height: 29.7969px;">**설 명**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="width: 29.3103%; height: 29.7969px;">Admin</td><td class="confluenceTd" style="width: 70.6897%; height: 29.7969px;">전체 권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="width: 29.3103%; height: 29.7969px;">Execute</td><td class="confluenceTd" style="width: 70.6897%; height: 29.7969px;">실행/수정 권한</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="width: 29.3103%; height: 29.7969px;">Read</td><td class="confluenceTd" style="width: 70.6897%; height: 29.7969px;">읽기모드 권한 (실행 불가)</td></tr></tbody></table>
    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. 항목별 상세 설명 <table class="confluenceTable" data-ke-align="alignLeft" style="height: 147px; width: 99.9626%;"><thead><tr><td class="confluenceTh" style="text-align: center; width: 19.1621%;">**항목**</td><td class="confluenceTh" style="text-align: center; width: 36.2236%;">**설 명**</td><td class="confluenceTh" style="text-align: center; width: 44.6166%;">**비 고**</td></tr></thead><tbody><tr><td class="confluenceTd" style="width: 19.1621%;">START</td><td class="confluenceTd" style="width: 36.2236%;">템플릿 실행시 알람 전송</td><td class="confluenceTd" style="width: 44.6166%;">[![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) : 비활성화</td></tr><tr><td class="confluenceTd" style="width: 19.1621%;">SUCCESS</td><td class="confluenceTd" style="width: 36.2236%;">템플릿이 정상 종료된 경우 전송</td><td class="confluenceTd" style="width: 44.6166%;">[![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) : 비활성화</td></tr><tr><td class="confluenceTd" style="width: 19.1621%;">FAILURE</td><td class="confluenceTd" style="width: 36.2236%;">템플릿이 실패한 경우 전송</td><td class="confluenceTd" style="width: 44.6166%;">[![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) : 비활성화</td></tr></tbody></table>
    3. COMPLETED JOBS 
        1. 해당 템플릿으로 수행한 작업이력 확인 (Templates → COMPLETED JOBS)
    4. SCHEDULES 
        1. 해당 템플릿을 스케쥴로 수행할 때 선택
        2. 스케쥴 생성 방법 (Templates → SCHEDULES, <span style="color: #000000;">[![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-mphkpu8e.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png)</span><span style="color: #000000;"> 버튼 선택)</span>
        3. <span style="color: #000000;">스케쥴 설정 화면</span>  
            [![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. <span style="color: #000000;">항목별 상세 설명</span>  
              
            <table class="confluenceTable" data-ke-align="alignLeft" style="height: 350px; width: 111.767%;"><colgroup><col style="width: 26.1982%;"></col><col style="width: 47.7556%;"></col><col style="width: 26.0485%;"></col></colgroup><thead><tr><td class="confluenceTh align-center">**항 목**</td><td class="confluenceTh align-center">**설 명**</td><td class="confluenceTh align-center">**비 고**</td></tr></thead><tbody><tr><td class="confluenceTd">NAME</td><td class="confluenceTd">스케쥴 이름</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">START DATE</td><td class="confluenceTd">시작 날짜</td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd">START TIME</td><td class="confluenceTd">시작 시간</td><td class="confluenceTd"><span style="color: #000000;">필수</span></td></tr><tr><td class="confluenceTd">LOCAL TIME ZONE</td><td class="confluenceTd">지역 시간대0</td><td class="confluenceTd">OS에 설정된 시간대역에 맞추어 자동 표시, 수정 가능</td></tr><tr><td class="confluenceTd">REPEAT FREQUENCY</td><td class="confluenceTd">반복 빈도 - none : 1회성 <span style="color: #000000;"> - Minute : 분단위 반복  
            - Hour : 시간단위 반복  
            - Day : 일 단위 반복  
            - Week : 주 단위 반복  
            - Month : 월 단위 반복  
            - Year : 년 단위 반복</span></td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">Every</td><td class="confluenceTd">반복 주기 설정</td><td class="confluenceTd">반복설정시 화면에 노출 (필수)</td></tr><tr><td class="confluenceTd">END</td><td class="confluenceTd">종료조건 - after : OCCURRENCES 횟수까지 실행 후 종료  
            - On Date : 특정날짜/시간 까지 실행 후 종료</td><td class="confluenceTd">필수</td></tr></tbody></table>
    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. 항목별 세부설명 <table class="confluenceTable" data-ke-align="alignLeft" style="width: 117.744%;"><colgroup><col style="width: 24.5417%;"></col><col style="width: 38.463%;"></col><col style="width: 36.9579%;"></col></colgroup><thead><tr><td class="confluenceTh align-center">**항 목**</td><td class="confluenceTh align-center">**설 명**</td><td class="confluenceTh align-center">**비 고**</td></tr></thead><tbody><tr><td class="confluenceTd">PROMPT</td><td class="confluenceTd">사용자에 확인할 질문사항</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">DESCRIPTION</td><td class="confluenceTd">prompt에 대한 추가 설명</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">ANSWER VARIABLE NAME</td><td class="confluenceTd">ansible에 전달할 변수 이름</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">ANSWER TYPE</td><td class="confluenceTd">답변 유형 선택  
            - text  
            - textarea  
            - Password  
            - Multiple Choice (single Select)  
            - Multiple Choice (Multiple Select)  
            - integer  
            - Float</td><td class="confluenceTd">  
              
            일반 문자열 (1줄)  
            여러줄의 문자열  
            패스워드 형태 입력시 선택  
            1개만 선택할 수 있는 리스트 목록  
            여러개 선택할 수 있는 리스트 목록  
            숫자값  
            10진수</td></tr><tr><td class="confluenceTd">MININUM LENGTH</td><td class="confluenceTd">최소 문자열</td><td class="confluenceTd">text, textarea, password, integer, float 선택시 보임</td></tr><tr><td class="confluenceTd">MAXIMUM LENGTH</td><td class="confluenceTd">최대 문자열</td><td class="confluenceTd">text, textarea, password, integer, float 선택시 보임</td></tr><tr><td class="confluenceTd">DEFAULT ANSWER</td><td class="confluenceTd">기본 항목</td><td class="confluenceTd">prompt에 대한 기본값</td></tr><tr><td class="confluenceTd">REQUIRED</td><td class="confluenceTd">필수여부</td><td class="confluenceTd">선택시 배포작업시 필수항목으로 분류됨</td></tr></tbody></table>
        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 세부 항목 <table class="confluenceTable" data-ke-align="alignLeft" style="width: 99.9626%; height: 268.969px;"><colgroup><col style="width: 15.994%;"></col><col style="width: 54.858%;"></col><col style="width: 29.148%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="confluenceTh align-center" style="height: 29.7969px;">**항 목**</td><td class="confluenceTh align-center" style="height: 29.7969px;">**설 명**</td><td class="confluenceTh align-center" style="height: 29.7969px;">**비 고**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Template</td><td class="confluenceTd" style="height: 29.7969px;">생성된 템플릿 추가시</td><td class="confluenceTd" style="height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Project Sync</td><td class="confluenceTd" style="height: 29.7969px;">프로젝트 동기화 시</td><td class="confluenceTd" style="height: 29.7969px;"> </td></tr><tr style="height: 46.5938px;"><td class="confluenceTd" style="height: 46.5938px;">Inventory Sync</td><td class="confluenceTd" style="height: 46.5938px;">인벤토리 동기화 시</td><td class="confluenceTd" style="height: 46.5938px;"> </td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">Approval</td><td class="confluenceTd" style="height: 29.7969px;">작업건 승인여부 확인시</td><td class="confluenceTd" style="height: 29.7969px;">webui noti항목에 출력됨</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">TIMEOUT</td><td class="confluenceTd" style="height: 29.7969px;">승인여부 타임아웃 (타임아웃 초과시 거부됨)</td><td class="confluenceTd" style="height: 29.7969px;">옵션, 0인 경우 무제한</td></tr><tr style="height: 63.3906px;"><td class="confluenceTd" style="height: 63.3906px;">RUN</td><td class="confluenceTd" style="height: 63.3906px;">- Always : 성공 / 실패에 상관없이 계속 실행  
            - On Success : 앞 작업이 정상적으로 수행된 경우 실행  
            - On Failure : 앞 작업이 실패된 경우 실행</td><td class="confluenceTd" style="height: 63.3906px;">필수, 최초 Node는 Alway만 표기됨</td></tr><tr style="height: 10px;"><td class="confluenceTd" style="height: 10px;">CONVERGENCE</td><td class="confluenceTd" style="height: 10px;">- Any : 앞 작업이 하나라도 완료되면 수행 - All : 앞 작업이 모두 완료되면 수행</td><td class="confluenceTd" style="height: 10px;">필수, Any가 기본</td></tr></tbody></table>
        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에 <span style="color: #161b1f;">Successful )표기</span>  
        [![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. <span style="color: #161b1f;">오류가 발생하는 경우 : 동일 위치에 FAILED로 표기, FAILED 발생 원인 분석 필요  
        </span>
    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)

</div></div>### 자격증명 관리

기존에 생성된 인증절차방식 외에 추가할경우 사용 (SSH / winrm / aws 등 대부분 내장된 기능으로 사용가능)

<div class="page-content" id="bkmrk-%EC%9D%B8%EC%A6%9D%EC%A0%95%EC%B1%85-%EA%B4%80%EB%A6%AC%C2%A0%C2%A0%28administra"><div dir="auto">1. 인증정책 관리 (ADMINISTRATION → CREDENTIAL TYPES)
2. 인증절차 생성(<span style="color: #000000;">[![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-t2jslu2u.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png)</span> 버튼 선택) 
    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. 항목별 상세 설명 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="height: 131px; width: 100.053%;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><thead><tr><td class="confluenceTh">**항 목**</td><td class="confluenceTh">**값 설명**</td><td class="confluenceTh">**비 고**</td></tr></thead><tbody><tr><td class="confluenceTd">NAME</td><td class="confluenceTd">자격증명 이름</td><td class="confluenceTd">필수</td></tr><tr><td class="confluenceTd">DESCRIPTION</td><td class="confluenceTd">자격증명 설명</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">INPUT CONFIGURATION</td><td class="confluenceTd">인증시 사용할 필드 구성</td><td class="confluenceTd">옵션</td></tr><tr><td class="confluenceTd">INJECTION CONFIGURATION</td><td class="confluenceTd">인증시 전달할 환경변수 구성</td><td class="confluenceTd">옵션</td></tr></tbody></table>

</div></div>### 알람관리

AWX에서 수행하는 Template에 대한 알람수신 방법 관리

<div class="page-content" id="bkmrk-%EC%95%8C%EB%9E%8C-%EC%A0%95%EC%B1%85-%EA%B4%80%EB%A6%AC-%28administra"><div dir="auto">1. 알람 정책 관리 (ADMINISTRATION → NOTIFICATION TEMPLATES)
2. 알람방법 생성(<span style="color: #000000;">[![image.png](http://igoni.kr/uploads/images/gallery/2024-01/embedded-image-e0cwmfpl.png)](http://igoni.kr/uploads/images/gallery/2022-09/RWOimage.png)</span> 버튼 선택) 
    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. 항목별 상세 설명 <table class="relative-table confluenceTable wrapped" data-ke-align="alignLeft" style="width: 102.879%; height: 326.954px;"><colgroup><col style="width: 26.1808%;"></col><col style="width: 51.491%;"></col><col style="width: 22.3812%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="confluenceTh" style="text-align: center; height: 29.7969px;">**항 목**</td><td class="confluenceTh" style="text-align: center; height: 29.7969px;">**값 설명**</td><td class="confluenceTh" style="text-align: center; height: 29.7969px;">**비 고**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">NAME</td><td class="confluenceTd" style="height: 29.7969px;">알람정책 이름</td><td class="confluenceTd" style="height: 29.7969px;">필수</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">DESCRIPTION</td><td class="confluenceTd" style="height: 29.7969px;">정책 설명</td><td class="confluenceTd" style="height: 29.7969px;">옵션</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">ORGANIZAION</td><td class="confluenceTd" style="height: 29.7969px;">소속 조직</td><td class="confluenceTd" style="height: 29.7969px;">필수</td></tr><tr style="height: 197.766px;"><td class="confluenceTd" style="height: 197.766px;">TYPE</td><td class="confluenceTd" style="height: 197.766px;">설정가능한 알람리스트  
        - Email  
        - Grafana  
        - HipChat  
        - IRC  
        - Mattermost  
        - PagerDuty  
        - Rocket.Chat  
        - Slack  
        - Twilio  
        - Webhook</td><td class="confluenceTd" style="height: 197.766px;">필수</td></tr><tr style="height: 10px;"><td class="confluenceTd" style="height: 10px;">CUSTOMIZE MESSAGES</td><td class="confluenceTd" style="height: 10px;">메세지 발송시 작성되는 내용 변경시 선택 후 수정</td><td class="confluenceTd" style="height: 10px;">옵션</td></tr></tbody></table>
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. 항목별 상세설명 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="height: 268.172px; width: 99.9626%;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="confluenceTh" style="text-align: center; height: 29.7969px;">**항 목**</td><td class="confluenceTh" style="text-align: center; height: 29.7969px;">**설 명**</td><td class="confluenceTh" style="text-align: center; height: 29.7969px;">**비 고**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">USERNAME</td><td class="confluenceTd" style="height: 29.7969px;">발송계정 이름</td><td class="confluenceTd" style="height: 29.7969px;">옵션</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">PASSWORD</td><td class="confluenceTd" style="height: 29.7969px;">발송계정 패스워드</td><td class="confluenceTd" style="height: 29.7969px;">옵션</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">HOST</td><td class="confluenceTd" style="height: 29.7969px;">발송서버</td><td class="confluenceTd" style="height: 29.7969px;">필수</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">RECIPIENT LIST</td><td class="confluenceTd" style="height: 29.7969px;">수신자</td><td class="confluenceTd" style="height: 29.7969px;">필수</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">SENDER EMAIL</td><td class="confluenceTd" style="height: 29.7969px;">발송메일주소</td><td class="confluenceTd" style="height: 29.7969px;">필수</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">PORT</td><td class="confluenceTd" style="height: 29.7969px;">메일발송 포트</td><td class="confluenceTd" style="height: 29.7969px;">필수</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">TIMEOUT</td><td class="confluenceTd" style="height: 29.7969px;">발송최대 시간(초기준)</td><td class="confluenceTd" style="height: 29.7969px;">필수, 최대 120초까지 설정 가능</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">EMAIL OPTIONS</td><td class="confluenceTd" style="height: 29.7969px;">USE TLS / USE SSL</td><td class="confluenceTd" style="height: 29.7969px;">옵션TLS 나 SSL 사용시 선택</td></tr></tbody></table>
    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. 항목별 상세설명 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="width: 99.365%; height: 208.578px;"><colgroup><col style="width: 32.4812%;"></col><col style="width: 58.1955%;"></col><col style="width: 9.17293%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="confluenceTh align-center" style="height: 29.7969px;">**항 목**</td><td class="confluenceTh align-center" style="height: 29.7969px;">**설 명**</td><td class="confluenceTh align-center" style="height: 29.7969px;">**비 고**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">GRAFANA URL</td><td class="confluenceTd" style="height: 29.7969px;">그라파나 api서비스 url</td><td class="confluenceTd" style="height: 29.7969px;">필수</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">GRAFANA API KEY</td><td class="confluenceTd" style="height: 29.7969px;">그라파나에서 할당받은 api key</td><td class="confluenceTd" style="height: 29.7969px;">필수</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">ID OF THE DASHBOARD</td><td class="confluenceTd" style="height: 29.7969px;">그라파나 계정에 대해 api키 만들때 고유한 ID로 대쉬보드 설정</td><td class="confluenceTd" style="height: 29.7969px;">옵션</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">ID OF THE PANEL</td><td class="confluenceTd" style="height: 29.7969px;">그라파나에서 패널/그래프를 추가한 경우 해당 ID</td><td class="confluenceTd" style="height: 29.7969px;">옵션</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">TAGS FOR THE ANNOTATION</td><td class="confluenceTd" style="height: 29.7969px;">이벤트 유형을 기재</td><td class="confluenceTd" style="height: 29.7969px;">옵션</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">DISABLE SSL VERIFICATION</td><td class="confluenceTd" style="height: 29.7969px;">그라파나 접속시 SSL 인증서 확인절차 제외 여부</td><td class="confluenceTd" style="height: 29.7969px;">옵션</td></tr></tbody></table>
    3. 힙챗 
        1. 힙챗 정책 사용자 입력화면  
            ㅂ
        2. 항목별 상세설명

</div></div>###   
관리작업

Cleanup 작업 관리 (ADMINISTRATION → MANAGEMENT JOBS)

<div class="page-content" id="bkmrk-cleanup-activity-str"><div dir="auto">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)

</div></div>###   
인스턴스 그룹

인스턴스별 동작방식 및 작업 실행 방식 설정

<div class="page-content" id="bkmrk-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EA%B7%B8%EB%A3%B9-%EA%B4%80%EB%A6%AC%C2%A0%28administ"><div dir="auto">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. 항목별 세부설명 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="width: 100.053%; height: 135.984px;"><colgroup><col style="width: 29.661%;"></col><col style="width: 53.3898%;"></col><col style="width: 16.8079%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="confluenceTh align-center" style="height: 29.7969px;">**항 목**</td><td class="confluenceTh align-center" style="height: 29.7969px;">**값 설명**</td><td class="confluenceTh align-center" style="height: 29.7969px;">**비 고**</td></tr></thead><tbody><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">NAME</td><td class="confluenceTd" style="height: 29.7969px;">인스턴스명</td><td class="confluenceTd" style="height: 29.7969px;">필수</td></tr><tr style="height: 29.7969px;"><td class="confluenceTd" style="height: 29.7969px;">POLICY INSTANCE MINIMUM</td><td class="confluenceTd" style="height: 29.7969px;">그룹내에 유지할 최소 인스턴스 수</td><td class="confluenceTd" style="height: 29.7969px;">기본값 : 0</td></tr><tr style="height: 46.5938px;"><td class="confluenceTd" style="height: 46.5938px;">POLICY INSTANCE PERCENTAGE</td><td class="confluenceTd" style="height: 46.5938px;">신규 인스턴스가 소속될 있는 최대 가용가능한 인스턴스 수 (백분율)</td><td class="confluenceTd" style="height: 46.5938px;">기본값 : 0 (무제한)</td></tr></tbody></table>
    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정보 확인

</div></div>### AWX-UI 설정

UI기능 설정

<div class="page-content" id="bkmrk-authentication-azure"><div dir="auto">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. 항목별 상세설명 <table class="confluenceTable wrapped" data-ke-align="alignLeft"><colgroup><col></col><col></col><col></col></colgroup><thead><tr><td class="confluenceTh" style="text-align: center;">**항 목**</td><td class="confluenceTh" style="text-align: center;">**값 설명**</td><td class="confluenceTh" style="text-align: center;">**비 고**</td></tr></thead><tbody><tr><td class="confluenceTd">ANSIBLE MODULES ALLOWED FOR AD HOC JOBS</td><td class="confluenceTd">임시작업으로 사용할 수 있는 명령어 종류</td><td class="confluenceTd"> </td></tr><tr><td class="confluenceTd">JOB EXECUTION PATH</td><td class="confluenceTd">작업수행을 위한 임시 경로</td><td class="confluenceTd">/tmp</td></tr><tr><td class="confluenceTd">MAXIMUM SCHEDULED JOBS</td><td class="confluenceTd">최대 예약작업 갯수</td><td class="confluenceTd">10</td></tr><tr><td class="confluenceTd">PATHS TO EXPOSE TO ISOLATED JOBS</td><td class="confluenceTd">격리된 작업시 허용되는 경로 (전체 경로 정보 입력필요</td><td class="confluenceTd">격리 작업 미사용</td></tr><tr><td class="confluenceTd">PATHS TO HIDE FROM ISOLATED JOBS</td><td class="confluenceTd">격리된 작업시 숨길 경로 (전체 경로 정보 입력필요</td><td class="confluenceTd">격리 작업 미사용</td></tr><tr><td class="confluenceTd">ENABLE JOB ISOLATION</td><td class="confluenceTd">작업 격리기능 사용여부</td><td class="confluenceTd">미설정</td></tr><tr><td class="confluenceTd">DEFAULT JOB TIMEOUT</td><td class="confluenceTd">최대 작업 시간 (초단위)</td><td class="confluenceTd">0(무제한)</td></tr><tr><td class="confluenceTd">DEFAULT INVENTORY UPDATE TIMEOUT</td><td class="confluenceTd">최대 인벤토리 업데이트 시간 (초단위)</td><td class="confluenceTd">0(무제한)</td></tr><tr><td class="confluenceTd">RUN PROJECT UPDATES WITH HIGHER VERBOSITY</td><td class="confluenceTd">프로젝트 업데이트 실행시 자세한 정보 출력</td><td class="confluenceTd">미설정</td></tr><tr><td class="confluenceTd">PER-HOST ANSIBLE FACT CACHE TIMEOUT</td><td class="confluenceTd">호스트 단위로 팩트캐쉬 시간 (초단위)</td><td class="confluenceTd">0(무제한)</td></tr><tr><td class="confluenceTd">PRIMARY GALAXY SERVER URL</td><td class="confluenceTd">기본 ANSIBLE-GALAXY URL 변경시 사용</td><td class="confluenceTd">galaxy.ansible.com</td></tr><tr><td class="confluenceTd">PRIMARY GALAXY SERVER NAME</td><td class="confluenceTd">private galaxy 접근시 사용하는 계정</td><td class="confluenceTd">PRIVATE GALAXY 미사용</td></tr><tr><td class="confluenceTd">PRIMARY GALAXY SERVER PASSWORD</td><td class="confluenceTd">private galaxy 접근시 사용하는 계정 패스워드</td><td class="confluenceTd">PRIVATE GALAXY 미사용</td></tr><tr><td class="confluenceTd">PRIMARY GALAXY SERVER TOKEN</td><td class="confluenceTd">private galaxy 접근시 사용하는 토큰정보</td><td class="confluenceTd">PRIVATE GALAXY 미사용</td></tr><tr><td class="confluenceTd">PRIMARY GALAXY AUTHENTICATION URL</td><td class="confluenceTd">private galaxy 접근시 사용하는 인증경로</td><td class="confluenceTd">PRIVATE GALAXY 미사용</td></tr><tr><td class="confluenceTd">ALLOW ACCESS TO PUBLIC GALAXY</td><td class="confluenceTd">공개된 Galaxy사용여부</td><td class="confluenceTd">활성화</td></tr><tr><td class="confluenceTd">ISOLATED HOST KEY CHECKING</td><td class="confluenceTd">격리된 호스트 키 확인여부</td><td class="confluenceTd">비활성화  
        격리 작업 미사용</td></tr><tr><td class="confluenceTd">ISOLATED STATUS CHECK INTERVAL</td><td class="confluenceTd">격리정보 확인 (초단위)</td><td class="confluenceTd">30</td></tr><tr><td class="confluenceTd">ISOLATED LAUNCH TIMEOUT</td><td class="confluenceTd">최대 격리된 작업 실행 시간 (초단위)</td><td class="confluenceTd">600  
        격리 작업 미사용</td></tr><tr><td class="confluenceTd">ISOLATED CONNECTION TIMEOUT</td><td class="confluenceTd">최대 격리호스트 연결시간 (초단위)</td><td class="confluenceTd">10  
        격리 작업 미사용</td></tr><tr><td class="confluenceTd">ENABLE DETAILED RESOURCE PROFILING ON ALL PLAYBOOK RUNS</td><td class="confluenceTd">플래이북 실행시 리소스 프로파일링 설정여부</td><td class="confluenceTd">비활성화</td></tr><tr><td class="confluenceTd">EXTRA ENVIRONMENTVARIABLES</td><td class="confluenceTd">AWX-UI에서 사용할 추가 환경 변수</td><td class="confluenceTd"> </td></tr><tr><td class="confluenceTd">ANSIBLE CALLBACK PLUGINS</td><td class="confluenceTd">ansible에서 사용할 콜백용 플러그인</td><td class="confluenceTd"> </td></tr></tbody></table>
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. 항목별 상세설명 <table class="confluenceTable wrapped" data-ke-align="alignLeft"><colgroup><col></col><col></col><col></col></colgroup><thead><tr><td class="confluenceTh" style="text-align: center;">**항 목**</td><td class="confluenceTh" style="text-align: center;">**값 설명**</td><td class="confluenceTh" style="text-align: center;">**비 고**</td></tr></thead><tbody><tr><td class="confluenceTd">BASE URL OF THE TOWER HOST</td><td class="confluenceTd">AWX-UI URL정보</td><td class="confluenceTd"> </td></tr><tr><td class="confluenceTd">ALL USER VISIBLE TO ORGANIZATION ADMINS</td><td class="confluenceTd">관리자가 모든 사용자 확인 가능 여부</td><td class="confluenceTd">활성화</td></tr><tr><td class="confluenceTd">ORGANIZATION ADMINS CAN MANAGE USERS AND TEAMS</td><td class="confluenceTd">관리자가 사용자 및 팀 관리 허용 여부</td><td class="confluenceTd">활성화</td></tr><tr><td class="confluenceTd">IDLE TIME FORCE LOG OUT</td><td class="confluenceTd">유휴세션 강제 로그아웃 (초단위)</td><td class="confluenceTd">1800</td></tr><tr><td class="confluenceTd">MAXIMUM NUMBER OF SIMULTANEOUS LOGGED IN SESSIONS</td><td class="confluenceTd">최대 동시 로그인 세션수</td><td class="confluenceTd">-1 (비활성화)</td></tr><tr><td class="confluenceTd">ENABLE HTTP BASIC AUTH</td><td class="confluenceTd">HTTP 인증기능 허용여부</td><td class="confluenceTd">활성화</td></tr><tr><td class="confluenceTd">ALLOW EXTERNAL USERS TO CREATE OAUTH2 TOKENS</td><td class="confluenceTd">외부사용자가 OATUTH2 토큰 생성 허용여부</td><td class="confluenceTd">비활성화</td></tr><tr><td class="confluenceTd">LOGIN REDIRECT OVERRIDE URL</td><td class="confluenceTd">미로그인 사용자가 로그인 하도록 리다이렉션 URL</td><td class="confluenceTd">공란인 경우 기본 로그인 페이지</td></tr><tr><td class="confluenceTd">ACCESS TOKEN EXPIRATION</td><td class="confluenceTd">엑세스 토큰 유효기간 (초단위)</td><td class="confluenceTd">31536000000</td></tr><tr><td class="confluenceTd">REFRESH TOKEN EXPIRATION</td><td class="confluenceTd">토큰 만료시 지속시간 (초단위)</td><td class="confluenceTd">2628000</td></tr><tr><td class="confluenceTd">AUTHORIZATION CODE EXPIRATION</td><td class="confluenceTd">로그인시 생서되는 인증코드 유효기간 (초단위)</td><td class="confluenceTd">600</td></tr><tr><td class="confluenceTd">REMOTE HOST HEADER</td><td class="confluenceTd">원격 호스트 IP / 호스트이름 추가</td><td class="confluenceTd">기본값 : REMOTE\_ADDR, REMOTE\_HOST 리버스 프록시ip가 있는 경우 HTTP\_X\_FORWARDED\_FOR 추가</td></tr><tr><td class="confluenceTd">CUSTOM VIRTUAL ENVIRONMENT PATHS</td><td class="confluenceTd">가상의 환경값 설정 경로</td><td class="confluenceTd">비활성화</td></tr><tr><td class="confluenceTd">GATHER DATA FOR AUTOMATION ANAYTICS</td><td class="confluenceTd">AWX-UI에서 수집된 데이터를 Redhat으로 전달</td><td class="confluenceTd">비활성화</td></tr><tr><td class="confluenceTd">RED HAT CUSTOMER USERNAME</td><td class="confluenceTd">redhat 고객 ID</td><td class="confluenceTd">Redhat과 별도 계약시 사용가능</td></tr><tr><td class="confluenceTd">RED HAT CUSTOMER PASSWORD</td><td class="confluenceTd">redhat 고객 password</td><td class="confluenceTd">Redhat과 별도 계약시 사용가능</td></tr><tr><td class="confluenceTd">AUTOMATION ANALYTICS UPLOAD URL</td><td class="confluenceTd">자동화 분석을 위한 업로드 URL</td><td class="confluenceTd">자동화 분석 미사용</td></tr><tr><td class="confluenceTd">AUTOMATION ANALYTICS GATHER INTERVAL</td><td class="confluenceTd">자동화 분석을 위한 수집간격</td><td class="confluenceTd">자동화 분석 미사용</td></tr></tbody></table>
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. 항목별 상세설명 <table class="confluenceTable wrapped" data-ke-align="alignLeft" style="height: 77px; width: 100.053%;"><colgroup><col style="width: 44.4366%;"></col><col style="width: 32.2465%;"></col><col style="width: 23.3699%;"></col></colgroup><thead><tr><td class="confluenceTh align-center">**항 목**</td><td class="confluenceTh align-center">**설 명**</td><td class="confluenceTh align-center">**비 고**</td></tr></thead><tbody><tr><td class="confluenceTd">USER ANALYTICS TRACKING STATE</td><td class="confluenceTd">사용자 분석 추적기능 활성화</td><td class="confluenceTd">미사용</td></tr><tr><td class="confluenceTd">CUSTOM LOGO</td><td class="confluenceTd">사용자 로그인시 노출될 이미지</td><td class="confluenceTd">필요시 이미지 추가</td></tr><tr><td class="confluenceTd">CUSTOM LOGIN INFO</td><td class="confluenceTd">로그인시 추가 텍스트 입력</td><td class="confluenceTd">필요시 입력</td></tr></tbody></table>

</div><div class="text-muted text-small"><div class="entity-meta"> </div><div class="entity-meta"> </div></div></div>

# 10 - 데이터 백업/복구

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="border-collapse: collapse; width: 100%; height: 460.188px;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr style="height: 430.391px;"><td style="height: 430.391px;">[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/7G6image.png)](http://igoni.kr/uploads/images/gallery/2025-06/7G6image.png)

</td></tr><tr style="height: 29.7969px;"><td class="align-right" style="height: 29.7969px;">perplexity에서 생성한 AI이미지</td></tr></tbody></table>

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

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/LhTimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/LhTimage.png)

</td></tr><tr><td class="align-right">perplexity에서 생성한 AI이미지</td></tr></tbody></table>

#### 사전정보

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)

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="border-collapse: collapse; width: 100%; height: 460.188px;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr style="height: 430.391px;"><td style="height: 430.391px;">[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/inRimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/inRimage.png)

</td></tr><tr style="height: 29.7969px;"><td class="align-right" style="height: 29.7969px;">perplexity에서 생성한 AI이미지</td></tr></tbody></table>


### 발생현상 및 조치방법

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.
    ```

# git 기본정보

## git 소개

\- 분산파일 시스템

 subversion : 파일변화를 시간단위로 관리

 git : 스냅샷형태로 관리

<div class="wikimodel-emptyline" id="bkmrk-">  
</div> commited : 데이터에 DB에 저장

 modified : 수정한 파일이 DB에 커밋되지 않음

 staged : 수정한 파일을 커밋

<div class="wikimodel-emptyline" id="bkmrk--0">  
</div> working tree의 파일 수정

<div class="wikimodel-emptyline" id="bkmrk--1">  
</div> staging : 커밋한 스냅샷 생성, staging에 커밋해서 git에 업로드

<div class="wikimodel-emptyline" id="bkmrk--2">  
</div> tracked : git이 관리하는 파일

\- unmodifed : 수정되지 않은 상태

\- modified : 수정된 파일

\- staged : 커밋후 저장소 기록예정

 untracked : git이 관리하지 않는 파일

<div class="wikimodel-emptyline" id="bkmrk--3">  
</div> author : 원작자

 committer : 수정자

<div class="wikimodel-emptyline" id="bkmrk--4">  
</div> git add를 복구할때

 -&gt; git reset HEAD 파일명

 리모트 저장소는 origin이 자동등록

<div class="wikimodel-emptyline" id="bkmrk--5">  
</div> git remote add {name} URL

 git fetch {name}

\--&gt; origin으로 입력하면 clone이후 수정한 모든 데이터를 가지고 옴

<div class="wikimodel-emptyline" id="bkmrk--6">  
</div> 리모트 저장소에 push방법

 -&gt; git push origin master

 -&gt; 다름사람이 push한내용은 push 불가

-&gt; merge 후 push 가능

<div class="wikimodel-emptyline" id="bkmrk--7">  
</div>태그 : 2가지 형태의 태그 기능

 light weight : 특정커밋의 포인터 이름

 -&gt; git tag {tagname}

 annotated : 일반적인 태그 방법

 -&gt; git tag -a {tagname}

<div class="wikimodel-emptyline" id="bkmrk--8">  
</div> 특정커밋의 태그 확인

 -&gt; git log --pretty=online

<div class="wikimodel-emptyline" id="bkmrk--9">  
</div> 태깅할 체크썸 확인

 -&gt; git tag -a {tagname} 체크섬 전부 다 입력할 필요는 없고 앞 7자리만 알고 있으면 됨(고유번호)

<div class="wikimodel-emptyline" id="bkmrk--10">  
</div>태그 공유

 -&gt; git push origin {tagname}

 \* 여러개인 경우 git push origin --tags

<div class="wikimodel-emptyline" id="bkmrk--11">  
</div>특정 태그 checkout

 -&gt; git checkout {tagname}

 \* detached HEAD(떨어져나온 HEAD) 메시지 출력(정상)

 \* 브랜치에서 작업하는 것과 다르게 작동하게 됨

 커밋하게 되면 생성된 커밋을 사용할 수 있는 브랜치가 다르기 때무네 가급적 브랜치를 이용해서 관리

<div class="wikimodel-emptyline" id="bkmrk--12">  
</div>브랜치

 staging area : 스냅샷에 대한 메타 데이터, 이전커밋의 포인터 정보 저장

 파일을 stage하면 저장소에 파일 저장(이를 Blob라고 호칭)

 기본적으로 master 브랜치 생성된

<div class="wikimodel-emptyline" id="bkmrk--13">  
</div> 브랜치 생성 -&gt; git branch {branchname}

 브랜치 이동 -&gt; git checkout {branchname}

 프랜치 생성하면서 체크아웃 -&gt; git checkout -b {branchname}

<div class="wikimodel-emptyline" id="bkmrk--14">  
</div><div class="wikimodel-emptyline" id="bkmrk--15">  
</div>머지

 git merge {branchname}

 \* fast-forward : 브랜치 포인터는 자동으로 최신커밋이동

<div class="wikimodel-emptyline" id="bkmrk--16">  
</div> 브랜치 삭제 : git branch -d {branchname}

<div class="wikimodel-emptyline" id="bkmrk--17">  
</div> 만약 개발자가 개발중에 이슈처리를 하게 되는 경우

 git checkout {branchname}

<div class="wikimodel-emptyline" id="bkmrk--18">  
</div> 이슈 처리 후 머지하는 경우

git checkout master

git merge {branchname}

<div class="wikimodel-emptyline" id="bkmrk--19">  
</div> 머지 충돌

 3way merge으로 수행하는 경우 두 브랜치에서 같은 파일을 수정할때 발생

 &lt;&lt;&lt; --&gt; 이건 HEAD버전

 &gt;&gt;&gt; --&gt; 이건 현재 버전

<div class="wikimodel-emptyline" id="bkmrk--20">  
</div> 브랜치의 머지 여부 확인 git branch --merge / --no-merged

 머지하지 않은 브랜치 삭제는 -D 사용

<div class="wikimodel-emptyline" id="bkmrk--21">  
</div>브랜치 관리 전략

 3way merge이기 때문에 자이간에 걸쳐서 한브랜치를 다른 브랜치와 여러번 머지하는것이 쉬움.

# 1. Saltstack소개

Saltstack은 IaC를 완성하는 Tool로, 대표적인건 [Ansible 기술정보](http://igoni.kr/books/iac/chapter/ansible "Ansible 기술정보") 이 있죠  
이번엔 Ansible대신, Saltstack을 소개하고, Ansible과 어떤점이 다른지 비교해보죠.

1. 기능  
    <table border="1" style="border-collapse: collapse; width: 100%; height: 118.4px; border-width: 1px; border-style: outset;"><colgroup><col style="width: 33.2797%;"></col><col style="width: 33.2797%;"></col><col style="width: 33.2797%;"></col></colgroup><tbody><tr style="height: 29.6px;"><td style="height: 29.6px; border-width: 1px;">  
    </td><td style="height: 29.6px; border-width: 1px;">**Ansible**</td><td style="height: 29.6px; border-width: 1px;">**Saltstack**</td></tr><tr style="height: 29.6px;"><td style="height: 29.6px; border-width: 1px;">라이센스</td><td style="height: 29.6px; border-width: 1px;">GPL</td><td style="height: 29.6px; border-width: 1px;">Apache License 2.0</td></tr><tr style="height: 29.6px;"><td style="height: 29.6px; border-width: 1px;">배포방식</td><td style="height: 29.6px; border-width: 1px;">Push</td><td style="height: 29.6px; border-width: 1px;">Push</td></tr><tr style="height: 29.6px;"><td style="height: 29.6px; border-width: 1px;">배포언어</td><td style="height: 29.6px; border-width: 1px;">yaml</td><td style="height: 29.6px; border-width: 1px;">yaml</td></tr><tr><td style="border-width: 1px;">접속방식</td><td style="border-width: 1px;">Linux - ssh, Windows - winrm</td><td style="border-width: 1px;">agent(minion), salt-ssh</td></tr><tr><td style="border-width: 1px;">WebUI</td><td style="border-width: 1px;">AWX / Ansible Tower</td><td style="border-width: 1px;">△</td></tr><tr><td style="border-width: 1px;">Site</td><td style="border-width: 1px;">[http://ansible.com](http://ansible.com)
    
    </td><td style="border-width: 1px;">[http://saltstackproject.io](https://saltproject.io/)
    
    </td></tr></tbody></table>
    
    Saltstack WebUI중, saltpad, saltgui 가 있는듯 한데, 최신버전에서는 정상적으로 작동하지 않네요.

# Gitlab 미러링 구성

<div class="page-content" id="bkmrk-%C2%A0"><div class="page-content"><div dir="auto"><div style="clear: left;"> </div></div></div></div>사전정보

<div class="page-content" id="bkmrk-gitlab%EC%84%A4%EC%B9%98---gitlab%EC%84%A4%EC%B9%98-"><div class="page-content"><div dir="auto">1. gitlab설치 - [gitlab설치](http://igoni.kr/books/5-iac/page/gitlab-Z3E "gitlab설치")
2. Gitlab에서 Mirror용 계정은 sync계정이고, root 그룹에 소속되어 있음. (미러링 받는서버에 계정이 생성되어 있어야 함)
3. gitlab 동기화 시간은 매 5분간격으로 동기화 수행함

</div></div></div>미러링 구성

<div class="page-content" id="bkmrk-%EC%A0%84%EC%86%A1%ED%95%A0-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%A0%95-%EC%A0%84%EC%86%A1%ED%95%A0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%A4"><div class="page-content"><div dir="auto">1. 전송할 서버 설정 
    1. 전송할 프로젝트 설정  
        [![image.png](http://igoni.kr/uploads/images/gallery/2023-05/embedded-image-xjyholka.png)](http://igoni.kr/uploads/images/gallery/2022-09/l6oimage.png)
    2. 세부설정값 
        - Git repository URL : 수신 gitlab url (계정명 포함, htp://sync@192.168.100.200:8080/test/test.git)
        - mirror direction : 커뮤니티 버전은 push만 가능
        - authentication method : Password
        - Password :Mirror Repository 버튼 선택
        - Mirror Repository 선택 후 동기화 선택
        - Only mirror protected branches 체크는 해제. 체크되어 있는 경우 master 브랜치를 제외한 나머지 브랜치는 동기화 안됨
2. 수신할 서버 설정 
    1. 새로운 프로젝트 설정  
        [![image.png](http://igoni.kr/uploads/images/gallery/2023-05/embedded-image-ddrrlmek.png)](http://igoni.kr/uploads/images/gallery/2022-09/TCsimage.png)

</div>---

<div class="text-muted text-small">  
</div></div></div>

# puppet 기술정보

# centos에서 puppet 설치하기

### 구성정보

1. Master machine 
    1. ip : 192.168.10.10 / master.localdomain / Centos6
2. Agent machine 
    1. ip : 192.168.10.100 / agent.localdomain / Centos6

### 공통작업

1. 리포지터리 추가 ```shell
    $> rpm -Uvh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
    Retrieving http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
    warning: /var/tmp/rpm-tmp.Ze6mXg: Header V4 RSA/SHA1 Signature, key ID 4bd6ec30: NOKEY
    Preparing...                ########################################### [100%]
           package puppetlabs-release-6-11.noarch is already installed
    ```

### 서버 구성하기

1. 마스터서버 작업하기1. 패키지 설치
    
    ```shell
    [root@master ~]# yum install puppet-server -y
    ===============================================================================================
     Package                Arch         Version                   Repository                 Size
    ===============================================================================================
    Installing:
     puppet-server          noarch       3.8.2-1.el6               puppetlabs-products        24 k
    Installing for dependencies:
     augeas-libs            x86_64       1.0.0-10.el6              base                      314 k
     compat-readline5       x86_64       5.2-17.1.el6              base                      130 k
     facter                 x86_64       1:2.4.4-1.el6             puppetlabs-products        99 k
     hiera                  noarch       1.3.4-1.el6               puppetlabs-products        23 k
     libselinux-ruby        x86_64       2.0.94-5.8.el6            base                      100 k
     puppet                 noarch       3.8.2-1.el6               puppetlabs-products       1.6 M
     ruby                   x86_64       1.8.7.374-4.el6_6         base                      538 k
     ruby-augeas            x86_64       0.4.1-3.el6               puppetlabs-deps            21 k
     ruby-irb               x86_64       1.8.7.374-4.el6_6         base                      317 k
     ruby-libs              x86_64       1.8.7.374-4.el6_6         base                      1.7 M
     ruby-rdoc              x86_64       1.8.7.374-4.el6_6         base                      381 k
     ruby-shadow            x86_64       1:2.2.0-2.el6             puppetlabs-deps            13 k
     rubygem-json           x86_64       1.5.5-3.el6               puppetlabs-deps           763 k
     rubygems               noarch       1.3.7-5.el6               base                      207 k
     
    Transaction Summary
    ===============================================================================================
    Install      15 Package(s)
    ```
    
    <div><div><div class="box"><div class="code"><div class="linenoswrapper"><div></div></div></div></div></div>
    1. config 수정하기 ```shell
        [root@master ~]# vi /etc/puppet/puppet.conf
        [main]
           # The Puppet log directory.
           # The default value is '$vardir/log'.
           logdir = /var/log/puppet
         
           # Where Puppet PID files are kept.
           # The default value is '$vardir/run'.
           rundir = /var/run/puppet
         
           # Where SSL certificates are kept.
           # The default value is '$confdir/ssl'.
           ssldir = $vardir/ssl
           moduledir = /etc/puppet/modules
         
        [agent]
           # The file in which puppetd stores a list of the classes
           # associated with the retrieved configuratiion.  Can be loaded in
           # the separate ``puppet`` executable using the ``--loadclasses``
           # option.
           # The default value is '$confdir/classes.txt'.
           classfile = $vardir/classes.txt
         
           # Where puppetd caches the local configuration.  An
           # extension indicating the cache format is added automatically.
           # The default value is '$confdir/localconfig'.
           localconfig = $vardir/localconfig
         
        [master]
          certname = master.localdomain
        moduledir 경로추가, certname = master.localdomain에 master호스트네임 기재
        ```
    2. 패키지 업그레이드 ```shell
        [root@master ~]# puppet resource package puppet-server ensure=latest
        package { 'puppet-server':
         ensure => '3.8.2-1.el6',
        }
        ```
    3. 서비스 시작 ```shell
        [root@master ~]# /etc/init.d/puppetmaster start
        Starting puppetmaster:                                     [  OK  ]
        ```
    4. 포트상태 확인 ```shell
        [root@master ~]# netstat -antp | grep LISTEN
        tcp        0      0 0.0.0.0:8140                0.0.0.0:*                   LISTEN      1127/ruby
        tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      878/sshd
        tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      897/sendmail
        tcp        0      0 :::22                       :::*                        LISTEN      878/sshd
        * tcp/8140번 포트가 오픈되어 있는지 확인.
        ```
    
    </div>
2. Agent 작업하기1. 패키지 설치
    
    ```shell
    [root@agent ~]# yum install puppet -y
     
    ===============================================================================================
     Package                Arch         Version                   Repository                 Size
    ===============================================================================================
    Installing:
     puppet                 noarch       3.8.2-1.el6               puppetlabs-products       1.6 M
    Installing for dependencies:
     augeas-libs            x86_64       1.0.0-10.el6              base                      314 k
     compat-readline5       x86_64       5.2-17.1.el6              base                      130 k
     facter                 x86_64       1:2.4.4-1.el6             puppetlabs-products        99 k
     hiera                  noarch       1.3.4-1.el6               puppetlabs-products        23 k
     libselinux-ruby        x86_64       2.0.94-5.8.el6            base                      100 k
     ruby                   x86_64       1.8.7.374-4.el6_6         base                      538 k
     ruby-augeas            x86_64       0.4.1-3.el6               puppetlabs-deps            21 k
     ruby-irb               x86_64       1.8.7.374-4.el6_6         base                      317 k
     ruby-libs              x86_64       1.8.7.374-4.el6_6         base                      1.7 M
     ruby-rdoc              x86_64       1.8.7.374-4.el6_6         base                      381 k
     ruby-shadow            x86_64       1:2.2.0-2.el6             puppetlabs-deps            13 k
     rubygem-json           x86_64       1.5.5-3.el6               puppetlabs-deps           763 k
     rubygems               noarch       1.3.7-5.el6               base                      207 k
     
    Transaction Summary
    ===============================================================================================
    Install      14 Package(s)
    ```
    
    <div><div><div class="box"><div class="code"><div class="linenoswrapper"><div></div></div></div></div></div>
    1. 설정파일 수정 ```shell
        [root@agent ~]# vi /etc/puppet/puppet.conf
        [main]
           # The Puppet log directory.
           # The default value is '$vardir/log'.
           logdir = /var/log/puppet
         
           # Where Puppet PID files are kept.
           # The default value is '$vardir/run'.
           rundir = /var/run/puppet
         
           # Where SSL certificates are kept.
           # The default value is '$confdir/ssl'.
           ssldir = $vardir/ssl
         
        [agent]
           # The file in which puppetd stores a list of the classes
           # associated with the retrieved configuratiion.  Can be loaded in
           # the separate ``puppet`` executable using the ``--loadclasses``
           # option.
           # The default value is '$confdir/classes.txt'.
           classfile = $vardir/classes.txt
         
           # Where puppetd caches the local configuration.  An
           # extension indicating the cache format is added automatically.
           # The default value is '$confdir/localconfig'.
           localconfig = $vardir/localconfig
           certname=agent.localdomain
           runinterval = 60
        certname = 에이전트 호스트네임 추가, runinterval은 업데이트 주기(초단위)로 설정하면 됨.
        
        [root@agent ~]# vi /etc/sysconfig/puppet
         
        # The puppetmaster server
        PUPPET_SERVER=master.localdomain
         
        # If you wish to specify the port to connect to do so here
        #PUPPET_PORT=8140
         
        # Where to log to. Specify syslog to send log messages to the system log.
        PUPPET_LOG=/var/log/puppet/puppet.log
         
        # You may specify other parameters to the puppet client here
        #PUPPET_EXTRA_OPTS=--waitforcert=500
        PUPPET_SERVER에 마스터 서버 호스트네임 입력
        PUPPET_LOG에 에이전트 로그파일 파일명 입력
        ```
    2. 서비스 시작 ```shell
        [root@agent ~]# /etc/init.d/puppet start
        Starting puppet agent:                                     [  OK  ]
        [root@agent ~]# ps -ef | grep puppet
        root      1072     1  3 16:03 ?        00:00:00 /usr/bin/ruby /usr/bin/puppet agent --server=master.localdomain --logdest=/var/log/puppet/puppet.log
        * 프로세스 실핵확인하면 됨
        ```
    
    </div>

### 서버 연동하기

1. 마스터서버에서 인증작업하기
    
    <div><div>  
    </div>
    1. 인증이 필요한 클라이언트 확인 ```shell
        [root@master ~]# puppet cert --sign --list
         "agent.localdomain" (SHA256) 52:0D:EF:51:BB:50:99:FE:BC:6D:2F:33:CC:A9:43:73:3B:1C:C6:A1:D6:4C:D2:13:DE:AA:75:E9:7E:D2:2A:E5
        * 도메인 옆에 +기호가 붙어있으면 인증이 완료된 에이전트 입니다.
        ```
    2. 에이전트 인증작업 수행 ```shell
        [root@master ~]# puppet cert --sign agent.localdomain
        Notice: Signed certificate request for agent.localdomain
        Notice: Removing file Puppet::SSL::CertificateRequest agent.localdomain at '/var/lib/puppet/ssl/ca/requests/agent.localdomain.pem'
        ```
    3. 인증완료여부 확인 ```shell
        [root@master ~]# puppet cert --sign --all --list
        + "agent.localdomain"  (SHA256) 9C:18:CA:26:73:CA:65:96:85:07:B1:F4:B7:A3:2C:43:FA:EE:63:3C:A7:A3:6C:CD:A2:51:5B:81:D2:E5:2D:3F
        도메인 옆에 +기호가 생기면 완료.
        ```
        
        <div><div class="box"><div class="code"><div class="linenoswrapper"><div class="linenos">   
        연동이 잘 되었는지 테스트.</div></div></div></div></div>
    4. 아래 경로에서 파일생성 ```shell
        [root@master ~]# cat /etc/puppet/manifests/site.pp
        file {
        '/tmp/hello' :
         owner => root,
         group => root,
         mode => 444,
         content => "Hello Pupplet
        by Machine\n";
        }
        ```
        
        <div><div class="box"><div class="code"><div class="linenoswrapper"><div>  
        * /tmp/hello 파일이 생성되는데, 생성시 root의 사용자와 그룹으로 지정하여 생성하고  
        퍼미션은 444(read)생성하되, 텍스트 데이터는 Hello Pupplet라는 데이터로 저장</div></div></div></div></div>
    5. pupplet 적용하기 ```shell
        [root@master ~]# puppet apply  /etc/puppet/manifests/site.pp
        Notice: Compiled catalog for master in environment production in 0.17 seconds
        Notice: /Stage[main]/Main/File[/tmp/hello]/content: content changed '{md5}723c9d4525cebf11f4e6171740b15abd' to '{md5}7b1d27a85c9ebf03075ee2150fb4d770'
        Notice: Finished catalog run in 0.09 seconds
        에이전트)
        /tmp/hello파일이 생성되었는지 확인
        ```
    
    </div>
2. Agent 작업하기 ```shell
    [root@agent ~]# ls -l /tmp/hello
    -r--r--r-- 1 root root 25 Sep 14 16:11 /tmp/hello
    [root@agent ~]# cat /tmp/hello
    Hello Pupplet
    by Machine
    ```

- /tmp/hello파일이 생성되었는지 확인

<div class="wikimodel-emptyline" id="bkmrk-">  
</div>*Reference*

- *<span class="wikiexternallink">[<span class="wikigeneratedlinkcontent">https://docs.puppetlabs.com/guides/install\_puppet/install\_el.html?\_ga=1.81661140.2146970350.1440482857//</span>](https://docs.puppetlabs.com/guides/install_puppet/install_el.html?_ga=1.81661140.2146970350.1440482857//)</span>*
- *<span class="wikiexternallink">[<span class="wikigeneratedlinkcontent">http://ora-sysdba.tistory.com/entry/Infra-%EC%84%9C%EB%B2%84%EA%B4%80%EB%A6%AC%EC%9D%98-%ED%9A%A8%EC%9C%A8%ED%99%94-Puppet-%EC%84%A4%EC%B9%98//</span>](http://ora-sysdba.tistory.com/entry/Infra-%EC%84%9C%EB%B2%84%EA%B4%80%EB%A6%AC%EC%9D%98-%ED%9A%A8%EC%9C%A8%ED%99%94-Puppet-%EC%84%A4%EC%B9%98//)</span>*

# puppet 에이전트 설정값 확인

puppet agent 설정값 확인하고 싶을때

```shell
$> puppet agent --configprint all

```

# gitlab버전정보 확인방법

gitlab 설치된 버전정보

```bash
# gitlab-rake gitlab:env:info
 
 
 
System information
System:
Current User:   git
Using RVM:      no
Ruby Version:   2.6.3p62
Gem Version:    2.7.9
Bundler Version:1.17.3
Rake Version:   12.3.3
Redis Version:  3.2.12
Git Version:    2.22.0
Sidekiq Version:5.2.7
Go Version:     unknown
 
GitLab information
Version:        12.4.2
Revision:       393a5bdafa2
Directory:      /opt/gitlab/embedded/service/gitlab-rails
DB Adapter:     PostgreSQL
DB Version:     10.9
URL:            http://192.168.100.20:8080
HTTP Clone URL: http://192.168.100.20:8080/some-group/some-project.git
SSH Clone URL:  git@192.168.100.20:some-group/some-project.git
Using LDAP:     no
Using Omniauth: yes
Omniauth Providers:
 
GitLab Shell
Version:        10.2.0
Repository storage paths:
- default:      /var/opt/gitlab/git-data/repositories
GitLab Shell path:              /opt/gitlab/embedded/service/gitlab-shell
Git:            /opt/gitlab/embedded/bin/git
```

# gitlab설치

Gitlab 설치 가이드

1. 설치파일 다운로드 ```shell
    $ curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
    ```
2. Gitlab config 설정(변경이 필요한 사항만 기재) ```shell
     $> vi /etc/gitlab/gitlab.rb
    #################################################
    external_url 'http://{{서버IP}}:8080'
    
    gitlab_rails['artifacts_path'] = "/opt/gitlab/gitlab-rails/shared/artifacts"
    gitlab_rails['external_diffs_storage_path'] = "/opt/gitlab/gitlab-rails/shared/external-diffs"
    gitlab_rails['lfs_enabled'] = true
    gitlab_rails['lfs_storage_path'] = "/opt/gitlab/gitlab-rails/shared/lfs-objects"
    gitlab_rails['backup_path'] = "/opt/gitlab/backups"
    gitlab_rails['shared_path'] = '/opt/gitlab/gitlab-rails/shared'
    gitlab_rails['dir'] = "/opt/gitlab/gitlab-rails"
    gitlab_rails['uploads_directory'] = "/opt/gitlab/gitlab-rails/uploads"
    gitlab_rails['redis_socket'] = "/opt/gitlab/redis/redis.socket"
    gitlab_rails['registry_path'] = "/opt/gitlab/gitlab-rails/shared/registry"
    gitlab_rails['registry_key_path'] = "/opt/gitlab/gitlab-rails/certificate.key"
    
    registry['dir'] = "/opt/gitlab/registry"
    registry['rootcertbundle'] = "/opt/gitlab/registry/certificate.crt"
    
    gitlab_workhorse['listen_addr'] = "/opt/gitlab/gitlab-workhorse/socket"
    gitlab_workhorse['auth_backend'] = "http://localhost:8080"
    gitlab_workhorse['dir'] = "/opt/gitlab/gitlab-workhorse"
    
    user['home'] = "/opt/gitlab"
    
    unicorn['port'] = 8080
    unicorn['socket'] = '/opt/gitlab/gitlab-rails/sockets/gitlab.socket'
    
    puma['socket'] = '/opt/gitlab/gitlab-rails/sockets/gitlab.socket'
    
    gitlab_shell['auth_file'] = "/opt/gitlab/.ssh/authorized_keys"
    gitlab_shell['dir'] = "/opt/gitlab/gitlab-shell"
    
    postgresql['port'] = 25432
    postgresql['data_dir'] = "/opt/gitlab/postgresql/data"
    postgresql['shared_buffers'] = "3GB"
    postgresql['dir'] = "/opt/gitlab/postgresql"
    postgresql['home'] = "/opt/gitlab/postgresql"
    
    redis['enable'] = true
    redis['dir'] = "/opt/gitlab/redis"
    redis['maxclients'] = "20000"
    redis['maxmemory'] = "128m"
    redis['maxmemory_policy'] = "allkeys-lru"
    redis['maxmemory_samples'] = "5"
    redis['tcp_backlog'] = 511
    redis['tcp_timeout'] = "120"
    redis['tcp_keepalive'] = "300"
    
    web_server['home'] = '/opt/gitlab/nginx'
    nginx['dir'] = "/opt/gitlab/nginx"
    
    gitlab_pages['dir'] = "/opt/gitlab/gitlab-pages"
    
    gitlab_rails['pages_path'] = "/opt/gitlab/gitlab-rails/shared/pages"
    gitlab_ci['builds_directory'] = '/opt/gitlab/gitlab-ci/builds'
    
    mattermost['home'] = '/opt/gitlab/mattermost'
    mattermost['file_directory'] = "/opt/gitlab/mattermost/data"
    mattermost['plugin_directory'] = "/opt/gitlab/mattermost/plugins"
    mattermost['plugin_client_directory'] = "/opt/gitlab/mattermost/client-plugins"
    
    prometheus['home'] = '/opt/gitlab/prometheus'
    prometheus['log_directory'] = '/var/log/gitlab/prometheus'
    prometheus['rules_files'] = ['/opt/gitlab/prometheus/rules/*.rules']
     prometheus['flags'] = {
      'storage.tsdb.path' => "/opt/gitlab/prometheus/data",
      'storage.tsdb.retention.time' => "15d",
      'config.file' => "/opt/gitlab/prometheus/prometheus.yml"
    }
    
    alertmanager['home'] = '/opt/gitlab/alertmanager'
    alertmanager['flags'] = {
      'storage.path' => "/opt/gitlab/alertmanager/data",
      'config.file' => "/opt/gitlab/alertmanager/alertmanager.yml"
    }
    
    node_exporter['home'] = '/opt/gitlab/node-exporter'
     node_exporter['flags'] = {
      'collector.textfile.directory' => "/opt/gitlab/node-exporter/textfile_collector"
    }
    
     redis_exporter['flags'] = {
      'redis.addr' => "unix:///opt/gitlab/redis/redis.socket",
    }
    
    postgres_exporter['home'] = '/opt/gitlab/postgres-exporter'
    
    gitlab_exporter['home'] = "/opt/gitlab/gitlab-exporter"
    
    grafana['home'] = '/opt/gitlab/grafana'
    
    gitaly['dir'] = "/opt/gitlab/gitaly"
     gitaly['env'] = {
     'PATH' => "/opt/gitlab/bin:/opt/gitlab/embedded/bin:/bin:/usr/bin",
     'HOME' => '/opt/gitlab'
    }
     gitaly['socket_path'] = "/opt/gitlab/gitaly/gitaly.socket"
     gitaly['certificate_path'] = "/opt/gitlab/gitaly/certificate.pem"
     gitaly['key_path'] = "/opt/gitlab/gitaly/key.pem"
    
    storage_check['target'] = 'unix:///opt/gitlab/gitlab-rails/sockets/gitlab.socket'
    
    letsencrypt['wwwroot'] = '/opt/gitlab/nginx/www'
    
    gitlab_rails['packages_storage_path'] = "/opt/gitlab/gitlab-rails/shared/packages"
    gitlab_rails['dependency_proxy_storage_path'] = "/opt/gitlab/gitlab-rails/shared/dependency_proxy"
    ```
3. Gitlab구성 ```shell
    $> gitlab-ctl reconfigure
    ...
    $>  gitlab-ctl status
    run: alertmanager: (pid 53654) 128s; run: log: (pid 51389) 343s
    run: gitaly: (pid 53701) 127s; run: log: (pid 50464) 435s
    run: gitlab-exporter: (pid 53722) 127s; run: log: (pid 51157) 363s
    run: gitlab-workhorse: (pid 53725) 127s; run: log: (pid 50986) 382s
    run: grafana: (pid 53749) 126s; run: log: (pid 51725) 300s
    run: logrotate: (pid 53765) 126s; run: log: (pid 51079) 373s
    run: nginx: (pid 53773) 125s; run: log: (pid 51012) 381s
    run: node-exporter: (pid 53781) 125s; run: log: (pid 51118) 369s
    run: postgres-exporter: (pid 53788) 125s; run: log: (pid 51435) 339s
    run: postgresql: (pid 53874) 124s; run: log: (pid 50596) 428s
    run: prometheus: (pid 53883) 124s; run: log: (pid 51320) 349s
    run: redis: (pid 53898) 123s; run: log: (pid 50307) 457s
    run: redis-exporter: (pid 53973) 123s; run: log: (pid 51250) 357s
    run: sidekiq: (pid 53987) 120s; run: log: (pid 50943) 386s
    run: unicorn: (pid 53999) 119s; run: log: (pid 50895) 394s
    ```
4. redis socket 파일 위치 변경 ( gitlab-ctl status 실행결과시 redis가 down되어 있는 경우 조치) ```shell
    $> vi /opt/gitlab/redis/redis.conf
    ...
    unixsocket /opt/gitlab/redis/redis.socket
    ...
    ```
5. gitlab 재시작 후 상태 확인 ```shell
    $> gitlab-ctl restart
    $> gitlab-ctl status
    run: alertmanager: (pid 13812) 32s; run: log: (pid 10837) 369s
    run: gitaly: (pid 13828) 31s; run: log: (pid 9829) 454s
    run: gitlab-exporter: (pid 13851) 31s; run: log: (pid 10641) 388s
    run: gitlab-workhorse: (pid 13862) 30s; run: log: (pid 10372) 410s
    run: grafana: (pid 13878) 30s; run: log: (pid 11193) 334s
    run: logrotate: (pid 13892) 30s; run: log: (pid 10493) 400s
    run: nginx: (pid 13898) 29s; run: log: (pid 10425) 406s
    run: node-exporter: (pid 13907) 29s; run: log: (pid 10532) 396s
    run: postgres-exporter: (pid 13990) 28s; run: log: (pid 10911) 364s
    run: postgresql: (pid 14000) 28s; run: log: (pid 9974) 446s
    run: prometheus: (pid 14009) 27s; run: log: (pid 10769) 376s
    run: redis: (pid 14024) 27s; run: log: (pid 9733) 460s
    run: redis-exporter: (pid 14031) 27s; run: log: (pid 10695) 382s
    run: sidekiq: (pid 14038) 26s; run: log: (pid 10323) 416s
    run: unicorn: (pid 14050) 25s; run: log: (pid 10280) 421s
    ```

# Harbor 설치가이드

### Harbor 설치

1. 사양정보
2. hardware spec <div><table><tbody><tr><th scope="col"> </th><th scope="col">**최소사양**</th><th scope="col">**권장사양**</th></tr><tr><td>CPU</td><td>2Core</td><td>4 Core</td></tr><tr><td>Memory</td><td>4G</td><td>8G</td></tr><tr><td>Disk</td><td>40GB</td><td>160GB</td></tr></tbody></table>
    
    </div>
3. software spec <div><table><tbody><tr><th scope="col">**Software**</th><th scope="col">**Version**</th></tr><tr><td>Docker</td><td>17.06.0 이상</td></tr><tr><td>Docker Compose</td><td>1.18.0 이상</td></tr></tbody></table>
    
    </div>
4. Harbor설치 
    1. 설치파일 다운로드
    2. harbor설치파일 : Download URL : <span class="wikiexternallink">[https://github.com/goharbor/harbor/releases](https://github.com/goharbor/harbor/releases)</span>
    3. docker-compose : download URL : <span class="wikiexternallink">[https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)](https://github.com/docker/compose/releases/download/1.24.1/docker-compose-%24(uname%20-s)-%24(uname%20-m))</span>
5. 압축파일 해제 ```shell
    ># tar -xvf harbor-offline-installer-v1.7.6.tgz
    ```
6. 설정파일 변경 ```shell
    ># vi harbor.cfg
    hostname = harbor
    ```
7. Docker 실행시 iptables 정책 미생성 옵션 설정 ```shell
    ># cat /etc/docker/daemon.json
    {
    "iptables": false
    }
    ```

### Harbor 설정정보

<table id="bkmrk-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-%EC%A0%95%EB%B3%B4-%EC%9A%A9%C2%A0-%EB%8F%84-hostnam"><tbody><tr><th scope="col">**파라미터 정보**</th><th scope="col">**용 도**</th></tr><tr><td>hostname</td><td>설치하는 서버 호스트네임입력</td></tr><tr><td>Database-password</td><td>Postgres root 패스워드</td></tr><tr><td>Database-max\_idle\_conns</td><td>최대 유휴연결 수(0은 무제한), 기본값은 50</td></tr><tr><td>Database-max\_open\_conns</td><td>최대 연결 수(0은 무제한), 기본값은 100</td></tr><tr><td>data\_volume</td><td>Harbor에 저장할 데이터 경로(호스트경로), 기본값은 /data</td></tr><tr><td>Clair-updaters\_interval</td><td>Clair 업데이트 간격(0은 비활성화), 기본값은 12시간</td></tr><tr><td>max\_job\_workers</td><td>이미지 복제작업 최대 수, 기본값은 10</td></tr><tr><td>Notification-webhook\_job\_max\_retry</td><td>Webhook 최대 재시도 횟수, 기본값은 10</td></tr><tr><td>Chart-absolute\_url</td><td>Enable : 차트에서 사용할 절대URL경로  
disabled : 차트에서 사용할 상대URL경로

</td></tr><tr><td>log\_level</td><td>Debug, info, warning, error, fatal 중 선택, 기본값은 info</td></tr><tr><td>log\_rotate\_count</td><td>로그파일 최대 생성갯수, 기본값은 50</td></tr><tr><td>log\_rotate\_size</td><td>로그파일당 최대 사이즈, 기본값은 200M</td></tr><tr><td>log\_external\_endpoint</td><td>syslog연동시 사용</td></tr><tr><td>log\_location</td><td>로그를 저장할 디렉토리, 기본값은 /var/log/harbor</td></tr><tr><td>Proxy-http\_proxy</td><td>http프록시 사용시 설정</td></tr><tr><td>Proxy-https\_proxy</td><td>https프록시 사용시 설정</td></tr><tr><td>Proxy-no\_proxy</td><td>프록시 미사용시 설정</td></tr></tbody></table>

1. 설치수행 **(추후 속성변경 혹은 재설치시 필요한 파일들이기 때문에, 데이터 삭제하면 안됨)**<div><div class="box"><div class="code"> &gt;# install.sh</div></div></div>

1. 설치옵션 설정 <div><table><tbody><tr><th scope="col">**옵션정보**</th><th scope="col">**설 명**</th></tr><tr><td>--with-notary</td><td>https를 사용할 경우 설정</td></tr><tr><td>--with-clair</td><td>보안취약점에 대한 정적분석 기능 활성화</td></tr><tr><td>--with-chartmuseum</td><td>차트기능 활성화</td></tr></tbody></table>
    
    </div>
2. Docker Container 실행상태 확인 ```shell
    > # docker container ls
    CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS                    PORTS                                                              NAMES
    08ba147d3fe2        goharbor/nginx-photon:v1.7.6             "nginx -g 'daemon ..."   58 minutes ago      Up 21 minutes (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp   nginx
    4867028a2f0d        goharbor/harbor-portal:v1.7.6            "nginx -g 'daemon ..."   58 minutes ago      Up 21 minutes (healthy)   80/tcp                                                             harbor-portal
    dfca94c54bd5        goharbor/harbor-jobservice:v1.7.6        "/harbor/start.sh"       58 minutes ago      Up 21 minutes                                                                                harbor-jobservice
    debd6e8e8606        goharbor/harbor-core:v1.7.6              "/harbor/start.sh"       58 minutes ago      Up 21 minutes (healthy)                                                                      harbor-core
    e0b1a1d488b6        goharbor/clair-photon:v2.0.8-v1.7.6      "/docker-entrypoin..."   58 minutes ago      Up 21 minutes (healthy)   6060-6061/tcp                                                      clair
    b9ab0d96e2f4        goharbor/registry-photon:v2.6.2-v1.7.6   "/entrypoint.sh /e..."   58 minutes ago      Up 21 minutes (healthy)   5000/tcp                                                           registry
    0fe2e40d93f4        goharbor/harbor-db:v1.7.6                "/entrypoint.sh po..."   58 minutes ago      Up 21 minutes (healthy)   5432/tcp                                                           harbor-db
    97a3c0c4788a        goharbor/harbor-registryctl:v1.7.6       "/harbor/start.sh"       58 minutes ago      Up 21 minutes (healthy)                                                                      registryctl
    e8a73d34601c        goharbor/redis-photon:v1.7.6             "docker-entrypoint..."   58 minutes ago      Up 21 minutes             6379/tcp                                                           redis
    acb08e237de1        goharbor/harbor-adminserver:v1.7.6       "/harbor/start.sh"       58 minutes ago      Up 21 minutes (healthy)                                                                      harbor-adminserver
    2da452ad1ffe        goharbor/harbor-log:v1.7.6               "/bin/sh -c /usr/l..."   58 minutes ago      Up 21 minutes (healthy)   127.0.0.1:1514->10514/tcp                                          harbor-log
    ```
3. 웹 브라우저에서 harbor 로그인 (기본 로그인 정보 : admin / Harbor12345), **로그인 후 반드시 패스워드 변경 필요**

### Harbor 운영

1. 계정관리 
    1. 계정추가 
        1. Administration -&gt; Users 진입
        2. New User 선택 후 사용자명, email주소, 패스워드 순으로 입력  
              
            \* 패스워드는 8-20자, 최소 대소문자/숫자 1개씩 입력되어야 함
    2. 관리자 계정 권한 변경 
        1. Administratoration -&gt; User진입
        2. 변경할 계정명 선택 후 SetAdmin 선택
2. 프로젝트 관리 
    1. 프로젝트 생성 
        1. Project -&gt; NEW PROJECT -&gt; 생성할 Project이름 -&gt; 속성 입력  
            Access Level : 프로젝트의 공개여부 (Public으로 설정하는 경우 모든 계정에서 프로젝트가 조회됨), 기본값은 private
    2. 프로젝트 권한설정 
        1. 생성한 프로젝트 → Member 진입
        2. +USER 메뉴 선택 후 추가할 계정명 입력
        3. 부여할 권한 선택 <div><table><tbody><tr><th scope="col">**Role 이름**</th><th scope="col">**권 한**</th></tr><tr><td>Project Admin</td><td>push / pull / delete</td></tr><tr><td>Developer</td><td>push / pull</td></tr><tr><td>Guest</td><td>Pull</td></tr></tbody></table>
            
            </div>

### Harbor 재설정

1. Harbor 구성 재설정 (harbor 설치파일 파일(install.sh 있는 곳으로 이동) ```shell
    ># docker-compose down -v
    ```
    
    <div><div><div class="box"><div class="code">  
    설정정보 변경 작업 진행  
    </div></div></div></div>```shell
    ># docker-compose up -d
    ```
    
    <div><div class="box"><div class="code">  
    </div></div></div>
2. 실행중인 컨테이너 정보만 중지 (이미지데이터와 DB파일 유지) ```shell
    ># docker-compose down -v
    ```
3. 기존정보 삭제 후 재설치시 ```shell
    ># rm -rf /data/database
    ># rm -rf /data/registry
    ```

# packer로 container 이미지 관리하기

container 이미지 관리툴을 찾다가 HashiCorp에서 만든 packer라는 툴이 보이더군요.

웹사이트에는 뭐하는 녀석인지 한줄로 표기해 두었네요 "Images as code"

기존에 컨테이너는 Dockerfile 파일에 container 생성하면 되는데, 기본적인 절차는 동일한데

packer로 container 이미지를 만들경우 추가 기능이 조금 더 편리한 활동들이 있는데,

docker명령어로 docker build만 할 경우 순수하게 이미지 build까지만 하지만, packer로 작업하게 되면

이미지 생성 +@의 효과를 누릴수 있는 장점이 있죠.

제가 테스트 했던 것들을 좀만 더 업데이트 하나씩 해볼께요.

reference

- [https://www.packer.io/](https://www.packer.io/)
- [https://lannstark.tistory.com/97](https://lannstark.tistory.com/97)
- [https://medium.com/@nanditasahu031/packer-create-nginx-ami-using-packer-f9cb600791a6](https://medium.com/@nanditasahu031/packer-create-nginx-ami-using-packer-f9cb600791a6)
-