변수(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 |
변수 호출
- {{ 변수명 }}
- 값의 시작 부분이 변수로 시작하는 경우 반드시 “ “로 묶어줄 것
- 값이 목록으로 작성되는 경우와 혼동될 수 있음
변수의 우선순위
- 우선순위가 높은 위치와 낮은 위치에서 동일한 변수를 같이 지정할 경우, 높은 우선순위의 위치에서 선언된 변수로 지정됨
- 우선순위 (위쪽이 높은 우선순위)
- 명령줄에서 정의한 변수
- 플레이에서 지정한 변수
- 인벤토리에서 지정한 호스트변수
- 인벤토리에서 지정한 그룹 변수
사용예
- 플레이에 변수 선언
--- - 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 $ 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 |
사전(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 |