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
Author And Source
이 문제에 관하여(ENCORE CLOUD ARCHITECTURE TIL 4/7 Ansible Playbook), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tlsalsckd13/ENCORE-CLOUD-ARCHITECTURE-TIL-47-Ansible-Playbook저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)