본문 바로가기

Ansible

0406_Ansible_(3)_변수 설정

변수(Variables)

  • 재사용할 수 있는 값을 저장하기 위하여 사용

ex) 설치할 패키지의 이름, 서비스의 이름, 추가할 파일의 경로, 인터넷 경로 주소…

  • 변수 이름 규칙
    • 사용할 수 있는 글자: 영문자(대소문자), 숫자, 밑줄
    • 문자로 시작
    • 일부 예약어 python의 예약어 등을 피해서 사용

 

변수의 위치

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

 

---

- name: webserver is ready

  hosts: webservers

  become: true

  vars:

    package: httpd

    service: httpd

    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

 

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

[webservers]

managed1.example.local  service=httpd, package=httpd, firewall_svc=http

 

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

[websevers:vars]

service=httpd

package=httpd

firewall_svc=http

 

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

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

 

.

├── ansible.cfg

├── group_vars

│   └── webservers

├── host_vars

│   └── managed1.example.local

├── http.yml

├── inventory

├── webservice2.yaml

└── webservice.yaml



변수 호출

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

 

변수의 우선순위

  • 우선순위가 높은 위치와 낮은 위치에서 동일한 변수를 같이 지정할 경우, 높은 우선순위의 위치에서 선언된 변수로 지정됨
  • 우선순위 (위쪽이 높은 우선순위)
  1. 명령줄에서 정의한 변수
  2. 플레이에서 지정한 변수
  3. 인벤토리에서 지정한 호스트변수
  4. 인벤토리에서 지정한 그룹 변수

 

사용예

  1. 플레이에 변수 선언

---

- 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

 

  1. 플레이 내에 변수 파일 포함

---

- 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

 

  1. 인벤토리에 변수 선언

 

- 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

 

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

 

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

 

$ mkdir group_vars

$ cat > group_vars/dbservers

service: mariadb

package: mariadb-server

firewall_svc: mysql

 

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

 

---

- 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

 

사전(Dictionary) 형태의 변수 사용

 

---

- 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)
  • 구식 표기방식을 사용하지 않을 경우, 환경설정파일의 [defaults] 섹션에 ‘inject_facts_as_vars = false’ 설정을 넣을 경우 ansible_facts 형태의 변수만 사용가능

 

사용자 지정 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=http

 

  • 사용자 지정 팩트 항목은 팩트 수집 이후 ansible_facts.ansible_local 항목으로 접근 가능

 

===================================================================

 

'Ansible' 카테고리의 다른 글

0408_Ansible_(5)_ 작업 제어  (0) 2021.04.09
0407_Ansible_(4)_파일 관리 모듈  (0) 2021.04.08
0405_Ansible_(2)_Playbook  (0) 2021.04.08
0405_Ansible_(1)_설치 및 준비  (0) 2021.04.08