DevOps/Docker, Jenkins, Ansible, Terraform

Ansible-Playbook

prden 2023. 2. 4. 21:17

Ansible이 작업장의 도구면 Ansible Playbook은 작업 메뉴얼이고 Inventory는 재료이다. 

 

1. Ansible 구성요소

1. Inventory : 관리할 대상의 서버 리스트, 자동화 대상(Managed Node)목록을 작성하는 곳
2. Modules : host에 action을 수행하는 스크립트, 자동화 기능 내장 패키지로 하나의 완전한 단위 기능 제공
3. Playbook :  앤서블의 구성, 배포 및 오케스트레이션이 포함된 파일로 OS 구성에서 애플리케이션 배포와 모니터링까지 4. 시스템의 상태를 순차적으로 정의할 수 있다. 
5. Plug-in: 확장 기능(emai, logging) 제공
6. Custom modules : 사용자가 작성한 모듈

 

2. Playbook 예시

// Playbook은 yaml 포멧으로 작성한다. 

- name: Create account # Playbook의 이름
  hosts: "{{ HOST_NAME }}" # Remote host 이름
  become: true # 명령을 실행하는 사용자 계정의 권한을 승격
  tasks: # Remote host에서 수행할 작업들
    - name: create user #create user task
      user: # user: user 모듈 사용 선언
        name: "{{ USER_NAME }}" #{{}} 이런 것들 playbook 실행 시 입력받을 인자 값, 생성할 사용자 계정이름
    - name: set password # set password task
      user:
        name: "{{ USER_NAME }}" # 생성할 사용자 계정 이름
        password: "{{ PASSWORD | password_hash('sha512') }}" # 생성할 사용자 계정 패스워드
    - name: create sudoers 
      copy: # copy 모듈 사용 선언
       content: | # content: 복사할 문자열
         {{USER_NAME}} ALL=(ALL) NOPASSWD:ALL
       dest: "/etc/sudoers.d/{{USER_NAME}}" # 복사할 목적지로 remote host의 절대경로
       owner: root # 복사할 목적지의 파일/디렉토리 소유자
       group: root # 복사할 목적지의 파일/디렉토리 그룹
       mode: 0664 # 복사할 목적지 파일/디렉토리 권한 입력

 

3. Playbook의 모듈

1) 변수(register), 메세지 출력(debug.msg) 모듈 : 

 Playbook에서 task를 수행시 어떤 결과를 저장하고 다음 단계에서 이 값을 사용하고 싶은 경우  register 모듈을 사용해 변수에 저장한다. 

- name: firstPlaybook
  hosts: "{{ HOST_NAME }}"
  become: true
  tasks:
  - name: Check OS version
    shell: cat /etc/*rele* |grep VERSION= # shell 모듈 선언 및 OS version 읽어오는 스크립트 작성
    register: result # 결과값을 저장할 변수
  - name: Print result variable
    debug:
      msg:
        - "{{ result.stdout }}"

변수에 결과를 저장하고 다른 task에서 해당 변수의 값을 사용할 수 있다.

반환 값에서 수행 겨로가 값만 가져오고 싶은 경우 "stdout" 또는 "stdout_lines"(결과 값이 여러 줄일 경우)을 사용하면 된다. 

 

2) 조건문(when) : Task를 특정 조건일 때만 수행하고 싶은 경우 when 모듈을 이용한다. 

- name: firstPlaybook
  hosts: "{{ HOST_NAME }}"
  become: true
  tasks:
  ...
  - name: Print result variable
    debug:
      msg:
        - "{{ result.stdout }}"
    when: result.stdout.find('17.04') != -1

“result.stdout”에는 “17.04”라는 문자열이 없으면 skip된다. 

 

3) 파일 생성하기(file) : 

- name: firstPlaybook
  hosts: "{{ HOST_NAME }}"
  become: true
  tasks:
  ...
  - name: Print result variable
    debug:
      msg:
        - "{{ result.stdout }}"
    when: result.stdout.find('16.04') != -1
  - name: Create a file
    file: #file: file 모듈 선언
      path: "/tmp/example.txt" # path : 파일을 생성할 경로
      state: touch # touch 옵션 선언, 파일이 존재하지 않을 경우에만 생성 조건
    delegate_to: localhost # localhost 옵션 선언, Ansible host에서만 실행된다. 
    run_once: yes # yes인 경우 1회만 실행된다.
    when: result.stdout.find('16.04') != -1

 

4) 파일에 결과 append하기(lineinfile)

- name: firstPlaybook
  hosts: "{{ HOST_NAME }}"
  become: true
  tasks:
  ...
  - name: Create a file
    file:
      path: "/tmp/example.txt"
      state: touch
    delegate_to: localhost
    run_once: yes
    when: result.stdout.find('16.04') != -1
  - name: Append result
    lineinfile: #lineinfile 모듈 선언 
      line: "{{ ansible_hostname }} : {{ (result.stdout | regex_replace('\"')).split('=')[1] }}" #파일에 추가할 값 입력
      dest: "/tmp/example.txt" # 파일 경로
      insertafter: EOF # 파일의 마지막에 추가
    delegate_to: localhost # Ansible host에서만 실행
    when: result.stdout.find('16.04') != -1

 

 

https://yunsangjun.github.io/automation/2019/11/18/ansible-playbook-advanced.html

 

Ansible Playbook 응용

Overview

yunsangjun.github.io