ENCORE CLOUD ARCHITECTURE TIL 4/7 Ansible Playbook

변수(Variables)

재사용할 수 있는 값을 저장하기 위하여 사용
ex) 설치할 패키지의 이름, 서비스의 이름, 추가할 파일의 경로, 인터넷 경로 주소…

변수 이름 규칙

사용할 수 있는 글자: 영문자(대소문자), 숫자, 밑줄
문자로 시작

변수의 위치

전역 범위 : 명령줄, Ansible 설정에서 변수를 지정
ansible-playbook <플레이북 파일명> -e “변수이름=변수값”
플레이 : 플레이북의 구조에서 선언
플레이의 vars 예약어를 사용하여 변수를 지정

---
- name: webserver is ready
  hosts: webservers
  become: true
  vars:     -----------> 변수 선언
    package: httpd     ---------> package 변수 값 = httpd
    service: httpd     ---------> service 변수 값 = httpd
    firewall_svc: http ---------> firewall_svc 변수 값 = http
...

별도의 파일을 사용하여 변수 지정: YAML 포맷으로 작성

$ cat http.yml 
package: httpd
service: httpd
firewall_svc: http

파일을 불러올 때는 vars_files 예약어를 사용하여 변수가 들어있는 파일을 지정

---
- name: webserver is ready
  hosts: webservers
  become: true
  vars_files:   ------------> 변수 선언
    - http.yml  ------------> 변수 저장한 파일 사용

호스트/그룹 : 인벤토리 내의 특정 호스트/그룹

인벤토리 내 특정 호스트에 대한 변수 설정: 인벤토리 내 호스트 목록 뒤

$ vi inventory

[webservers]
managed1.example.local  service=httpd, package=httpd, firewall_svc=http
managed1.example.local 에 대해서만 해당 변수 지정

인벤토리 내 특정 그룹에 대한 변수 설정: [그룹이름:vars] 항목으로 변수 지정

$ vi inventory

[websevers:vars]
service=httpd
package=httpd
firewall_svc=http

webservers 그룹에 대해서 변수 지정

각 호스트에 대한 변수를 디렉토리 내 별도의 파일로 저장 : host_vars/<호스트이름>
각 그룹에 대한 변수를 인벤토리 내 별도의 파일로 저장 : group_vars/<그룹이름>

$ tree  (tree 없으면 yum install tree)

.
├── ansible.cfg
├── group_vars
│   └── webservers
├── host_vars
│   └── managed1.example.local
├── http.yml
├── inventory
├── webservice2.yaml
└── webservice.yaml

변수 호출

{{ 변수명 }}
값의 시작 부분이 변수로 시작하는 경우 반드시 " "로 묶어줄 것
값이 목록으로 작성되는 경우와 혼동될 수 있음

변수의 우선순위

우선순위가 높은 위치와 낮은 위치에서 동일한 변수를 같이 지정할 경우, 높은 우선순위의 위치에서 선언된 변수로 지정됨

우선순위 (위쪽이 높은 우선순위)
명령줄에서 정의한 변수
플레이에서 지정한 변수
인벤토리에서 지정한 호스트변수
인벤토리에서 지정한 그룹 변수

변수 선언 사용 예

#플레이에 변수 선언
---
- name: webserver is ready
  hosts: webservers
  become: true
  vars:
    package: httpd
    service: httpd
    firewall_svc: http
  tasks:
    - name: "{{ package }} package is installed"
      yum:
        name: "{{ package }}"
        state: latest
    - name: "{{ service }} service is enabled and started"
      service:
        name: "{{ service }}"
        enabled: true
        state: started
    - name: "firewall {{ firewall_svc }} service is opened"
      firewalld:
        service: "{{ firewall_svc }}"
        state: enabled
        permanent: true


#플레이 내에 변수 파일 포함
---
- name: webserver is ready
  hosts: webservers
  become: true
  vars_files:
    - http.yml
  tasks:
    - name: "{{ package }} package is installed"
      yum:
        name: "{{ package }}"
        state: latest
    - name: "{{ service }} service is enabled and started"
      service:
        name: "{{ service }}"
        enabled: true
        state: started
    - name: firewall {{ firewall_svc }} service is opened
      firewalld:
        service: "{{ firewall_svc }}"
        state: enabled
        permanent: true


#인벤토리에 변수 선언
---
- name: dbserver is ready
  hosts: dbservers
  become: true
  tasks:
    - name: "{{ package }} package is installed"
      yum:
        name: "{{ package }}"
        state: latest
    - name: "{{ service }} service is enabled and started"
      service:
        name: "{{ service }}"
        state: started
        enabled: yes
    - name: firewall {{ firewall_svc }} service is opened
      firewalld:
        service: "{{ firewall_svc }}"
        state: enabled
        permanent: yes
        
# 인벤토리 파일 내용       
$ cat inventory
[webservers]
managed1.example.local

[dbservers]
managed2.example.local	service=mariadb

[dbservers:vars]
package=mariadb-server
firewall_svc=mysql

[allservers:children]
webservers
dbservers

호스트에 대해 명령 실행 시 호스트 변수 및 그룹 변수 모두 사용 가능

별도의 파일로 호스트/그룹 변수 파일 생성

$ mkdir group_vars       ----------> group_vars 이름 고정!!
$ cat > group_vars/dbservers
service: mariadb
package: mariadb-server
firewall_svc: mysql

변수를 사용하여 두 개의 플레이를 하나로 통합

---
- name: webservers and dbservers are ready
  hosts: webservers, dbservers
  become: true
  tasks:
    - name: "{{ package }} package is installed"
      yum:
        name: "{{ package }}"
        state: latest
    - name: "{{ service }} service is enabled and started"
      service:
        name: "{{ service }}"
        enabled: true
        state: started
    - name: firewall {{ firewall_svc }} service is opened
      firewalld:
        service: "{{ firewall_svc }}"
        state: enabled
        permanent: true
	...
    
$ cat group_vars/*

service: mariadb
package: mariadb-server
firewall_svc: mysql

service: httpd
package: httpd
firewall_svc: http

변수의 배열 사용

ex) 사용자 추가를 위한 변수 선언

단순 변수 형태

user1_id
user1_uid
user1_homedir
user1_login_shell
user2_id
user2_uid
user2_homedir
user2_login_shell

배열 형태

user1
id
uid
homedir
login_shell
user2
id
uid
homedir
login_shell

사용자들이 저장된 배열

users
user1
id
uid
homedir
login_shell
user2
id
uid
homedir
login_shell

변수 호출방식

users.user1.id
users[‘user1’][‘id’]

명령 출력 캡쳐

register : 모듈 실행시 실행 결과를 지정한 이름의 변수에 저장
debug : 변수의 값 등을 출력할 수 있는 모듈

테스트용 플레이북

---
- name: register and debug test
  hosts: webservers
  become: true
  tasks:
    - name: install package
      yum:
        name: tree
        state: latest
      register: result
    - name: print result
      debug:
        var: result

변수의 목록(배열), 사전

목록이나 사전을 사용하지 않는 유형

---
- name: variable test
  hosts: webservers
  vars:
    user1_id: alice
    user1_uid: 10000
    user1_homedir: /home/alice
    user2_id: bob
    user2_uid: 10001
    user2_homedir: /home/bob
  tasks:
    - name: print username
      debug:
        var: user1_id
    - name: print user uid 
      debug:
        var: user1_uid
    - name: print user home directory
      debug:
        var: user1_homedir

목록(배열) 형태로 사용할 경우

---
- name: variable test
  hosts: webservers
  vars:
    user1:
      - alice
      - 10000
      - /home/alice
    user2:
      - bob
      - 10001
      - /home/bob
  tasks:
    - name: print username
      debug:
        var: user1[0]
    - name: print user uid 
      debug:
        var: user1[1]
    - name: print user home directory
      debug:
        var: user1[2]
    - name: print user home directory
      debug:
        var: user1

사전 형태의 변수 사용

---
- name: variable test
  hosts: webservers
  vars:
    user1:
      id: alice
      uid: 10000
      homedir: /home/alice
    user2:
      id: bob
      uid: 10001
      homedir: /home/bob
  tasks:
    - name: print username
      debug:
        var: user1['id']
    - name: print user uid
      debug:
        var: user1.uid
    - name: print user home directory
      debug:
        var: user1.homedir
    - name: print user home directory
      debug:
        var: user1
        
---
- name: variable test
  hosts: webservers
  vars:
    users:
      user1:
        id: alice
        uid: 10000
        homedir: /home/alice
      user2:
        id: bob
        uid: 10001
        homedir: /home/bob
  tasks:
    - name: print username
      debug:
        var: users['user1']['id']
    - name: print user uid
      debug:
        var: users.user1.uid
    - name: print user home directory
      debug:
        var: users.user1.homedir
    - name: print user home directory
      debug:
        var: users

팩트 (Ansible Facts)

Ansible Facts
Ansible이 대상 시스템으로부터 자동으로 수집한 정보
수집한 정보를 변수 형태로 저장
대상 시스템의 상태를 확인하고 상태에 따라 조치하도록 하기 위하여 사용
플레이북을 작성하고 실행 시 기본적으로 각 플레이의 시작 단계에서 수행
필요에 따라 팩트 수집을 해제할 수 있음

#gather_facts 항목을 플레이에 설정
---
- name: variable test
  hosts: webservers
  gather_facts: no
  tasks:

필요에 따라 직접 팩트 수집을 수행할 수 있음 : setup (모듈)
기본적으로 setup 모듈에 수집할 항목들이 지정되어 있음

ansible_facts

setup 모듈에 의해 수집된 팩트 정보가 저장되는 변수
ansible_facts.[팩트항목] 형태로 각 팩트에 접근
hostname : 짧은 호스트이름 (도메인이름 제외)
fqdn : 전체 호스트이름 (도메인이름 포함)
default_ipv4.address : 대상의 IP주소 정보
interfaces : 네트워크 인터페이스 정보
kernel : 커널 정보(버전)
devices.sda.partitions.sda1.size : 장치 정보

---
- name: Ansible Facts test
  hosts: webservers
  tasks:
    - name: print fact variable value
      debug:
        var: ansible_facts.hostname

ansible_facts[‘팩트항목’] 형태도 사용가능

---
- name: Ansible Facts test
  hosts: webservers
  tasks:
    - name: print fact variable value
      debug:
        var: ansible_facts['hostname']

setup 모듈을 ad-hoc 방식으로 실행할 경우, ansible_facts 변수의 하위 항목이 구식 표기방법으로 표기됨(eg. ansible_hostname, ansible_fqdn)

사용자 지정 Facts

기본 Ansible Facts 와 같이 setup에 의해서 수집되는 데이터를 사용자가 직접 지정
파일 형태로 팩트로 제공할 내용을 미리 작성해 놓아야 함
/etc/ansible/facts.d 디렉토리 내에 .fact로 끝나는 이름으로 작성

# cat /etc/ansible/facts.d/test.fact
[users]
user1=alice
user2=bob

[webservice]
package=httpd
service=httpd
firewall_svc=httpd

좋은 웹페이지 즐겨찾기