플레이북 실행 시 별다른 설정이 없다면 팩트 수집을 기본으로 함
팩트 수집 시 메모리 사용
그럼 단순히 작업만 할거라면 팩트 수집 필요 X
전체 팩트를 가져오지 않을 뿐 내가 원하는 일부분의 팩트만 가져오는것도 가능
팩트 수집 확인
[user@master ~]$ mkdir no-fact
[user@master ~]$ cd no-fact/
[user@master no-fact]$ vim inventory
>> inventory 파일 안에 작성
192.168.56.101
[user@master no-fact]$ vim ansible.cfg
>> ansible.cfg 파일 안에 작성
[defaults]
inventory = ./inventory
[user@master no-fact]$ vim playbook.yml
>> playbook.yml 파일 안에 작성
--- # 이게 있어야 yml 파일이라고 인식
- name: This play gathers facts automatically
hosts: 192.168.56.101
# 실행은 되지만 아무 일도 안하는것뿐
[user@master no-fact]$ ansible-playbook playbook.yml
PLAY [This play gethers facts automatically] *********************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [192.168.56.101]
PLAY RECAP *******************************************************************************************************************************
192.168.56.101 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
팩트 수집 끄기
[user@master no-fact]$ vim playbook2.yml
>> playbook2.yml 파일 안에 작성
---
- name: This play gathers facts automatically
hosts: 192.168.56.101
**gather_facts: no**
[user@master no-fact]$ ansible-playbook playbook2.yml
PLAY [This play gathers no facts automatically] ******************************************************************************************
PLAY RECAP *******************************************************************************************************************************
특정 팩트만 가져오기
[user@master no-fact]$ vim playbook3.yml
>> playbook3.yml 파일 안에 작성
---
- name: Gathers two facts
hosts: 192.168.56.101
tasks:
- name: Manually gather hostname facts # 해당 팩트를 수집하는 명령
setup:
filter: ansible_facts.ansible_hostname
- name: Display hostname facts # 해당 팩트를 출력하는 명령
debug:
var: ansible_facts.ansible_hostname
[user@master no-fact]$ ansible-playbook playbook3.yml
PLAY [Gathers two facts] *****************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [192.168.56.101]
TASK [Manually gather hostname facts] ****************************************************************************************************
ok: [192.168.56.101]
TASK [Display hostname facts] ************************************************************************************************************
ok: [192.168.56.101] => {
"ansible_facts.ansible_hostname": "VARIABLE IS NOT DEFINED!" # 내장 변수 없고 내가 볼라는거 수집해야한다?
}
PLAY RECAP *******************************************************************************************************************************
192.168.56.101 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- name: Postfix is running
hosts: 192.168.56.101
tasks:
- service:
name: postfix
state: started
- name: httpd is running
hosts: 192.168.56.101
tasks:
- service:
name: httpd
state: started
# 반복문으로 치환
- name: Postfix and Httpd is running
hosts: 192.168.56.101
tasks:
- service:
name: "{{item}}"
state: started
loop:
- postfix
- httpd
<aside> 🐓 반복문 실슴
[user@master ~]$ mkdir loop
[user@master ~]$ cd loop
[user@master loop]$ vim inventory
>> inventory 파일 안에 작성
192.168.56.101
[user@master loop]$ vim ansible.cfg
>> ansible.cfg 파일 안에 작성
[defaults]
inventory = ./inventory
[user@master loop]$ vim playbook.yml
>> playbook.yml 파일 안에 작성
---
- name: SSH and Httpd is running
hosts: 192.168.56.101
tasks:
- service:
name: "{{ item }}"
state: started
loop:
- sshd
- httpd
</aside>
사용자 이름과 사용자 그룹을 지정해서 생성
[user@master loop]$ vim playbook2.yml
>> playbook2.yml 파일 안에 작성
---
- name: Make user and group
hosts: 192.168.56.101
**become: true** # 권한 주기! 이거 안하면 permission denied 뜸
tasks:
- user:
name: "{{ item.name }}" # 아래 loop 에 있는 name을 여기에서는 인식 못함
state: present
group: "{{ item.group }}"
loop:
- name: test1
group: wheel
- name: test2
group: root
[user@master loop]$ ansible-playbook playbook2.yml
PLAY [Make user and group] ***************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [192.168.56.101]
TASK [user] ******************************************************************************************************************************
changed: [192.168.56.101] => (item={u'group': u'wheel', u'name': u'test1'})
changed: [192.168.56.101] => (item={u'group': u'root', u'name': u'test2'})
PLAY RECAP *******************************************************************************************************************************
192.168.56.101 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
변수에 여러가지를 지정하여 반복문 수행하기
[user@master loop]$ vim playbook3.yml
>> playbook3.yml 파일 안에 작성
---
- name: loop test
hosts: 192.168.56.101
vars:
web_db:
- httpd
- mariadb
tasks:
- name: httpd and mariadb are running
become: true
service:
name: "{{ item }}" # 2. 여기서 아래 loop에서 끌어온 web_db를 item으로 사용?
state: started
loop: "{{ web_db }}" # 1. 여기서 위에 있는 web_db를 끌어오고
[user@master loop]$ ansible-playbook playbook3.yml
PLAY [loop test] *************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [192.168.56.101]
TASK [httpd and mariadb are running] *****************************************************************************************************
ok: [192.168.56.101] => (item=httpd)
ok: [192.168.56.101] => (item=mariadb)
PLAY RECAP *******************************************************************************************************************************
192.168.56.101 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
반복문 구동 확인
[user@master loop]$ vim playbook4.yml
>> playbook4.yml 파일 안에 작성
---
- name: loop register test
gather_facts: no
hosts: 192.168.56.101
tasks:
- name: loop echo test
shell: "echo This is my item: {{ item }}"
loop:
- one
- two
register: echo_result # 이 작업에 대한 결과를 이 변수에다가 저장할게요! 라는 뜻
- name: show echo_result variable
debug:
var: echo_result
[user@master loop]$ ansible-playbook playbook4.yml
PLAY [loop register test] ****************************************************************************************************************
TASK [loop echo test] ********************************************************************************************************************
changed: [192.168.56.101] => (item=one)
changed: [192.168.56.101] => (item=two)
TASK [show echo_result variable] *********************************************************************************************************
ok: [192.168.56.101] => {
"echo_result": {
"changed": true,
"msg": "All items completed",
"results": [
{
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"ansible_loop_var": "item", # item one
"changed": true,
"cmd": "echo This is my item: one",
"delta": "0:00:00.001872",
"end": "2023-12-14 11:31:41.817475",
"failed": false,
"invocation": {
"module_args": {
"_raw_params": "echo This is my item: one",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": true
}
},
"item": "one",
"rc": 0,
"start": "2023-12-14 11:31:41.815603",
"stderr": "",
"stderr_lines": [],
"stdout": "This is my item: one",
"stdout_lines": [
"This is my item: one"
]
},
{
"ansible_loop_var": "item", # item two
"changed": true,
"cmd": "echo This is my item: two",
"delta": "0:00:00.002428",
"end": "2023-12-14 11:31:41.965197",
"failed": false,
"invocation": {
"module_args": {
"_raw_params": "echo This is my item: two",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": true
}
},
"item": "two",
"rc": 0,
"start": "2023-12-14 11:31:41.962769",
"stderr": "",
"stderr_lines": [],
"stdout": "This is my item: two",
"stdout_lines": [
"This is my item: two"
]
}
]
}
}
PLAY RECAP *******************************************************************************************************************************
192.168.56.101 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
특정 상황에서 동작하는 코드들을 생성할 때 사용(여러 경우의 수를 이용)
조건이 참이면 httpd 서비스를 중지하는 플레이북 작성
[user@master ~]$ mkdir when
[user@master ~]$ cd when
[user@master when]$ vim inventory
>> inventory 파일 안에 작성
192.168.56.101
[user@master when]$ vim ansible.cfg
>> ansible.cfg 파일 안에 작성
[defaults]
inventory = ./inventory
[user@master when]$ vim playbook.yml
>> playbook.yml 파일 안에 작성
---
- name: when true test
hosts: 192.168.56.101
become: true
vars:
run_my_task: false
tasks:
- name: stop httpd serveice
service:
name: httpd
state: stoppeed
when: run_my_task # 변수 부르기
[user@master when]$ vim playbook2.yml
---
- name: variable is defined
hosts: 192.168.56.101
become: yes
vars:
my_service: httpd
tasks:
- name: start service
service:
name: "{{ my_service }}"
state: started
when: my_service is defined # is defined가 이미 있는 조건문임! == 나 > 랑 동일
조건문 예