5. 자동화/IaC Ansible 기술정보 1- Ansible 이해하기 Ansible을 알기 위해서는 먼저 IaC(Infrastructure as Code)를 이해해야 하는데요. (알아요…. 개발자가 아닌이상 code라는 단어가 나오기 시작하면 머리가 아프기 시작하는거…ㅠㅠ) IaC는 일단 개념만 알아두고 넘어가요. 눈앞에 OS만 설치된 2대가 있다고 치죠. 이 서버를 apache 혹은 nginx 같은 어플리케이션을 설치한다고 하면, 서버 2대에 접속해서….. $ 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에 대한 포스팅을 진행하고자 합니다. perplexity 에서 생성한 AI이미지 왜? Ansible로 진행한 이유는…. Opensource라서.. (License는 GPL 정책을 따릅니다.) Windows / Linux / Network까지 두루두루 사용할 수 있어서 (Windows은 WinRM이라는 기능으로 접근하고 나머지는 ssh기반으로 접근해서 사용합니다.) AWX라는 별도의 Opensource을 이용해 WebUI기능이 제공되기 때문에… 이런 사유로 puppet이나 Chef를 사용하지 않고 Ansible로 진행을 하게 되었습니다. Ansible은 2015년에 Redhat에서 인수한뒤  https://www.ansible.com/  에서 관리하고 있어요. 2- Ansible 기본구조 perplexity에서 생성한 AI이미지 Redhat기준으로 Ansible 구성은 이렇게 되어 있습니다. 컴포넌트명 비 용 OSS Project Ansible Core Free Ansible  https://github.com/ansible/ansible Ansible Tower Commercial AWX  https://github.com/ansible/awx Ansible에서 사용하는 용어를 정리하면... 구성정보 용 도 inventory 배포 대상 정보가 기록된 정보 playbook – role – task – template – vars 배포시 사용하는 배포코드 – 여러가지 배포업무가 수행될때 나눌 수 있는 리스트 – 배포 업무 수행 – 설정파일같은 템플릿화된 파일을 배포시 사용 – 배포코드 작성시 등록한 변수리스트 프로비저닝 대상서버 접근 방식 Target OS 접근방식 / 기본포트 추가 설명 Windows WinRM / tcp/5986 Windows장비가 winrm 접근할 수 있게 설정되어 있어야 함 Windows7 이상부터 사용가능 Linux / Switch ssh / tcp/22 Telnet은 지원하지 않음 3- ansible 설치하기 perplexity에서 생성한 AI이미지 yum으로 설치하기 $> yum install epel-release -y $> yum install ansible -y pip으로 설치하기 $> pip install ansible 4- Ansible inventory 작성하기 perplexity에서 생성한 AI이미지 ansible의 inventory는 배포대상 서버정보를 구성하는 파일입니다. rpm으로 설치할 경우 기본적으로 구성된 inventory는 /etc/ansible/hosts에서 작성할 수 있는데, playbook 작성에 따라 자체 inventory를 가질 수 있으니 참고만 해주세요. inventory에서 작성할 수 있는항목은 group, children, vars 를 자주 사용하는데요. 그룹명 web은 하위그룹으로 nginx, apache가 있다고 가정해보죠. 192.168.10.10, 192.168.10.15까지는 nginx를 설치할꺼고 192.168.100.10부터 192.168.100.15까지는 apache를 설치할꺼예요. playbook 코드도 그룹을 기준으로 설치할꺼예요. ansible 접속을 위한 계정은 ansible이고, ssh포트는 2022를 사용할꺼예요 이렇게 구성하기 위한 인벤토리는 다음값으로 설정이 가능합니다. 인벤토리는 /home/ansible/inventory 파일로 작성할게요 $ 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 인벤토리 구성이 잘 되었는지 한번 테스트 해볼까요? $ 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작성하기 perplexity에서 생성한 AI이미지 지난번에는  에서 inventory를 작성하고 접속이 되는지까지 확인했는데요. 이제 실제로 어떤어떤 작업을 수행하겠다~를 작성하기 위해 playbook을 작성할꺼예요. 192.168.10.10 ~ 15번까지는 nginx 최신버전을 설치하고, 192.168.100.10 ~ 15번까지는 apache를 설치할꺼예요. Centos7 Base yum 에는 nginx가 없기 때문에 epel 리포지터리를 구성하고, nginx를 설치하는 절차입니다. vi /home/ansible/playbook.yml #nginx 그룹에 등록된 서버들 작업수행 name: Nginx Install # 작업 이름 hosts: "nginx" # 배포대상 호스트 정보 gather_facts: yes # 배포대상 서버들의 정보 수집 become: yes # root로 작업시 tasks: # 아래 나열된 작업을 수행 - name: epel enable # epel repository 활성화 yum: name: https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm state: present - name: nginx install #nginx rpm 설치 yum: name: nginx state: latest - name: nginx start  #nginx 서비스 실행, 재부팅후에도 활성화 적용 systemd: name: nginx daemon_reload: yes state: started enabled: yes #apache 그룹에 등록된 서버들 작업수행 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 코드를 작성 다 했으면 배포를 진행해보아요 $ ansible-playbook -i /home/ansible/inventory /home/ansible/playbook.yml -b # /home/ansible/inventory에 구성된 인벤토리를 가지고 /home/ansible/playbook.yml 파일에 구성된 작업절차를 수행하겠다는 Command 입니다. 배포코드 작성시 유의사항 playbook은 yml 포맷으로 작성하기 때문에 tree구조를 띄어쓰기로 인식합니다 (탭키 인식 안함) 상 / 하위 개념 적용을 위해 띄어쓰기 잘 해주세요. 작성된 예시코드는 ansible 2.9버전의 코드입니다. 2.10버전 이후부터는 문법이 바뀌었습니다. (https://docs.ansible.com/ansible/latest/ 참고) 6 - AWX 설치절차 perplexity에서 생성한 AI이미지 Redhat에서는 Ansible Tower라는  software는 판매하고 있지요. 이 Ansible tower의 Opensource 버전이 AWX라는 녀석인데요. 이녀석을 설치해보려고 합니다. 참고로 AWX 18버전부터는 kubernetes operator을 이용해 설치해야 방식으로 변경이 되었고,  저는 14버전으로 설치하는 설차를 기록해놓으려고 합니다. AWX컨테이너 용도 awx_web : AWX Frontend 용 Container  awx_task : Ansible task용 Container postgres : awx DB용 Container redis : AWX Cache 관리용 Container 설치정보 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 software 설치 Ansible 설치 $> yum install ansible or $> pip3 install ansible==2.9.5 Docker-CE 설치 / docker-compose 설치 $> yum install docker-ce -y $> pip install docker-compose AWX 다운로드 후 설정파일 변경(8081로 접근 설정) $> git clone https://github.com/ansible/awx.git -b "14.1.0" $> cd awx/installer/ $> vi inventory ... postgres_data_dir="/svc/awx/pgdocker" docker_compose_dir="/svc/awx/awxcompose" ... host_port=8088 ... AWX 설치 $> ansible-playbook -i inventory install.yml awx-UI 구동을 위한 컨테이너 구동상태 확인 docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES abc490b5491a postgres:10 "docker-entrypoint.s…" 40 seconds ago Up 40 seconds 0.0.0.0:5432->5432/tcp awx_postgres 23a88b84555c ansible/awx:14.1.0 "tini -- /usr/bin/la…" 7 minutes ago Up 7 minutes 8052/tcp awx_task 998f87a22c50 ansible/awx:14.1.0 "tini -- /bin/sh -c …" 7 minutes ago Up 7 minutes 0.0.0.0:8081->8052/tcp awx_web 6efe1321bb04 redis "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 6379/tcp awx_redis postgres vacuum 설정 (postgres data 관리를 위한 설정) $> vi /data/awx/pgdocker/10/data/postgresql.conf ... track_counts = on autovacuum = on ... 설정 후 awx_postgres 컨테이너 재기동 필요 AWX 접근 웹 브라우져에서 AWX 접근 ( http://{{서버IP}}:8088 ) 최초 접근시 AWX is Upgrading 메세지 출력 (1회한) 업그레이드 완료되면 로그인 진행 (admin / password , 패스워드 변경 필) 7- awx에서 rest api 사용하기 awx에서 제공하는 restapi 사용방법 전체 기능은 : http://192.168.20.10:8801/api/v2/ 에 접속하면 전체 api 기능 확인가능 perplexity에서 생성한 AI이미지 사전작업 admin 계정으로 awx 로그인 관리 → application → 새로생성 authorization grant type은 resource owner password=based, client type → confidential 관리 → user 에서 api용으로 사용할 서비스 계정 생성 후 token 생성 application에는 2번에서 생성한 application 선택 scope는 write로 선택 1.생성된 token값은 복사 (재 확인할 수 있는 절차가 없음) API 사용예제 inventory 조회 $ 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]}' Credential 정보 조회 $ 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]}' job templates조회 $ 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]}' job template 실행 $ 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 수행 호스트 등록 $ 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라는 변수를 적용해서 호스트 등록 그룹에 해당 호스트 추가 $ 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 호스트 등록 호스트 삭제 $ 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이라는 이름으로 역활을 나누어서 배포할 수 있습니다. perplexity에서 생성한 AI이미지 playbook디렉토리에 roles 하위 디렉토리별로 수행해야할 역활을 기재해주시면 되고요.... 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 세부디렉토리 정보는 다음과 같습니다. main.yml --> 배포하는 yml파일 roles --> role 디렉토리 roles/os/linux/setup/task/ --> OS프로비져닝 하기 위한 플레이북 (default는 해당경로의 main.yml 파일을 실행) roles/os/linux/setup/templates/  --> 해당 role에 templates 배포할떄 사용하는 디렉토리 roles/os/linux/setup/vars/  --> 해당 role에 정의할 외부변수 저장용 디렉토리 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 role을 실행할때는 job_tag라는 옵션(-t)으로 분리해서 사용하면 됩니다. nginx를 설치하기 위한 절차는 다음과 같이 사용하면 됩니다. $>ansible-playbook -i host main.yml -t nginx 9-AWX 사용메뉴얼 perplexity에서 생성한 AI이미지 대쉬보드 AWX로그인 후 첫 페이지, 작업상태 및 호스트상태, 최근 사용한 템플릿과 최근 실행한 작업 요약 확인 가능 ( ACCESS → DASHBOARD ) 최근 실행 작업 최근에 실행한 템플릿의 요약정보 확인 ( ACCESS → Jobs ) Job결과 확인 아이콘 확인 : 정상 작업 완료  : 작업 실패 작업관리 : 동일한 vars값으로 재실행   : 작업이력 삭제 스케쥴 확인 스케쥴링 설정된 작업 리스트 (ACCESS → Schedules ) 스케쥴 작업 관리 (왼쪽에서부터) 항목 설 명 활성화 체크+파란색 아이콘 : 활성화 체크X + 회색 아이콘 : 비활성화 NAME 스케쥴 이름 TYPE Template 유형 NEXT RUN 다음 실행 시간 (빈칸일 경우 스케쥴링 실행되지 않음) ACTION  : 스케쥴 정보 수정 : 스케쥴 정보 삭제 관리 메뉴 조직관리 사용자 / 팀 / 프로젝트 / 인벤토리를 관리하는 최 상단 그룹( ACCESS → ORGANIZATIONS)\ 조직  계층 구조 조직생성 ( 버튼 선택) 조직 생성 입력 화면 항목별 상세설명 항 목 값 설명 비 고 NAME 조직이름 필수 DESCRIPTION 조직에 대한 설명 옵션 INSTANCE GROUPS 인스턴스 그룹 옵션 조직 관리 USERS : 조직에 소속시킬 사용자 (계정명 선택) PERMISSIONS : 조직의 권한설정 항 목 설 명 Admin 전체 권한 부여 Execute 프로젝트 실행만 가능 Project Admin 프로젝트 생성 / 수정 / 읽기 가능 Inventory Admin 인벤토리 생성 / 수정 / 읽기 가능 Credential Admin 자격증명 생성 / 수정 / 읽기 가능 Workflow Admin 워크 플로우 생성 Notification Admin 알림 할당 Auditor 읽기 전용 권한 Member 템플릭을 제외한 모든 기능 읽기 가능 Read 읽기 전용 권한 NOTIFICATIONS : 알람정책 관리 : 알람생성은 ( {{ 참조 }} ) 사용자 관리 AWX에 접근하는 사용자의 관리 ( ACCESS → Users) 사용자 생성 (  버튼 선택) 사용자 입력 화면 항목별 상세 설명 항 목 값 설명 비 고 FIRST NAME 사용자 이름 정보 옵션 LAST NAME 사용자 이름 정보 옵션 ORGANIZATION 계정 소속 조직 필수 EMAIL 해당 계정 이메일주소 필수 USERNAME 계정명 필수 PASSWORD 계정 패스워드 필수 CONFIRM PASSWORD 계정 패스워드 확인 필수 USER TYPE 계정 권한 옵션 사용자 관리  USER TYPE별 권한 정보 권한명 설 명 Normal User 사용이 제한된 권한, 권한 정책에 따라 읽기/쓰기 가능 System Auditor 모든 속성에 대해 읽기 권한 System Administrator 모든 속성에 대해 읽기/쓰기 권한 (= superuser) 팀 관리 사용자 / 프로젝트  권한을 설정할 수 있는 조직단위의 세부 구성 ( ACCESS → TEAM) 팀 생성 팀 생성 입력 화면 항목별 상세설명 항 목 값 설명 비 고 NAME 팀 이름 필수 DESCRIPTION 팀 설명 옵션 ORGANIZAION 소속된 조직 필수 팀 관리 USER : 팀 소속 사용자 PERMISSION  : 템플릿 / 워크플로우 / 프로젝트 / 인벤토리 / 인증 / 조직별 권한 설정 템플릿 권한 항 목 설 명 Admin 선택한 템플릿의 전체 권한 Execute 선택한 템플릿의 실행 / 점검권한 Read 선택한 템플릿의 읽기 권한 워크플로우 권한 항 목 설 명 Admin  선택한 템플릿의 전체 권한 Execute  선택한 템플릿의 실행 / 점검 권한 Read  선택한 템플릿의 읽기 권한 Approve 작업승인여부 관리 프로젝트 권한 항 목 설 명 Admin  선택한 프로젝트의 전체 권한 Execute  선택한 프로젝트의 설정 / 점검권한 Read  선택한 프로젝트의 읽기 권한 인벤토리 권한 항 목 설 명 Admin  선택한 인벤토리의 전체권한 Update  인벤토리 업데이트 권한 Ad Hoc 임시명령 (ping, win_ping 등) 실행 가능 권한 Use  인벤토리 사용 권한 Read  인벤토리 읽기 권한 조직 권한 항 목 설 명 Execute 실행 / 점검 권한 Project Admin 프로젝트 생성 / 수정 / 읽기 가능 Inventory Admin 인벤토리 생성 / 수정 / 읽기 가능 Credential Admin 자격증명 생성 / 수정 / 읽기 가능 Workflow Admin 워크 플로우 생성 Notification Admin 알림 할당 Job Template Admin 템플릿 관리 권한 Auditor 읽기 전용 권한 Read 읽기 전용 권한 인증정보 AWX 사용에 필요한 계정정보 (RESOURCES → Credentials) 인증정보 생성 (  버튼 선택) Machine 타입으로 인증생성 입력화면 항목별 상세설명 항 목 설 명 비 고 NAME  계정이름 필수 DESCRIPTION  계정설명 옵션 ORGANIZATION  소속 조직 옵션 CREDENTIAL TYPE (Machine ) winrm / ssh 등 장비로그인시 사용 필수 USERNAME  실제 로그인하는 계정명 필수 비밀번호  로그인시 사용하는 패스워드 필수 PRIVILEGE ESCALATION METHOD 상위 계정(root)을 권한 상승 방식 옵션 PRIVILEGE ESCALATION USERNAME 권한상승시 필요한 계정 옵션 PRIVILEGE ESCALATION PASSWORD 권한 상승하기 위한 패스워드 입력 옵션 Source control 타입으로 인증생성 입력화면 항목별 상세설명 항 목 설 명 비 고 NAME  계정이름 필수 DESCRIPTION  계정설명 옵션 ORGANIZATION  소속 조직 옵션 CREDENTIAL TYPE (Machine ) Git / subversion 로그인시 사용 필수 USERNAME  실제 로그인하는 계정명 필수   프로젝트 playbook이 저장된 위치 설정 (RESOURCES → Project) 프로젝트 생성 방법 (  버튼 선택) 프로젝트 생성 입력 화면 항목별 상세설명 항 목 설 명 비 고 NAME  프로젝트 이름 필수 DESCRIPTION  프로젝트 설명 옵션 ORGANIZATION  프로젝트 조직 필수 SCM TYPE - Manual : 배포서버의 파일형태로 관리 (awx_task 컨테이너 /var/lib/awx/project에 playbook이 저장되어 있어야 함) - git : git을 통해 관리 - subversion : subversion 을 통해 관리 필수 배포시스템은 git을 통해 playbook 관리 SCM URL git / subversion URL 필수 SCM BRANCH/TAG/COMMIT 특정 브랜치/태그를 이용해야 하는 경우 입력 옵션 (공란인 경우 master / head) GIT REFSPEC URL git기반에서 원격 저장소 다운로드할 경로 참조시 입력 옵션 (공란인경우 사용하지 않음) SCM CREDENTIAL git / subversion 접근을 위한 계정정보 필수 (인증정보에서 생성된 계정선택) SCM UPDATE OPTIONS - CLEAN : 업데이트하기 전에 로컬 데이터 삭제 - DELETE ON UPDATE : 업데이트를 수행하기 전에 로컬저장소 전체 삭제 - UPDATE REVISION ON LAUNCH : 작업시작전에 업데이트 수행 - ALLOW BRANCH OVERRIDE : branch 변경이 필요할때 사용 선택 선택 선택 선택안함 CACHE TIMEOUT (SECONDS) 프로젝트를 최신상태로 인지하는 시간(초단위), 타임마아웃을 초과한 경우 프로젝트 소스를 다시 업데이트 함 옵션 (0인 경우 사용안함) 인벤토리  작업을 위한 호스트 모음 (RESOURCES → Inventories) 인벤토리 생성 방법 (  버튼 선택) 인벤토리 생성 입력화면 항목별 상세설명 항 목 설 명 비 고 NAME  인벤토리 이름 필수 DESCRIPTION  인벤토리 설명 옵션 ORGANIZATION  소속 조직 필수 INSIGHTS CREDENTIAL redhat Insights  계정선택 옵션 (redhat Insightst사용시 선택) Instance Group 인벤토리의 인스턴스 그룹 옵션 (사용하지 않음) 인벤토리 추가 설정 권한 설정 방법 (  버튼 선택) 권한설정 입력화면 : 추가할 계정명 선택 후 설정할 권한 정보 선택  정책별 상세 설명 항 목 설 명 Admin 모든 권한 부여 Update SCM업데이트시 프로젝트 업데이트 가능 Ad Hoc 임시 명령 사용가능 Use 템플릿에서 해당 인벤토리 접근 가능 Read 읽기전용 호스트 추가방법 (  버튼 선택) 호스트 추가 입력화면 항목별 상세설명 항 목 설 명 비 고 HOSTNAME 타켓호스트 IP입력(호스트네임 입력 무방) 필수 (호스트네임 입력시 ip와 매핑할 수 있는 정보 필요) DESCRIPTION 타켓호스트 설명 옵션 VARIABLES ssh포트, 접속 방법 등 해당 호스트의 추가 설정값 입력 옵션 (기본은 ssh, tcp/22로 접근수행) PERMISSIONS : 접근계정 권한설정 GROUPS : 각 호스트에 소속된 그룹정보 입력 그룹추가 방법 (  버튼 선택) 그룹추가 입력화면 항목별 상세설명 항 목 설 명 비 고 NAME 그룹이름 필수 DESCRIPTION 그룹설명 옵션 VALIABLES 이 그룹에 소속된 모든 호스트에 적용할 값 입력(yaml / json 지원 가능) 옵션 생성된 그룹에 하위 그룹 생성 방법 (생성된 그룹 → GROUPS,  버튼 선택) 기존에 생성된 그룹의 경우 Existing Group 선택) 하위그룹으로 관리할 그룹 명 선택  새로운 그룹인 경우 New Group 선택 후 그룹정보 입력 생성된 그룹에 소속시킬 호스트 등록 (생성된 그룹 → HOSTS) 기존에 생성된 호스트의 경우 Existing HOSTS 선택) 소속된 호스트 선택 새로운 호스트의 경우 New HOSTS 선택 후 호스트정보 입력 HOTS : 해당 인벤토리에 등록할 호스트정보 등록 호스트 추가방법 (  버튼 선택) 호스트 추가 입력화면 항목별 상세설명 항 목 설 명 비 고 HOSTNAME 타켓호스트 IP입력(호스트네임 입력 무방) 필수 (호스트네임 입력시 ip와 매핑할 수 있는 정보 필요) DESCRIPTION 타켓호스트 설명 옵션 VARIABLES ssh포트, 접속 방법 등 해당 호스트의 추가 설정값 입력 옵션 (기본은 ssh, tcp/22로 접근수행)   다수서버 등록시 방법 인벤토리 신규 생성 AWX Task Container 로그인 $> docker exec -i -t awx_task /bin/bash Inventory에 등록한 호스트파일 작성 $> 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 작성한 호스트파일로 awx inventory 등록 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 템플릿 실제 배포작업을 실행하기 위해 생성 (RESOURCES → Templates) 기본 템플릿 생성방법(  버튼 선택 → Job Template 선택) 템플릿 생성 입력화면 항목별 상세설명 PROMPT ON LAUNCH : 플레이북 실행시 선택창 출력 항 목 설 명 비 고 NAME 템플릿 이름 필수 DESCRIPTION 템플릿 설명 옵션 JOB TYPE - run : 실제 배포 수행 - check: 구문 오류테스트 필수 (run 선택) INVENTORY  템플릿에서 적용할 인벤토리 설정 필수 PROJECT  템플릿에서 적용할 프로젝트 설정 필수 PLAYBOOK 템플릿에서 수행할 플레이북 선택 필수 CREDENTIALS  템플릿에서 적용할 인증값 설정 옵션 FORKS  플레이북 실행시 동시 프로세스 옵션 (1 입력) LIMIT  호스트 목록 제한시 입력 옵션 VERBOSITY  로그 출력 레벨 (숫자가 높을수록 상세로그) 0 선택 * 디버깅 로그시 브라우저 탭이 잠기면서 작업완료 지연 보고 이슈 있음 JOB TAGS 배포 작업별 설정되는 태그 입력 템플릿별 고유의 태그 입력 필요 SKIP TAGS 작업을 수행하지 않을 태그 입력 옵션 LABELS 템플릿을 설명하는 레이블 입력 옵션 INSTANCE GROUPS 템플릿을 실행할 인스턴스 그룹 선택 옵션 JOB SLICING 작업 슬라이스(다중 호스트 작업시 작업수를 분산) 설정 옵션 TIMEOUT 배포작업 최대 소요시간 옵션 2400 입력 SHOW CHANGES 작업시 변경되는 내용들 확인 활성화 OPTIONS - ENABLE PRIVILEGE ESCALATION : 권한 상승이필요한 경우 선택 - ENABLE PROVISIONING CALLBACKS : awx api를 통해 작업 호출 허용시 선택 - ENABLE WEBHOOK : 웹 후크 사용시 선택 - ENABLE CONCURRENT JOBS : 템플릿 자체의 중복실행 허용시 선택 - ENABLE FACT CACHE : 배포 작업시 팩트 캐쉬를 사용할 경우 선택 선택 미선택 미선택 선택 미선택 EXTRA VARIABLES 추가로 설정해야할 변수 입력 상기 이미지 내용 추가 WorkFlow  템플릿 생성방법(  버튼 선택  → Workflow Template 선택 ) 탬플릿 생성 입력화면 항목별 상세 설명 항 목 설 명 비 고 NAME 템플릿 이름 필수 DESCRIPTION 템플릿 설명 옵션 ORGANIZATION 템플릿 조직 옵션 INVENTORY  템플릿에서 적용할 인벤토리 설정 필수 LIMIT  호스트 목록 제한시 입력 옵션 SCM BRANCH 특정 branch / tag에서 가지고 와와야할 경우 입력 옵션 LABELS 템플릿을 설명하는 레이블 입력 옵션 OPTIONS - ENABLE CONCURRENT JOBS : 템플릿 자체의 중복실행 허용시 선택 - ENABLE WEBHOOK : 웹 후크 사용시 선택 선택 미선택 템플릿 설정 PERMISSION (Templates → Permission ,  버튼 선택) 템플릿 접근권한 설정  방법 접근할 계정 선택 권한설정 입력 화면 권한별 상세 설명 권 한 설 명 Admin 전체 권한 Execute 실행/수정 권한 Read 읽기모드 권한 (실행 불가) NOTIFICATIONS 템플릿 알람 수신 방법설정 (Templates → NOTIFICATION) 생성된  notification 방식에 따라 알람 수신여부 설정 notification 설정 화면 항목별 상세 설명 항목 설 명 비 고 START 템플릿 실행시 알람 전송  : 활성화  : 비활성화 SUCCESS 템플릿이 정상 종료된 경우 전송  : 활성화  : 비활성화 FAILURE 템플릿이 실패한 경우 전송  : 활성화  : 비활성화 COMPLETED JOBS 해당 템플릿으로 수행한 작업이력 확인 (Templates → COMPLETED JOBS) SCHEDULES 해당 템플릿을 스케쥴로 수행할 때 선택 스케쥴 생성 방법 (Templates → SCHEDULES,  버튼 선택) 스케쥴 설정 화면 항목별 상세 설명 항 목 설 명 비 고 NAME 스케쥴 이름 필수 START DATE 시작 날짜 필수 START TIME 시작 시간 필수 LOCAL TIME ZONE 지역 시간대0 OS에 설정된 시간대역에 맞추어 자동 표시, 수정 가능 REPEAT FREQUENCY 반복 빈도 - none : 1회성 - Minute : 분단위 반복 - Hour : 시간단위 반복 - Day : 일 단위 반복 - Week : 주 단위 반복 - Month : 월 단위 반복 - Year : 년 단위 반복 필수 Every 반복 주기 설정 반복설정시 화면에 노출 (필수) END 종료조건 - after : OCCURRENCES 횟수까지 실행 후 종료 - On Date : 특정날짜/시간 까지 실행 후 종료 필수 EDIT SURVEY 배포 작업시 추가 변수 전달이 필요한 경우 작성 (Templates → ADD SURVEY) 서베이 설정화면 항목별 세부설명 항 목 설 명 비 고 PROMPT 사용자에 확인할 질문사항 필수 DESCRIPTION prompt에 대한 추가 설명 옵션 ANSWER VARIABLE NAME ansible에 전달할 변수 이름 필수 ANSWER TYPE 답변 유형 선택 - text - textarea - Password - Multiple Choice (single Select) - Multiple Choice (Multiple Select) - integer - Float 일반 문자열 (1줄) 여러줄의 문자열 패스워드 형태 입력시 선택 1개만 선택할 수 있는 리스트 목록 여러개 선택할 수 있는 리스트 목록 숫자값 10진수 MININUM LENGTH 최소 문자열 text, textarea, password, integer, float 선택시 보임 MAXIMUM LENGTH 최대 문자열 text, textarea, password, integer, float 선택시 보임 DEFAULT ANSWER 기본 항목 prompt에 대한 기본값 REQUIRED 필수여부 선택시 배포작업시 필수항목으로 분류됨 서베이 변경 항목 수정시 :  아이콘 선택 후 항목 변경  후 SAVE 선택 항목 삭제시 :  아이콘 선택 후 삭제 후 SAVE 선택 서베이 자체 삭제시 : DELETE SURVEY 선택 WORKFLOW VISUALIZER 템플릿 유형이 workflow인 경우에만 출력하며, WebUI기반에서 생성 (Templates → WORKFLOW VISUALIZER) Workflow 생성 화면 Add a NODE 세부 항목 항 목 설 명 비 고 Template 생성된 템플릿 추가시   Project Sync 프로젝트 동기화 시   Inventory Sync 인벤토리 동기화 시   Approval 작업건 승인여부 확인시 webui noti항목에 출력됨 TIMEOUT 승인여부 타임아웃 (타임아웃 초과시 거부됨) 옵션, 0인 경우 무제한 RUN - Always : 성공 / 실패에 상관없이 계속 실행 - On Success : 앞 작업이 정상적으로 수행된 경우 실행 - On Failure : 앞 작업이 실패된 경우 실행 필수, 최초 Node는 Alway만 표기됨 CONVERGENCE - Any : 앞 작업이 하나라도 완료되면 수행 - All : 앞 작업이 모두 완료되면 수행 필수, Any가 기본 WorkFlow 생성 :  작업 생성 : 기존 FLow(link) 수정 : 현재 작업 삭제 Approval 화면 WEBUI 우측 상단  아이콘에 Approval 기능 제공 Approval  선택 화면  Template을 이용한 배포작업 수행 배포수행하려는 템플릿의 아이콘 선택 Template별 생성된 서베이에 맞추어 선택후 마지막 PREVIEW 항목 확인 후 Launch 선택 작업결과 확인 (정상종료인 경우 좌측 상단에 STATUS에  Successful )표기 오류가 발생하는 경우 : 동일 위치에 FAILED로 표기, FAILED 발생 원인 분석 필요 자격증명 관리 기존에 생성된 인증절차방식 외에 추가할경우 사용 (SSH / winrm / aws 등 대부분 내장된 기능으로 사용가능) 인증정책 관리 (ADMINISTRATION → CREDENTIAL TYPES) 인증절차 생성(  버튼 선택) 인증절차 사용자 입력화면 항목별 상세 설명 항 목 값 설명 비 고 NAME 자격증명 이름 필수 DESCRIPTION 자격증명 설명 옵션 INPUT CONFIGURATION 인증시 사용할 필드 구성 옵션 INJECTION CONFIGURATION 인증시 전달할 환경변수 구성 옵션 알람관리 AWX에서 수행하는 Template에 대한 알람수신 방법 관리 알람 정책 관리 (ADMINISTRATION → NOTIFICATION TEMPLATES) 알람방법 생성(  버튼 선택) 알람정책 사용자 입력화면 항목별 상세 설명 항 목 값 설명 비 고 NAME 알람정책 이름 필수 DESCRIPTION 정책 설명 옵션 ORGANIZAION 소속 조직 필수 TYPE 설정가능한 알람리스트 - Email - Grafana - HipChat - IRC - Mattermost - PagerDuty - Rocket.Chat - Slack - Twilio - Webhook 필수 CUSTOMIZE MESSAGES 메세지 발송시 작성되는 내용 변경시 선택 후 수정 옵션 알람설정 이메일 설정 이메일  정책 사용자 입력화면 항목별 상세설명 항 목 설 명 비 고 USERNAME 발송계정 이름 옵션 PASSWORD 발송계정 패스워드 옵션 HOST 발송서버 필수 RECIPIENT LIST 수신자 필수 SENDER EMAIL 발송메일주소 필수 PORT 메일발송 포트 필수 TIMEOUT 발송최대 시간(초기준) 필수, 최대 120초까지 설정 가능 EMAIL OPTIONS USE TLS / USE SSL 옵션TLS 나 SSL 사용시 선택 그라파나 설정 그라파나 정책 사용자 입력화면 항목별 상세설명 항 목 설 명 비 고 GRAFANA URL 그라파나 api서비스 url 필수 GRAFANA API KEY 그라파나에서 할당받은 api key 필수 ID OF THE DASHBOARD 그라파나 계정에 대해 api키 만들때 고유한 ID로 대쉬보드 설정 옵션 ID OF THE PANEL 그라파나에서 패널/그래프를 추가한 경우 해당 ID 옵션 TAGS FOR THE ANNOTATION 이벤트 유형을 기재 옵션 DISABLE SSL VERIFICATION 그라파나 접속시 SSL 인증서 확인절차 제외 여부 옵션 힙챗 힙챗 정책 사용자 입력화면 ㅂ 항목별 상세설명 관리작업 Cleanup 작업 관리 (ADMINISTRATION → MANAGEMENT JOBS) Cleanup Activity Stream (활동내역 삭제) 수동 실행 ( ) 선택, 기본값은 별도 스케쥴링 없음 보관기간 입력 후 LAUNCH 선택  스케쥴 등록 ( )선택, 기본값은 별도 스케쥴링 없음 필요한 스케쥴 등록  Cleanup Expired OAuth 2 Tokens (만료된 2차 토큰정보  삭제) 수동 실행 ( ) 스케쥴 등록 ( )선택, 기본값은 별도 스케쥴링 없음 필요한 스케쥴 등록  Cleanup Expired Sessions (만료된 인증정보 삭제) 수동 실행 ( ) 스케쥴 등록 ( )선택, 기본값은 별도 스케쥴링 없음 필요한 스케쥴 등록  Cleanup Job Details (작업 내역 삭제) 수동 실행 ( ) 보관기간 입력 후 LAUNCH 선택 스케쥴 등록 ( )선택,  필요한 스케쥴 등록  인스턴스 그룹 인스턴스별  동작방식 및 작업 실행 방식 설정 인스턴스 그룹 관리 (ADMINISTRATION → INSTANCE GROUPS) 인스턴스 그룹 생성(  버튼 선택 → CREATE INSTANCE GROUP) 사용자 입력 화면 항목별 세부설명 항 목 값 설명 비 고 NAME 인스턴스명 필수 POLICY INSTANCE MINIMUM 그룹내에 유지할 최소 인스턴스 수 기본값 : 0 POLICY INSTANCE PERCENTAGE 신규 인스턴스가 소속될 있는 최대 가용가능한 인스턴스 수 (백분율) 기본값 : 0 (무제한)  INSTANCES 설정화면 (다수의 AWX-UI 관리시 사용) 최대로 사용햘 Forks 갯수 설정 JOBS 해당 인스턴스에 수행한 Job정보 확인 AWX-UI 설정 UI기능 설정 Authentication Azure / github / Google / LDAP / RADIUS 계정을 통해 로그인시 사용 Jobs Ad hoc 을 사용할 수 있는 모듈 구성, 예약 작업 수 설정 가능 설정 화면 항목별 상세설명 항 목 값 설명 비 고 ANSIBLE MODULES ALLOWED FOR AD HOC JOBS 임시작업으로 사용할 수 있는 명령어 종류   JOB EXECUTION PATH 작업수행을 위한 임시 경로 /tmp MAXIMUM SCHEDULED JOBS 최대 예약작업 갯수 10 PATHS TO EXPOSE TO ISOLATED JOBS 격리된 작업시 허용되는 경로 (전체 경로 정보 입력필요 격리 작업 미사용 PATHS TO HIDE FROM ISOLATED JOBS 격리된 작업시 숨길 경로 (전체 경로 정보 입력필요 격리 작업 미사용 ENABLE JOB ISOLATION 작업 격리기능 사용여부 미설정 DEFAULT JOB TIMEOUT 최대 작업 시간 (초단위) 0(무제한) DEFAULT INVENTORY UPDATE TIMEOUT 최대 인벤토리 업데이트 시간 (초단위) 0(무제한) RUN PROJECT UPDATES WITH HIGHER VERBOSITY 프로젝트 업데이트 실행시 자세한 정보 출력 미설정 PER-HOST ANSIBLE FACT CACHE TIMEOUT 호스트 단위로 팩트캐쉬 시간 (초단위) 0(무제한) PRIMARY GALAXY SERVER URL 기본 ANSIBLE-GALAXY URL 변경시 사용 galaxy.ansible.com PRIMARY GALAXY SERVER NAME private galaxy 접근시 사용하는 계정 PRIVATE GALAXY 미사용 PRIMARY GALAXY SERVER PASSWORD private galaxy 접근시 사용하는 계정 패스워드 PRIVATE GALAXY 미사용 PRIMARY GALAXY SERVER TOKEN private galaxy 접근시 사용하는 토큰정보 PRIVATE GALAXY 미사용 PRIMARY GALAXY AUTHENTICATION URL private galaxy 접근시 사용하는 인증경로 PRIVATE GALAXY 미사용 ALLOW ACCESS TO PUBLIC GALAXY 공개된 Galaxy사용여부 활성화 ISOLATED HOST KEY CHECKING 격리된 호스트 키 확인여부 비활성화 격리 작업 미사용 ISOLATED STATUS CHECK INTERVAL 격리정보 확인 (초단위) 30 ISOLATED LAUNCH TIMEOUT 최대 격리된 작업 실행 시간 (초단위) 600 격리 작업 미사용 ISOLATED CONNECTION TIMEOUT 최대 격리호스트 연결시간 (초단위) 10 격리 작업 미사용 ENABLE DETAILED RESOURCE PROFILING ON ALL PLAYBOOK RUNS 플래이북 실행시 리소스 프로파일링 설정여부 비활성화 EXTRA ENVIRONMENTVARIABLES AWX-UI에서 사용할 추가 환경 변수   ANSIBLE CALLBACK PLUGINS ansible에서 사용할 콜백용 플러그인   system AWX-UI의 기본URL, URL및 기본 가시정보 설정 설정화면 항목별 상세설명 항 목 값 설명 비 고 BASE URL OF THE TOWER HOST AWX-UI URL정보   ALL USER VISIBLE TO ORGANIZATION ADMINS 관리자가 모든 사용자 확인 가능 여부 활성화 ORGANIZATION ADMINS CAN MANAGE USERS AND TEAMS 관리자가 사용자 및 팀 관리 허용 여부 활성화 IDLE TIME FORCE LOG OUT 유휴세션 강제 로그아웃 (초단위) 1800 MAXIMUM NUMBER OF SIMULTANEOUS LOGGED IN SESSIONS 최대 동시 로그인 세션수 -1 (비활성화) ENABLE HTTP BASIC AUTH HTTP 인증기능 허용여부 활성화 ALLOW EXTERNAL USERS TO CREATE OAUTH2 TOKENS 외부사용자가 OATUTH2 토큰 생성 허용여부 비활성화 LOGIN REDIRECT OVERRIDE URL 미로그인 사용자가 로그인 하도록 리다이렉션 URL 공란인 경우 기본 로그인 페이지 ACCESS TOKEN EXPIRATION 엑세스 토큰 유효기간 (초단위) 31536000000 REFRESH TOKEN EXPIRATION 토큰 만료시 지속시간 (초단위) 2628000 AUTHORIZATION CODE EXPIRATION 로그인시 생서되는 인증코드 유효기간 (초단위) 600 REMOTE HOST HEADER 원격 호스트 IP / 호스트이름 추가 기본값 : REMOTE_ADDR, REMOTE_HOST 리버스 프록시ip가 있는 경우 HTTP_X_FORWARDED_FOR 추가 CUSTOM VIRTUAL ENVIRONMENT PATHS 가상의 환경값 설정 경로 비활성화 GATHER DATA FOR AUTOMATION ANAYTICS AWX-UI에서 수집된 데이터를 Redhat으로 전달 비활성화 RED HAT CUSTOMER USERNAME redhat 고객 ID Redhat과 별도 계약시 사용가능 RED HAT CUSTOMER PASSWORD redhat 고객 password Redhat과 별도 계약시 사용가능 AUTOMATION ANALYTICS UPLOAD URL 자동화 분석을 위한 업로드 URL 자동화 분석 미사용 AUTOMATION ANALYTICS GATHER INTERVAL 자동화 분석을 위한 수집간격 자동화 분석 미사용 User Interface API-UI 기능 설정 설정 화면 항목별 상세설명 항 목 설 명 비 고 USER ANALYTICS TRACKING STATE 사용자 분석 추적기능 활성화 미사용 CUSTOM LOGO 사용자 로그인시 노출될 이미지 필요시 이미지 추가 CUSTOM LOGIN INFO 로그인시 추가 텍스트 입력 필요시 입력     10 - 데이터 백업/복구 perplexity에서 생성한 AI이미지 AWX 데이터 백업 $> tower-cli receive --all > backup.json AWX 데이터 복구 $> tower-cli send --insecure aps_ui.json 복구시 주의사항 데이터 복구 절차는 credential, project, job template, workflow template 순으로 복구가 되어야 함. 순서가 어긋나는경우 참조할 수 있는 정보가 없다는 에러메시지 출력. (2~3차례 retry 하면 되기는 함) Tower-cli로 복구하는경우 패스워드 필드는 $encrypted$ 문자열 그대로 복구가 되기 때문에, 백업파일에서 Description된 문자열을 적용해주어야 함 job template 이름에 한글이 포함된경우 인코딩 에러가 나면서 복구 불가능함. 11-Foreman와 Ansible perplexity에서 생성한 AI이미지 사전정보 Ansible core는 cli기반의 기능만 제공하고 있고, web ui는 제공하지 않음 Redhat에서는 Ansible Tower라는 상용 제품이 있긴 하지만, 가격이 매우 비쌈 Opensource기반에서는 AWX를 사용하면 되는데,  AWX는 컨테이너 기반의 솔루션이라 컨테이너의 환경을 도입하기 어려운 곳에서 Foreman을 사용해서 ansible을 연동 설치구성 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 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 webui 로그인 -  https://1.2.3.4  (계정명은 상단 credentials 정보 확인) Foreman과 ansible연동 foreman이 설치된곳에 ansible 설치 - 3- ansible 설치하기 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 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 무한반복 출력 해결방법 사전작업 AWX 설치 - 6 - AWX 설치절차 perplexity에서 생성한 AI이미지 발생현상 및 조치방법 AWX 설치 후 웹 UI 접근시 아래메시지창이 수십분이 흘러도 계속 출력함 컨테이너 로그 확인시 아래메시지 지속 출력 #> 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? 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 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 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 : 스냅샷형태로 관리 commited : 데이터에 DB에 저장 modified : 수정한 파일이 DB에 커밋되지 않음 staged :  수정한 파일을 커밋 working tree의 파일 수정 staging : 커밋한 스냅샷 생성, staging에 커밋해서 git에 업로드 tracked : git이 관리하는 파일 - unmodifed : 수정되지 않은 상태 - modified : 수정된 파일 - staged : 커밋후 저장소 기록예정 untracked : git이 관리하지 않는 파일 author : 원작자 committer : 수정자 git add를 복구할때 -> git reset HEAD 파일명 리모트 저장소는 origin이 자동등록 git remote add {name} URL git fetch {name}  --> origin으로 입력하면 clone이후 수정한 모든 데이터를 가지고 옴 리모트 저장소에 push방법 -> git push origin master -> 다름사람이 push한내용은 push 불가 -> merge 후 push 가능 태그 : 2가지 형태의 태그 기능   light weight : 특정커밋의 포인터 이름   -> git tag {tagname}  annotated : 일반적인 태그 방법  -> git tag -a {tagname}  특정커밋의 태그 확인  -> git log --pretty=online  태깅할 체크썸 확인  -> git tag -a {tagname} 체크섬 전부 다 입력할 필요는 없고 앞 7자리만 알고 있으면 됨(고유번호) 태그 공유  -> git push origin {tagname} * 여러개인 경우 git push origin --tags 특정 태그 checkout  -> git checkout {tagname} * detached HEAD(떨어져나온 HEAD) 메시지 출력(정상) * 브랜치에서 작업하는 것과 다르게 작동하게 됨 커밋하게 되면 생성된 커밋을 사용할 수 있는 브랜치가 다르기 때무네 가급적 브랜치를 이용해서 관리 브랜치  staging area : 스냅샷에 대한 메타 데이터, 이전커밋의 포인터 정보 저장  파일을 stage하면 저장소에 파일 저장(이를 Blob라고 호칭)  기본적으로 master 브랜치 생성된  브랜치 생성 -> git branch {branchname}  브랜치 이동 -> git checkout {branchname}  프랜치 생성하면서 체크아웃 ->  git checkout -b {branchname} 머지  git merge {branchname}  * fast-forward : 브랜치 포인터는 자동으로 최신커밋이동  브랜치 삭제 : git branch -d {branchname}  만약 개발자가 개발중에 이슈처리를 하게 되는 경우  git checkout {branchname}  이슈 처리 후 머지하는 경우 git checkout master git merge {branchname}  머지 충돌 3way merge으로 수행하는 경우 두 브랜치에서 같은 파일을 수정할때 발생 <<< --> 이건 HEAD버전 >>> --> 이건 현재 버전 브랜치의 머지 여부 확인 git branch --merge / --no-merged  머지하지 않은 브랜치 삭제는 -D 사용 브랜치 관리 전략  3way merge이기 때문에 자이간에 걸쳐서 한브랜치를 다른 브랜치와 여러번 머지하는것이 쉬움. 1. Saltstack소개 Saltstack은 IaC를 완성하는 Tool로, 대표적인건 Ansible 기술정보 이 있죠 이번엔 Ansible대신, Saltstack을 소개하고, Ansible과 어떤점이 다른지 비교해보죠. 기능 Ansible Saltstack 라이센스 GPL Apache License 2.0 배포방식 Push Push 배포언어 yaml yaml 접속방식 Linux - ssh, Windows - winrm agent(minion), salt-ssh WebUI AWX / Ansible Tower △ Site http://ansible.com http://saltstackproject.io Saltstack WebUI중, saltpad, saltgui 가 있는듯 한데, 최신버전에서는 정상적으로 작동하지 않네요. Gitlab 미러링 구성   사전정보 gitlab설치 - gitlab설치 Gitlab에서 Mirror용 계정은 sync계정이고, root 그룹에 소속되어 있음. (미러링 받는서버에 계정이 생성되어 있어야 함) gitlab 동기화 시간은 매 5분간격으로 동기화 수행함 미러링 구성 전송할 서버 설정 전송할 프로젝트 설정 세부설정값 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 브랜치를 제외한 나머지 브랜치는 동기화 안됨 수신할 서버 설정 새로운 프로젝트 설정 puppet 기술정보 centos에서 puppet 설치하기 구성정보 Master machine ip : 192.168.10.10 / master.localdomain / Centos6 Agent machine ip : 192.168.10.100 / agent.localdomain / Centos6 공통작업 리포지터리 추가 $> 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. 패키지 설치 [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) config 수정하기 [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호스트네임 기재 패키지 업그레이드 [root@master ~]# puppet resource package puppet-server ensure=latest package { 'puppet-server': ensure => '3.8.2-1.el6', } 서비스 시작 [root@master ~]# /etc/init.d/puppetmaster start Starting puppetmaster: [  OK  ] 포트상태 확인 [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번 포트가 오픈되어 있는지 확인. Agent 작업하기1. 패키지 설치 [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) 설정파일 수정 [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에 에이전트 로그파일 파일명 입력 서비스 시작 [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 * 프로세스 실핵확인하면 됨 서버 연동하기 마스터서버에서 인증작업하기 인증이 필요한 클라이언트 확인 [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 * 도메인 옆에 +기호가 붙어있으면 인증이 완료된 에이전트 입니다. 에이전트 인증작업 수행 [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' 인증완료여부 확인 [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 도메인 옆에 +기호가 생기면 완료.   연동이 잘 되었는지 테스트. 아래 경로에서 파일생성 [root@master ~]# cat /etc/puppet/manifests/site.pp file { '/tmp/hello' : owner => root, group => root, mode => 444, content => "Hello Pupplet by Machine\n"; } * /tmp/hello 파일이 생성되는데, 생성시 root의 사용자와 그룹으로 지정하여 생성하고 퍼미션은 444(read)생성하되, 텍스트 데이터는 Hello Pupplet라는 데이터로 저장 pupplet 적용하기 [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파일이 생성되었는지 확인 Agent 작업하기 [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파일이 생성되었는지 확인 Reference https://docs.puppetlabs.com/guides/install_puppet/install_el.html?_ga=1.81661140.2146970350.1440482857// 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// puppet 에이전트 설정값 확인 puppet agent 설정값 확인하고 싶을때 $> puppet agent --configprint all gitlab버전정보 확인방법 gitlab 설치된 버전정보 # 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 설치 가이드 설치파일 다운로드 $ curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash Gitlab config 설정(변경이 필요한 사항만 기재)  $> 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" Gitlab구성 $> 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 redis socket 파일 위치 변경 ( gitlab-ctl status 실행결과시 redis가 down되어 있는 경우 조치) $> vi /opt/gitlab/redis/redis.conf ... unixsocket /opt/gitlab/redis/redis.socket ... gitlab 재시작 후 상태 확인 $> 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 설치 사양정보 hardware spec   최소사양 권장사양 CPU 2Core 4 Core Memory 4G 8G Disk 40GB 160GB software spec Software Version Docker 17.06.0 이상 Docker Compose 1.18.0 이상 Harbor설치 설치파일 다운로드 harbor설치파일 : Download URL :  https://github.com/goharbor/harbor/releases docker-compose : download URL :  https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m) 압축파일 해제 ># tar -xvf harbor-offline-installer-v1.7.6.tgz 설정파일 변경 ># vi harbor.cfg hostname = harbor Docker 실행시 iptables 정책 미생성 옵션 설정 ># cat /etc/docker/daemon.json { "iptables": false } Harbor 설정정보 파라미터 정보 용  도 hostname 설치하는 서버 호스트네임입력 Database-password Postgres root 패스워드 Database-max_idle_conns 최대 유휴연결 수(0은 무제한), 기본값은 50 Database-max_open_conns 최대 연결 수(0은 무제한), 기본값은 100 data_volume Harbor에 저장할 데이터 경로(호스트경로), 기본값은 /data Clair-updaters_interval Clair 업데이트 간격(0은 비활성화), 기본값은 12시간 max_job_workers 이미지 복제작업 최대 수, 기본값은 10 Notification-webhook_job_max_retry Webhook 최대 재시도 횟수, 기본값은 10 Chart-absolute_url Enable : 차트에서 사용할 절대URL경로 disabled : 차트에서 사용할 상대URL경로 log_level Debug, info, warning, error, fatal 중 선택, 기본값은 info log_rotate_count 로그파일 최대 생성갯수, 기본값은 50 log_rotate_size 로그파일당 최대 사이즈, 기본값은 200M log_external_endpoint syslog연동시 사용 log_location 로그를 저장할 디렉토리, 기본값은 /var/log/harbor Proxy-http_proxy http프록시 사용시 설정 Proxy-https_proxy https프록시 사용시 설정 Proxy-no_proxy 프록시 미사용시 설정 설치수행  (추후 속성변경 혹은 재설치시 필요한 파일들이기 때문에, 데이터 삭제하면 안됨)  ># install.sh 설치옵션 설정 옵션정보 설  명 --with-notary https를 사용할 경우 설정 --with-clair 보안취약점에 대한 정적분석 기능 활성화 --with-chartmuseum 차트기능 활성화 Docker Container 실행상태 확인 > # 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 웹 브라우저에서 harbor 로그인 (기본 로그인 정보 : admin / Harbor12345),  로그인 후 반드시 패스워드 변경 필요 Harbor 운영 계정관리 계정추가 Administration -> Users 진입 New User 선택 후 사용자명,  email주소, 패스워드 순으로  입력 * 패스워드는 8-20자, 최소 대소문자/숫자 1개씩 입력되어야 함 관리자 계정 권한 변경 Administratoration -> User진입 변경할 계정명 선택 후 SetAdmin 선택  프로젝트 관리 프로젝트 생성 Project -> NEW PROJECT -> 생성할 Project이름 -> 속성 입력 Access Level : 프로젝트의 공개여부 (Public으로 설정하는 경우 모든 계정에서 프로젝트가 조회됨), 기본값은 private 프로젝트 권한설정 생성한 프로젝트 → Member  진입 +USER 메뉴 선택 후 추가할 계정명 입력 부여할 권한 선택 Role 이름 권  한 Project Admin push / pull / delete Developer push / pull Guest Pull Harbor 재설정 Harbor 구성 재설정 (harbor 설치파일 파일(install.sh 있는 곳으로 이동) ># docker-compose down -v 설정정보 변경 작업 진행 ># docker-compose up -d 실행중인 컨테이너 정보만 중지 (이미지데이터와 DB파일 유지) ># docker-compose down -v 기존정보 삭제 후 재설치시 ># 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://lannstark.tistory.com/97 https://medium.com/@nanditasahu031/packer-create-nginx-ami-using-packer-f9cb600791a6