5. 자동화/IaC

Ansible 기술정보

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

image.png

perplexity 에서 생성한 AI이미지

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

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

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


Ansible은 2015년에 Redhat에서 인수한뒤 https://www.ansible.com/ 에서 관리하고 있어요.

Ansible 기술정보

2- Ansible 기본구조

image.png
perplexity에서 생성한 AI이미지
  1. Redhat기준으로 Ansible 구성은 이렇게 되어 있습니다.
    컴포넌트명 비 용 OSS Project
    Ansible Core Free Ansible https://github.com/ansible/ansible
    Ansible Tower Commercial AWX https://github.com/ansible/awx

  2. Ansible에서 사용하는 용어를 정리하면...
    구성정보 용 도
    inventory 배포 대상 정보가 기록된 정보
    playbook
    – role
    – task
    – template
    – vars
    배포시 사용하는 배포코드
    – 여러가지 배포업무가 수행될때 나눌 수 있는 리스트
    – 배포 업무 수행
    – 설정파일같은 템플릿화된 파일을 배포시 사용
    – 배포코드 작성시 등록한 변수리스트
  3. 프로비저닝 대상서버 접근 방식
    Target OS 접근방식 / 기본포트 추가 설명
    Windows WinRM / tcp/5986 Windows장비가 winrm 접근할 수 있게 설정되어 있어야 함
    Windows7 이상부터 사용가능
    Linux / Switch ssh / tcp/22 Telnet은 지원하지 않음

Ansible 기술정보

3- ansible 설치하기

image.png

perplexity에서 생성한 AI이미지
  1. yum으로 설치하기
    $> yum install epel-release -y
    $> yum install ansible -y
  2. pip으로 설치하기
    $> pip install ansible
Ansible 기술정보

4- Ansible inventory 작성하기

image.png

perplexity에서 생성한 AI이미지

ansible의 inventory는 배포대상 서버정보를 구성하는 파일입니다.

rpm으로 설치할 경우 기본적으로 구성된 inventory는 /etc/ansible/hosts에서 작성할 수 있는데, playbook 작성에 따라
자체 inventory를 가질 수 있으니 참고만 해주세요.

  1. inventory에서 작성할 수 있는항목은 group, children, vars 를 자주 사용하는데요.
  2. 그룹명 web은 하위그룹으로 nginx, apache가 있다고 가정해보죠.
  3. 192.168.10.10, 192.168.10.15까지는 nginx를 설치할꺼고 192.168.100.10부터 192.168.100.15까지는 apache를 설치할꺼예요.
  4. playbook 코드도 그룹을 기준으로 설치할꺼예요.
  5. ansible 접속을 위한 계정은 ansible이고, ssh포트는 2022를 사용할꺼예요

이렇게 구성하기 위한 인벤토리는 다음값으로 설정이 가능합니다. 인벤토리는 /home/ansible/inventory 파일로 작성할게요

$ 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"
}
...
Ansible 기술정보

5- Ansible Playbook작성하기

image.png

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 입니다.

배포코드 작성시 유의사항

Ansible 기술정보

6 - AWX 설치절차

image.png
perplexity에서 생성한 AI이미지

Redhat에서는 Ansible Tower라는  software는 판매하고 있지요.

이 Ansible tower의 Opensource 버전이 AWX라는 녀석인데요. 이녀석을 설치해보려고 합니다.

참고로 AWX 18버전부터는 kubernetes operator을 이용해 설치해야 방식으로 변경이 되었고, 

저는 14버전으로 설치하는 설차를 기록해놓으려고 합니다.


  1. AWX컨테이너 용도
    • awx_web : AWX Frontend 용 Container 
    • awx_task : Ansible task용 Container
    • postgres : awx DB용 Container
    • redis : AWX Cache 관리용 Container
  2. 설치정보
    • Hardware : 2Core / 8G Mem 이상 / 60G Disk 이상
    • OS : Centos7 이상
    • Version :  AWX 14.1.0 : Ansible 2.9.10 / python 3.6 / pip 20.1.1 / docker  18.09.7
  3. software 설치 
    • Ansible 설치
      $> 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 컨테이너 재기동 필요
  4. AWX 접근

    • 웹 브라우져에서 AWX 접근 ( http://{{서버IP}}:8088 )
    • 최초 접근시 AWX is Upgrading 메세지 출력 (1회한)

      image.png


    • 업그레이드 완료되면 로그인 진행 (admin / password , 패스워드 변경 필)

      image.png


Ansible 기술정보

7- awx에서 rest api 사용하기

awx에서 제공하는 restapi 사용방법

  1. 전체 기능은 : http://192.168.20.10:8801/api/v2/ 에 접속하면 전체 api 기능 확인가능

image.png

perplexity에서 생성한 AI이미지

사전작업

  1. admin 계정으로 awx 로그인
  2. 관리 → application → 새로생성
    1. authorization grant type은 resource owner password=based,
    2. client type → confidential
  3. 관리 → user 에서 api용으로 사용할 서비스 계정 생성 후 token 생성
    1. application에는 2번에서 생성한 application 선택
    2. scope는 write로 선택
      1.생성된 token값은 복사 (재 확인할 수 있는 절차가 없음)

API 사용예제

  1. inventory 조회
    $ 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 정보 조회
    $ 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조회
    $ 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 실행
    $ 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. 호스트 등록
    $ 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. 그룹에 해당 호스트 추가
    $ 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. 호스트 삭제
    $ 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"
    }'
Ansible 기술정보

8- Ansible Role

이번엔 ansible role기반으로 배포절차를 만들어 보려고 합니다.

배포범위가 많아지면 하나의 플레이북으로 관리하기 힘들기 때문에 role이라는 이름으로 역활을 나누어서 배포할 수 있습니다.

image.png

perplexity에서 생성한 AI이미지

  1. playbook디렉토리에 roles 하위 디렉토리별로 수행해야할 역활을 기재해주시면 되고요....
  2. role기반의 디렉토리 구조는 다음과 같습니다.
    $> tree -d -L 4
    ./
    ├── main.yml
    └── roles
        ├── os
        │   └── linux
        │       ├── setup
        │       │   ├── tasks
        │       │   │   ├── centos6.yml
        │       │   │   ├── centos7.yml
        │       │   │   ├── main.yml
        │       │   │   └── rocky8.yml
        │       │   └── templates
        │       │       ├── ntp.conf.j2
        │       │       └── resolv.conf.j2
        │       └── kernel_tune
        │            └── tasks
        │                └── main.yml
        └── software
            ├──apache
            │   ├── tasks
            │   │   ├── main.yml
            │   ├── templates
            │   │   ├── apache_logrotate.j2
            │   │   ├── apache_systemd.j2
            │   │   └── apache.conf.j2
            │   └── vars
            │       └── vars.yml
            └── nginx
                 ├── tasks
                 │   ├── main.yml
                 ├── templates
                 │   ├── nginx_logrotate.j2
                 │   ├── nginx_systemd.j2
                 │   └── nginx.conf.j2
                 └── vars
                     └── vars.yml
    

    1. 세부디렉토리 정보는 다음과 같습니다.
      1. main.yml --> 배포하는 yml파일
      2. roles --> role 디렉토리
      3. roles/os/linux/setup/task/ --> OS프로비져닝 하기 위한 플레이북 (default는 해당경로의 main.yml 파일을 실행)
      4. roles/os/linux/setup/templates/  --> 해당 role에 templates 배포할떄 사용하는 디렉토리
      5. roles/os/linux/setup/vars/  --> 해당 role에 정의할 외부변수 저장용 디렉토리
  3. main.yml 파일내용은 다음과 같이 작성합니다.
     $> cat main.yml 
    ---
    - name: Setup
      hosts: "{{ target_hosts | default('all') }}"
      gather_facts: yes
      serial: "3"
      become: yes
      roles:
       - { role: os/linux/setup, tags: [ setup ] }  #Linux초기 설치 Role template
       - { role: os/linux/tune, tags: [ tune ] }  #nfs 서버 구성 후 마운트 template
       - { role: software/apache, tags: [ apache ] }  #로그백업 스크립트 배포 template
       - { role: software/nginx, tags: [ nginx ] } # VCS구동을 위한 배포 Template
    


  4. role을 실행할때는 job_tag라는 옵션(-t)으로 분리해서 사용하면 됩니다.
    nginx를 설치하기 위한 절차는 다음과 같이 사용하면 됩니다.
    $>ansible-playbook -i host main.yml -t nginx

Ansible 기술정보

9-AWX 사용메뉴얼

image.png

perplexity에서 생성한 AI이미지

대쉬보드

  1. AWX로그인 후 첫 페이지, 작업상태 및 호스트상태, 최근 사용한 템플릿과 최근 실행한 작업 요약 확인 가능 ( ACCESS → DASHBOARD )

    image.png

최근 실행 작업

  1. 최근에 실행한 템플릿의 요약정보 확인 ( ACCESS → Jobs )
    image.png

  2. Job결과 확인
    1. 아이콘 확인
      1. image.png : 정상 작업 완료
      2. image.png : 작업 실패
    2. 작업관리
      1. image.png : 동일한 vars값으로 재실행
      2. image.png  : 작업이력 삭제

스케쥴 확인

  1. 스케쥴링 설정된 작업 리스트 (ACCESS → Schedules )
    image.png
  2. 스케쥴 작업 관리 (왼쪽에서부터)
    항목 설 명
    활성화 체크+파란색 아이콘 : 활성화 체크X + 회색 아이콘 : 비활성화
    NAME 스케쥴 이름
    TYPE Template 유형
    NEXT RUN 다음 실행 시간 (빈칸일 경우 스케쥴링 실행되지 않음)
    ACTION image.png : 스케쥴 정보 수정
    image.png: 스케쥴 정보 삭제

관리 메뉴

조직관리

  1. 사용자 / 팀 / 프로젝트 / 인벤토리를 관리하는 최 상단 그룹( ACCESS → ORGANIZATIONS)\
  2. 조직  계층 구조
    image.png
  3. 조직생성 (image.png 버튼 선택)
    1. 조직 생성 입력 화면
      image.png
    2. 항목별 상세설명
      항 목 값 설명 비 고
      NAME 조직이름 필수
      DESCRIPTION 조직에 대한 설명 옵션
      INSTANCE GROUPS 인스턴스 그룹 옵션
  4. 조직 관리
    1. USERS : 조직에 소속시킬 사용자 (계정명 선택)
    2. PERMISSIONS : 조직의 권한설정
      항 목 설 명
      Admin 전체 권한 부여
      Execute 프로젝트 실행만 가능
      Project Admin 프로젝트 생성 / 수정 / 읽기 가능
      Inventory Admin 인벤토리 생성 / 수정 / 읽기 가능
      Credential Admin 자격증명 생성 / 수정 / 읽기 가능
      Workflow Admin 워크 플로우 생성
      Notification Admin 알림 할당
      Auditor 읽기 전용 권한
      Member 템플릭을 제외한 모든 기능 읽기 가능
      Read 읽기 전용 권한
    3. NOTIFICATIONS : 알람정책 관리 : 알람생성은 ( {{ 참조 }} )

사용자 관리

  1. AWX에 접근하는 사용자의 관리 ( ACCESS → Users)
  2. 사용자 생성 (image.png 버튼 선택)
    1. 사용자 입력 화면
      image.png
    2. 항목별 상세 설명
      항 목 값 설명 비 고
      FIRST NAME 사용자 이름 정보 옵션
      LAST NAME 사용자 이름 정보 옵션
      ORGANIZATION 계정 소속 조직 필수
      EMAIL 해당 계정 이메일주소 필수
      USERNAME 계정명 필수
      PASSWORD 계정 패스워드 필수
      CONFIRM PASSWORD 계정 패스워드 확인 필수
      USER TYPE 계정 권한 옵션
  3. 사용자 관리 
    1. USER TYPE별 권한 정보
      권한명 설 명
      Normal User 사용이 제한된 권한, 권한 정책에 따라 읽기/쓰기 가능
      System Auditor 모든 속성에 대해 읽기 권한
      System Administrator 모든 속성에 대해 읽기/쓰기 권한 (= superuser)

팀 관리

  1. 사용자 / 프로젝트  권한을 설정할 수 있는 조직단위의 세부 구성 ( ACCESS → TEAM)
  2. 팀 생성 
    1. 팀 생성 입력 화면
      image.png
    2. 항목별 상세설명
      항 목 값 설명 비 고
      NAME 팀 이름 필수
      DESCRIPTION 팀 설명 옵션
      ORGANIZAION 소속된 조직 필수
  3. 팀 관리
    1. USER : 팀 소속 사용자
    2. PERMISSION  : 템플릿 / 워크플로우 / 프로젝트 / 인벤토리 / 인증 / 조직별 권한 설정
      1. 템플릿 권한
        항 목 설 명
        Admin 선택한 템플릿의 전체 권한
        Execute 선택한 템플릿의 실행 / 점검권한
        Read 선택한 템플릿의 읽기 권한
      2. 워크플로우 권한
        항 목 설 명
        Admin  선택한 템플릿의 전체 권한
        Execute  선택한 템플릿의 실행 / 점검 권한
        Read  선택한 템플릿의 읽기 권한
        Approve 작업승인여부 관리
      3. 프로젝트 권한
        항 목 설 명
        Admin  선택한 프로젝트의 전체 권한
        Execute  선택한 프로젝트의 설정 / 점검권한
        Read  선택한 프로젝트의 읽기 권한
      4. 인벤토리 권한
        항 목 설 명
        Admin  선택한 인벤토리의 전체권한
        Update  인벤토리 업데이트 권한
        Ad Hoc 임시명령 (ping, win_ping 등) 실행 가능 권한
        Use  인벤토리 사용 권한
        Read  인벤토리 읽기 권한
      5. 조직 권한
        항 목 설 명
        Execute 실행 / 점검 권한
        Project Admin 프로젝트 생성 / 수정 / 읽기 가능
        Inventory Admin 인벤토리 생성 / 수정 / 읽기 가능
        Credential Admin 자격증명 생성 / 수정 / 읽기 가능
        Workflow Admin 워크 플로우 생성
        Notification Admin 알림 할당
        Job Template Admin 템플릿 관리 권한
        Auditor 읽기 전용 권한
        Read 읽기 전용 권한

인증정보

  1. AWX 사용에 필요한 계정정보 (RESOURCES → Credentials)
  2. 인증정보 생성  (image.png 버튼 선택)
    1. Machine 타입으로 인증생성 입력화면
      image.png
    2. 항목별 상세설명

      항 목 설 명 비 고
      NAME  계정이름 필수
      DESCRIPTION  계정설명 옵션
      ORGANIZATION  소속 조직 옵션
      CREDENTIAL TYPE (Machine ) winrm / ssh 등 장비로그인시 사용 필수
      USERNAME  실제 로그인하는 계정명 필수
      비밀번호  로그인시 사용하는 패스워드 필수
      PRIVILEGE ESCALATION METHOD 상위 계정(root)을 권한 상승 방식 옵션
      PRIVILEGE ESCALATION USERNAME 권한상승시 필요한 계정 옵션
      PRIVILEGE ESCALATION PASSWORD 권한 상승하기 위한 패스워드 입력 옵션
    3. Source control 타입으로 인증생성 입력화면
      image.png
    4. 항목별 상세설명
      항 목 설 명 비 고
      NAME  계정이름 필수
      DESCRIPTION  계정설명 옵션
      ORGANIZATION  소속 조직 옵션
      CREDENTIAL TYPE (Machine ) Git / subversion 로그인시 사용 필수
      USERNAME  실제 로그인하는 계정명 필수
    5.  

프로젝트

  1. playbook이 저장된 위치 설정  (RESOURCES → Project)
  2. 프로젝트 생성 방법 (image.png 버튼 선택)
    1. 프로젝트 생성 입력 화면

      image.png
    • 항목별 상세설명

      항 목 설 명 비 고
      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인 경우 사용안함)

인벤토리 

  1. 작업을 위한 호스트 모음 (RESOURCES → Inventories)
  2. 인벤토리 생성 방법 (image.png 버튼 선택)
    1. 인벤토리 생성 입력화면
      image.png
    2. 항목별 상세설명
      항 목 설 명 비 고
      NAME  인벤토리 이름 필수
      DESCRIPTION  인벤토리 설명 옵션
      ORGANIZATION  소속 조직 필수
      INSIGHTS CREDENTIAL redhat Insights  계정선택 옵션 (redhat Insightst사용시 선택)
      Instance Group 인벤토리의 인스턴스 그룹 옵션 (사용하지 않음)

  3. 인벤토리 추가 설정
    1. 권한 설정 방법 (image.png 버튼 선택)
    2. 권한설정 입력화면 : 추가할 계정명 선택 후 설정할 권한 정보 선택
      image.png
    3.  정책별 상세 설명
      항 목 설 명
      Admin 모든 권한 부여
      Update SCM업데이트시 프로젝트 업데이트 가능
      Ad Hoc 임시 명령 사용가능
      Use 템플릿에서 해당 인벤토리 접근 가능
      Read 읽기전용

    1. 호스트 추가방법  (image.png 버튼 선택)
    2. 호스트 추가 입력화면
      image.png
    3. 항목별 상세설명
      항 목 설 명 비 고
      HOSTNAME 타켓호스트 IP입력(호스트네임 입력 무방) 필수 (호스트네임 입력시 ip와 매핑할 수 있는 정보 필요)
      DESCRIPTION 타켓호스트 설명 옵션
      VARIABLES ssh포트, 접속 방법 등 해당 호스트의 추가 설정값 입력 옵션 (기본은 ssh, tcp/22로 접근수행)
    4. PERMISSIONS : 접근계정 권한설정
    5. GROUPS : 각 호스트에 소속된 그룹정보 입력
      1. 그룹추가 방법 (image.png 버튼 선택)
      2. 그룹추가 입력화면
        image.png
      3. 항목별 상세설명
        항 목 설 명 비 고
        NAME 그룹이름 필수
        DESCRIPTION 그룹설명 옵션
        VALIABLES 이 그룹에 소속된 모든 호스트에 적용할 값 입력(yaml / json 지원 가능) 옵션

      4. 생성된 그룹에 하위 그룹 생성 방법 (생성된 그룹 →  GROUPS, image.png 버튼 선택)
        1. 기존에 생성된 그룹의 경우 Existing Group 선택)
        2. 하위그룹으로 관리할 그룹 명 선택 
          image.png
        3. 새로운 그룹인 경우 New Group 선택 후 그룹정보 입력
      5. 생성된 그룹에 소속시킬 호스트 등록 (생성된 그룹 → HOSTS)
        1. 기존에 생성된 호스트의 경우 Existing HOSTS 선택)
        2. 소속된 호스트 선택
      6. 새로운 호스트의 경우 New HOSTS 선택 후 호스트정보 입력
    6. HOTS : 해당 인벤토리에 등록할 호스트정보 등록
      1. 호스트 추가방법  (image.png 버튼 선택)
      2. 호스트 추가 입력화면
        image.png
      3. 항목별 상세설명
        항 목 설 명 비 고
        HOSTNAME 타켓호스트 IP입력(호스트네임 입력 무방) 필수 (호스트네임 입력시 ip와 매핑할 수 있는 정보 필요)
        DESCRIPTION 타켓호스트 설명 옵션
        VARIABLES ssh포트, 접속 방법 등 해당 호스트의 추가 설정값 입력 옵션 (기본은 ssh, tcp/22로 접근수행)
      4.  
  4. 다수서버 등록시 방법
    1. 인벤토리 신규 생성
    2. AWX Task Container 로그인
      $> docker exec -i -t awx_task /bin/bash

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

    4. 작성한 호스트파일로 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

템플릿

  1. Template을 이용한 배포작업 수행
    1. 배포수행하려는 템플릿의 image.png아이콘 선택
    2. Template별 생성된 서베이에 맞추어 선택후 마지막 PREVIEW 항목 확인 후 Launch 선택
      image.png
    3. 작업결과 확인 (정상종료인 경우 좌측 상단에 STATUS에 Successful )표기
      image.png
    4. 오류가 발생하는 경우 : 동일 위치에 FAILED로 표기, FAILED 발생 원인 분석 필요


    5. image.png

자격증명 관리

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

  1. 인증정책 관리  (ADMINISTRATION → CREDENTIAL TYPES)
  2. 인증절차 생성(image.png 버튼 선택)
    1. 인증절차 사용자 입력화면
      image.png
    2. 항목별 상세 설명
      항 목 값 설명 비 고
      NAME 자격증명 이름 필수
      DESCRIPTION 자격증명 설명 옵션
      INPUT CONFIGURATION 인증시 사용할 필드 구성 옵션
      INJECTION CONFIGURATION 인증시 전달할 환경변수 구성 옵션

알람관리

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

  1. 알람 정책 관리 (ADMINISTRATION → NOTIFICATION TEMPLATES)
  2. 알람방법 생성(image.png 버튼 선택)
    1. 알람정책 사용자 입력화면
      image.png
    2. 항목별 상세 설명
      항 목 값 설명 비 고
      NAME 알람정책 이름 필수
      DESCRIPTION 정책 설명 옵션
      ORGANIZAION 소속 조직 필수
      TYPE 설정가능한 알람리스트
      - Email
      - Grafana
      - HipChat
      - IRC
      - Mattermost
      - PagerDuty
      - Rocket.Chat
      - Slack
      - Twilio
      - Webhook
      필수
      CUSTOMIZE MESSAGES 메세지 발송시 작성되는 내용 변경시 선택 후 수정 옵션
  3. 알람설정
    1. 이메일 설정
      1. 이메일  정책 사용자 입력화면
        image.png
      2. 항목별 상세설명
        항 목 설 명 비 고
        USERNAME 발송계정 이름 옵션
        PASSWORD 발송계정 패스워드 옵션
        HOST 발송서버 필수
        RECIPIENT LIST 수신자 필수
        SENDER EMAIL 발송메일주소 필수
        PORT 메일발송 포트 필수
        TIMEOUT 발송최대 시간(초기준) 필수, 최대 120초까지 설정 가능
        EMAIL OPTIONS USE TLS / USE SSL 옵션TLS 나 SSL 사용시 선택
    2. 그라파나 설정
      1. 그라파나 정책 사용자 입력화면
        image.png
      2. 항목별 상세설명
        항 목 설 명 비 고
        GRAFANA URL 그라파나 api서비스 url 필수
        GRAFANA API KEY 그라파나에서 할당받은 api key 필수
        ID OF THE DASHBOARD 그라파나 계정에 대해 api키 만들때 고유한 ID로 대쉬보드 설정 옵션
        ID OF THE PANEL 그라파나에서 패널/그래프를 추가한 경우 해당 ID 옵션
        TAGS FOR THE ANNOTATION 이벤트 유형을 기재 옵션
        DISABLE SSL VERIFICATION 그라파나 접속시 SSL 인증서 확인절차 제외 여부 옵션
    3. 힙챗
      1. 힙챗 정책 사용자 입력화면
      2. 항목별 상세설명


관리작업

Cleanup 작업 관리 (ADMINISTRATION → MANAGEMENT JOBS)

  1. Cleanup Activity Stream (활동내역 삭제)
    1. 수동 실행 (image.png) 선택, 기본값은 별도 스케쥴링 없음image.png
    2. 보관기간 입력 후 LAUNCH 선택 
    3. 스케쥴 등록 (image.png)선택, 기본값은 별도 스케쥴링 없음
      필요한 스케쥴 등록 
      image.png

  2. Cleanup Expired OAuth 2 Tokens (만료된 2차 토큰정보  삭제)
    1. 수동 실행 (image.png)
    2. 스케쥴 등록 (image.png)선택, 기본값은 별도 스케쥴링 없음
      필요한 스케쥴 등록 

  3. Cleanup Expired Sessions (만료된 인증정보 삭제)
    1. 수동 실행 (image.png)
    2. 스케쥴 등록 (image.png)선택, 기본값은 별도 스케쥴링 없음
      필요한 스케쥴 등록 
  4. Cleanup Job Details (작업 내역 삭제)
    1. 수동 실행 (image.png)
      보관기간 입력 후 LAUNCH 선택
      image.png
    2. 스케쥴 등록 (image.png)선택, 
      필요한 스케쥴 등록 
      image.png


인스턴스 그룹

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

  1. 인스턴스 그룹 관리 (ADMINISTRATION → INSTANCE GROUPS)
  2. 인스턴스 그룹 생성(image.png 버튼 선택 → CREATE INSTANCE GROUP)
    1. 사용자 입력 화면
      image.png
    2. 항목별 세부설명
      항 목 값 설명 비 고
      NAME 인스턴스명 필수
      POLICY INSTANCE MINIMUM 그룹내에 유지할 최소 인스턴스 수 기본값 : 0
      POLICY INSTANCE PERCENTAGE 신규 인스턴스가 소속될 있는 최대 가용가능한 인스턴스 수 (백분율) 기본값 : 0 (무제한)
    3.  INSTANCES 설정화면 (다수의 AWX-UI 관리시 사용)
      image.png
      1. 최대로 사용햘 Forks 갯수 설정
    4. JOBS
      1. 해당 인스턴스에 수행한 Job정보 확인

AWX-UI 설정

UI기능 설정

  1. Authentication
    1. Azure / github / Google / LDAP / RADIUS 계정을 통해 로그인시 사용
  2. Jobs
    1. Ad hoc 을 사용할 수 있는 모듈 구성, 예약 작업 수 설정 가능
    2. 설정 화면
      image.png
    3. 항목별 상세설명
      항 목 값 설명 비 고
      ANSIBLE MODULES ALLOWED FOR AD HOC JOBS 임시작업으로 사용할 수 있는 명령어 종류  
      JOB EXECUTION PATH 작업수행을 위한 임시 경로 /tmp
      MAXIMUM SCHEDULED JOBS 최대 예약작업 갯수 10
      PATHS TO EXPOSE TO ISOLATED JOBS 격리된 작업시 허용되는 경로 (전체 경로 정보 입력필요 격리 작업 미사용
      PATHS TO HIDE FROM ISOLATED JOBS 격리된 작업시 숨길 경로 (전체 경로 정보 입력필요 격리 작업 미사용
      ENABLE JOB ISOLATION 작업 격리기능 사용여부 미설정
      DEFAULT JOB TIMEOUT 최대 작업 시간 (초단위) 0(무제한)
      DEFAULT INVENTORY UPDATE TIMEOUT 최대 인벤토리 업데이트 시간 (초단위) 0(무제한)
      RUN PROJECT UPDATES WITH HIGHER VERBOSITY 프로젝트 업데이트 실행시 자세한 정보 출력 미설정
      PER-HOST ANSIBLE FACT CACHE TIMEOUT 호스트 단위로 팩트캐쉬 시간 (초단위) 0(무제한)
      PRIMARY GALAXY SERVER URL 기본 ANSIBLE-GALAXY URL 변경시 사용 galaxy.ansible.com
      PRIMARY GALAXY SERVER 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에서 사용할 콜백용 플러그인  
  3. system
    1. AWX-UI의 기본URL, URL및 기본 가시정보 설정
    2. 설정화면
      image.png
    3. 항목별 상세설명
      항 목 값 설명 비 고
      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 자동화 분석을 위한 수집간격 자동화 분석 미사용
  4. User Interface
    1. API-UI 기능 설정
    2. 설정 화면
      image.png
    3. 항목별 상세설명
      항 목 설 명 비 고
      USER ANALYTICS TRACKING STATE 사용자 분석 추적기능 활성화 미사용
      CUSTOM LOGO 사용자 로그인시 노출될 이미지 필요시 이미지 추가
      CUSTOM LOGIN INFO 로그인시 추가 텍스트 입력 필요시 입력
 
 
Ansible 기술정보

10 - 데이터 백업/복구

image.png

perplexity에서 생성한 AI이미지
  1. AWX 데이터 백업

    $> tower-cli receive --all > backup.json
  2. AWX 데이터 복구

    $> 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 이름에 한글이 포함된경우 인코딩 에러가 나면서 복구 불가능함.

Ansible 기술정보

11-Foreman와 Ansible

image.png

perplexity에서 생성한 AI이미지

사전정보

  1. Ansible core는 cli기반의 기능만 제공하고 있고, web ui는 제공하지 않음
  2. Redhat에서는 Ansible Tower라는 상용 제품이 있긴 하지만, 가격이 매우 비쌈
  3. Opensource기반에서는 AWX를 사용하면 되는데,  AWX는 컨테이너 기반의 솔루션이라 컨테이너의 환경을 도입하기 어려운 곳에서 Foreman을 사용해서 ansible을 연동

설치구성

  1. foreman 설치를 위한 리포지터리 구성
    $ yum -y install https://yum.puppet.com/puppet6-release-el-7.noarch.rpm
    $ yum-config-manager --enable extras
    $ yum -y install epel-release centos-release-scl-rh
    $ curl https://yum.theforeman.org/releases/2.5/el7/x86_64/foreman-release.rpm -O
    $ yum install ./foreman-release.rpm
  2. foreman 패키지 설치
    $ yum install foreman foreman-installer -y
    $ foreman-installer
    2021-06-24 10:53:34 [NOTICE] [root] Loading installer configuration. This will ta
    2021-06-24 10:53:38 [NOTICE] [root] Running installer with log based terminal out
    2021-06-24 10:53:38 [NOTICE] [root] Use -l to set the terminal output log level t, or DEBUG. See --full-help for definitions.
    2021-06-24 10:53:41 [NOTICE] [configure] Starting system configuration.
    2021-06-24 10:54:52 [NOTICE] [configure] 250 configuration steps out of 1334 steps complete.
    2021-06-24 10:55:23 [NOTICE] [configure] 500 configuration steps out of 1336 steps complete.
    2021-06-24 10:55:35 [NOTICE] [configure] 750 configuration steps out of 1347 steps complete.
    2021-06-24 10:59:24 [NOTICE] [configure] 1000 configuration steps out of 1357 steps complete.
    2021-06-24 11:01:15 [NOTICE] [configure] 1250 configuration steps out of 1357 steps complete.
    2021-06-24 11:01:24 [NOTICE] [configure] System configuration has finished.
    Executing: foreman-rake upgrade:run
    `/usr/share/foreman` is not writable.
    Bundler will use `/tmp/bundler20210624-32690-b2erjo32690' as your home directory temporarily.
      Success!
      * Foreman is running at https://1.2.3.4
          Initial credentials are admin / 1234
      * Foreman Proxy is running at https://1234:8443
     
      The full log is at /var/log/foreman-installer/foreman.log
  3. webui 로그인 - https://1.2.3.4 (계정명은 상단 credentials 정보 확인)

    image.png


Foreman과 ansible연동

  1. foreman이 설치된곳에 ansible 설치 - 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

Ansible 기술정보

12-awx구동시 AWX Upgrading 무한반복 출력 해결방법

사전작업

  1. AWX 설치 - 6 - AWX 설치절차

image.png

perplexity에서 생성한 AI이미지

발생현상 및 조치방법

  1. AWX 설치 후 웹 UI 접근시 아래메시지창이 수십분이 흘러도 계속 출력함

  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 : 스냅샷형태로 관리


  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과 어떤점이 다른지 비교해보죠.

  1. 기능

    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 미러링 구성

 

사전정보

  1. gitlab설치 - gitlab설치
  2. Gitlab에서 Mirror용 계정은 sync계정이고, root 그룹에 소속되어 있음. (미러링 받는서버에 계정이 생성되어 있어야 함)
  3. gitlab 동기화 시간은 매 5분간격으로 동기화 수행함

미러링 구성

  1. 전송할 서버 설정
    1. 전송할 프로젝트 설정
      image.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


puppet 기술정보

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. 리포지터리 추가
    $> 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. 패키지 설치

    [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)
    1. 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호스트네임 기재
    2. 패키지 업그레이드
      [root@master ~]# puppet resource package puppet-server ensure=latest
      package { 'puppet-server':
       ensure => '3.8.2-1.el6',
      }
    3. 서비스 시작
      [root@master ~]# /etc/init.d/puppetmaster start
      Starting puppetmaster:                                     [  OK  ]
    4. 포트상태 확인
      [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번 포트가 오픈되어 있는지 확인.
  2. 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)
    1. 설정파일 수정
      [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. 서비스 시작
      [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
      * 프로세스 실핵확인하면 됨

서버 연동하기

  1. 마스터서버에서 인증작업하기



    1. 인증이 필요한 클라이언트 확인
      [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. 에이전트 인증작업 수행
      [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. 인증완료여부 확인
      [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
      도메인 옆에 +기호가 생기면 완료.
       
      연동이 잘 되었는지 테스트.
    4. 아래 경로에서 파일생성
      [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라는 데이터로 저장
    5. 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파일이 생성되었는지 확인
  2. 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

Reference

puppet 기술정보

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 설치 가이드

  1. 설치파일 다운로드
    $ curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
  2. 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"
  3. 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
  4. redis socket 파일 위치 변경 ( gitlab-ctl status 실행결과시 redis가 down되어 있는 경우 조치)
    $> vi /opt/gitlab/redis/redis.conf
    ...
    unixsocket /opt/gitlab/redis/redis.socket
    ...
  5. 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 설치

  1. 사양정보
  2. hardware spec
      최소사양 권장사양
    CPU 2Core 4 Core
    Memory 4G 8G
    Disk 40GB 160GB
  3. software spec
    Software Version
    Docker 17.06.0 이상
    Docker Compose 1.18.0 이상
  4. Harbor설치
    1. 설치파일 다운로드
    2. harbor설치파일 : Download URL : https://github.com/goharbor/harbor/releases
    3. docker-compose : download URL : https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)
  5. 압축파일 해제
    ># tar -xvf harbor-offline-installer-v1.7.6.tgz
  6. 설정파일 변경
    ># vi harbor.cfg
    hostname = harbor
  7. 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 프록시 미사용시 설정
  1. 설치수행 (추후 속성변경 혹은 재설치시 필요한 파일들이기 때문에, 데이터 삭제하면 안됨)
     ># install.sh
  1. 설치옵션 설정
    옵션정보 설  명
    --with-notary https를 사용할 경우 설정
    --with-clair 보안취약점에 대한 정적분석 기능 활성화
    --with-chartmuseum 차트기능 활성화
  2. 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
  3. 웹 브라우저에서 harbor 로그인 (기본 로그인 정보 : admin / Harbor12345), 로그인 후 반드시 패스워드 변경 필요

Harbor 운영

  1. 계정관리
    1. 계정추가
      1. Administration -> Users 진입
      2. New User 선택 후 사용자명,  email주소, 패스워드 순으로  입력

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

Harbor 재설정

  1. Harbor 구성 재설정 (harbor 설치파일 파일(install.sh 있는 곳으로 이동)
    ># docker-compose down -v

    설정정보 변경 작업 진행
    ># docker-compose up -d

  2. 실행중인 컨테이너 정보만 중지 (이미지데이터와 DB파일 유지)
    ># docker-compose down -v
  3. 기존정보 삭제 후 재설치시
    ># 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