✔️ 변수
- 파이썬으로 쓰여있어서 파이썬 지시어는 사용할 수 없다.
- hosts, tasks 등등 playbook 지정어는 사용할 수 없다.
- 리스트 중첩 표기법은 변수가 될 수 없다.
✔️ 변수의 정의 및 참조
plyabook에서의 참조는 {{ 참조할 변수 }}
template:
src: foo.cfg.j2
dest: '{{ remote_install_path }}/foo.cfg'
abc: hello
---
template:
src: foo.cfg.j2
dest: '{{ remote_install_path }}/foo.cfg'
name: '{{ abc }}'
dest: '{{ abc }}/abc.com'
dest: '{{ abc }}1'/abc.com # 문법 오류 !!!!!!!!!!!!!
따옴표 안에 변수 외의 다른 값이 들어가면 안된다.
✔️ 변수 선언 방법
변수는 다음과 같이 선언한다.
- hosts: app_servers
vars:
app_path: "{{ base_path }}/22"
변수를 값으로 리스트를 가질 수도 있다.
region:
- northeast
- southeast
- midwest
리스트는 인덱스를 가지므로 해당 값은 northeast가 출력될 것이다.
region: "{{ region[0] }}"
변수의 값으로 딕셔너리를 가질 수도 있다.
foo:
field1: one
field2: two
변수가 계층 형식으로 구성되어 있을 경우 참조하는 방식을 2가지 중 하나를 선택한다.
foo['field1'] # field는 one으로 대체
foo.field1 # 이 방법은 가능할 때가 있고 가능하지 않을 때가 있다.
foo.field1은 이 자체가 변수가 될 수 없으며 (리스트 중첩 표기법이므로) foo 하위의 필드에 있는 field 변수라는 뜻이다.
이런 방식은 모듈에 따라 가능할 수도 아닐 수도 있기 때문에 항상 위의 방식을 사용하는 것이 바람직하다.
✔️ debug 모듈
오류가 났을 때는 debug 모듈을 잘 사용하면 효율적으로 개발할 수 있다.
msg와 var는 mutual exclusion 관계이므로 같이 사용할 수 없다.
- hosts: 192.168.100.11
vars:
msg: hello world
tasks:
- debug:
var: msg # 1번
- debug:
- msg: '{{ msg }}' # 2번
1번과 2번 방식은 실행해보면 결과가 동일하다.
var라고 하는 parameter는 msg 변수의 이름을 받는다. (msg의 default 값은 'hello world'이다.)
일반적으로 참조할 때는 2번 방식을 사용한다.
- hosts: 192.168.100.11
vars:
msg: hello world
web:
message: hello web
fruits:
- apple
- banana
tasks:
- debug:
msg: '{{ msg }} korea' # 1번
- debug:
msg: '{{ web["message"] }}' # 2번
msg: "{{ web['message'] }}" # 가능한 방식
msg: '{{ web['message'] }}' # 문법 오류 !!!!!!!!!!!
- debug:
msg: '{{ fruits[0] }}'
- debug:
msg: '{{ fruits[0] }} {{ fruits[1] }}' # apple banana 로 출력됨
✔️ 등록 변수
play 레벨에는 register 가 없고 tasks 레벨에서는 register가 있다.
- hosts: 192.168.100.11
tasks:
- yum:
name: httpd
state: installed
register: yum_result
- debug:
var: yum_result
- debug:
var: yum_result["rc"] # 리턴 코드만 나온다.
여기서 주의해야 할 점은 register는 yum의 파라미터가 아니라는 것이다.
yum 상단에 register를 사용할 수 있으나 관습적으로 모듈 정리 후 부가적으로 필요한 여러 작업 keyword를 써 나가는게 일반적이다.
yum 모듈의 return value를 모두 register 변수에 저장한다.
[vagrant@controller registered]$ ansible-playbook test.yaml
PLAY [192.168.100.11] **************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [192.168.100.11]
TASK [yum] *************************************************************************************************************
ok: [192.168.100.11]
TASK [debug] ***********************************************************************************************************
ok: [192.168.100.11] => {
"yum_result": {
"changed": false,
"failed": false,
"msg": "",
"rc": 0,
"results": [
"httpd-2.4.6-97.el7.centos.5.x86_64 providing httpd is already installed"
]
}
}
PLAY RECAP *************************************************************************************************************
192.168.100.11 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
TASK [debug] ***********************************************************************************************************
ok: [192.168.100.11] => {
"yum_result[\"rc\"]": "0"
}
✔️ 변수 정의 위치
- 플레이북
- 인벤토리
- 외부 참조 파일
- 역할
- 명령 -e 옵션
✔️ 플레이북에서 변수 정의
vars
- hosts: a
vars:
message: hello
vars propmt
- hosts: a
vars prompt:
default는 private : yes
private : no → 입력된 값을 화면상에 출력함
---
- hosts: all
vars_prompt:
- name: username
prompt: What is your username?
private: no
- name: password
prompt: What is your password?
tasks:
- name: Print a message
debug:
msg: 'Logging in as {{ username }}, password is {{ password }}'
vars_files
변수를 별도의 파일에 지정하기
- hosts: a
vars_file:
-vars.yaml
tasks:
- debug:
var: msg
vars.yaml
msg: hello world
예를 들어 우리가 wordpress.yaml 의 변수 내용을 wordpress_vars.yaml 파일로 빼고
wordpress.yaml 에는 wordpress_vars.yaml 파일을 참조해서 사용하는 것과 같다.
✔️ 인벤토리에서의 변수 정의
변수가 미치는 범위
특정 호스트 또는 그룹에게 영향을 준다.
inventory.ini
192.168.100.11 msg=hello
- hosts: 192.168.100.11
tasks:
-debug:
var: msg
192.168.100.11 호스트에게 영향을 준다.
inventory.ini
수정
[node]
192.168.100.11 msg=hello # msg와 message는 192.168.100.11 을 따라간다.
[nodes:vars]
message="hello world"
- hosts: 192.168.100.11
tasks:
-debug:
var: msg
-debug:
var: message
✔️ 인벤토리에서 변수의 범위
[nodes]
192.168.100.11 msg=seoul
192.168.100.12 msg=busan
[nodes:vars]
message="hello world"
-hosts: nodes
tasks:
-debug:
var: msg
-debug:
var: message
✔️ 명령에서의 변수 정의
e 옵션 또는 EXTRA_VARS 옵션을 사용한다.
ansible-playbook test.yaml -e msg=korea
yaml 파일에 작성된 내용은 무시하고 직접 지정한 korea가 뜬다.
✔️ 변수의 우선 순위
변수 선언의 위치와 우선 순위가 있다.
아래쪽에 있는 것이 우선순위가 더 높은 것이다.
낮음
- 인벤토리 변수
- 플레이 vars
- 플레이 vars_prompt
- 플레이 vars_files
- 명령 -e, --extra-vars
높음
✔️ 변수의 범위
- 글로벌 : 명령어 -e
- 플레이 : vars, vars_files, vars_prompt
- 호스트 : 인벤토리 변수
✔️ 필터의 사용
변수에서 필요한 내용만을 취득하여 값을 가공하거나 형식을 변경(transform)한다.
✔️ 필터 사용법
{{ msg | filter }}
{{ some_variable | default(5) }}
값이 없으면 5라는 것을 넣으라는 뜻이다.
dictionary → list
{{ dict | dict2items }}
list → dictionary
{{ tags | items2dict }}
yaml ↔ json
{{ some_variable | to_json }}
{{ some_variable | to_yaml }}
MAC 주소를 설정해야 할 때 예시
"{{ '52:54:00' | community.general.random_mac }}"
# => '52:54:00:ef:1c:03'
6옥텟의 주소중에 앞 3개 고정 뒤 3개 랜덤 생성 하고싶을 때
랜덤하게 하나만 뽑고 싶을 때
"{{ ['a','b','c'] | random }}"
# => 'c'
크론탭 사용시 랜덤하게 시간을 지정하고 싶을 때
"{{ 60 | random }} * * * * root /script/from/cron"
# => '21 * * * * root /script/from/cron'
서브넷 마스크를 제외하고 주소만 추출할 때
{{ '192.0.2.1/24' | ansible.netcommon.ipaddr('address') }}
# => 192.168.0.1
암호화된 비밀번호를 생성할 때
-hosts: 192.168.100.11
vars:
pwd: P@ssw0rd
task:
-user:
name: devops
password: {{ pwd | password_hash('sha512', 65534 | random(seed=inventory_hostname) | string) }}
state: present
✔️ 팩트 변수
setup
모듈에 의해 수집(하드웨어, OS, 네트워크 등)되는 호스트의 변수이다.
플레이북 실행 항상 첫 작업 Gathering Facts
작업에 의해 수집된다.
- hosts: 192.168.100.11
tasks:
- debug:
msg: "{{ ansible_hostname }}"
- debug:
msg: "{{ ansible_all_ipv4_addresses }}" # node1의 ipv4 주소를 모두 확인함
msg: "{{ ansible_all_ipv4_addresses[1] }}" # 리스트 형태이므로 첫번째 주소를 반환
변수를 사용하기 위해서는 변수를 정의해야만 가능했는데 변수를 저장하지 않고도 변수 값을 출력할 수 있다.
ansible 192.168.100.11 -m setup
시스템 아키텍처 정보, cpu, memory ... 등등
해당되는 시스템의 운영체제, 하드웨어, 네트워크, 디스크 정보를 수집하게 된다.
192.168.100.11 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"10.0.2.15",
"192.168.100.11"
],
"ansible_all_ipv6_addresses": [
"fe80::5054:ff:fe4d:77d3",
"fe80::a00:27ff:fefa:9180"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "12/01/2006",
"ansible_bios_version": "VirtualBox",
"ansible_cmdline": {
"BOOT_IMAGE": "/boot/vmlinuz-3.10.0-1127.el7.x86_64",
"LANG": "en_US.UTF-8",
"biosdevname": "0",
"console": "ttyS0,115200n8",
"crashkernel": "auto",
"elevator": "noop",
"net.ifnames": "0",
"no_timer_check": true,
"ro": true,
"root": "UUID=1c419d6c-5064-4a2b-953c-05b2c67edb15"
},
중간 생략 ..................................
"module_setup": true
},
"changed": false
}
만약 매번 팩트 변수를 수집하는 것이 불필요해서 팩트 변수를 수집하고 싶지 않다면,
gather_facts: no 라고 선언하면 된다.
- hosts: 192.168.100.11
gather_facts: no
tasks:
- debug:
msg: "{{ ansible_hostname }}"
- debug:
msg: "{{ ansible_all_ipv4_addresses }}" # node1의 ipv4 주소를 모두 확인함
msg: "{{ ansible_all_ipv4_addresses[1] }}" # 리스트 형태
- debug:
msg: "{{ ansible_distribution }}"
보통 팩트 변수를 사용하는 시나리오는 다음과 같다.
사내 인프라 작업이 다양한 OS위에서 실행되어야 할 때 팩트 변수를 수집한 뒤 조건에 따라 실행한다.
- 호스트가 4개 이상이면 호스트 설치 X, 호스트가 4개 이하면 설치
- 메모리가 16g 이상이면 db 설치 아니면 설치 X
- sda가 있는 시스템이며 sdb에 파일 시스템이 없는 시스템이라면 sdb에 파일시스템 설치
✔️ 특수 변수
자주 쓰이는 특수 변수
- ansible_play_hosts
hosts보다 더 높은 우선순위를 가진다. - groups
host가 속한 그룹 인벤토리에 속한 group을 취득 - inventory_hostname
inventory에 속한 호스트 - hostvars
✔️ 템플릿(Template)
test.yaml
- hosts: 192.168.100.11
vars:
message: korea
tasks:
- copy:
src: origin.txt
dest: /tmp/copy.txt
- template:
src: origin.txt
dest: /tmp/template.txt
copy.text
hello {{ message }} world
copy.txt는 내용을 그대로 복사하고
template.txt는 message가 변수로 치환되어 korea가 된다.
템플릿은 텍스트 파일을 동적으로 만드는데 사용된다.
ex) Django의 Jinja 를 생각하면 된다.
<title>{% block title %}{% endblock %}</title>
<ul>
{% for user in users %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
'DevOps > Ansible' 카테고리의 다른 글
[Ansible] 조건문(Conditionals) (0) | 2022.04.19 |
---|---|
[Ansible] 반복문(Loops) (0) | 2022.04.19 |
[Ansible] Playbook 실행 (0) | 2022.04.16 |
[Ansible] Ad-hoc 명령어로만 Wordpress 배포하기 (0) | 2022.04.15 |
[Ansible] module, ad-hoc, playbook, yaml 포맷 (0) | 2022.04.15 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!