
참고: 우아하게 앤서블 p. 334
- name: test
shell: ls /home
---
- name: httpd installation
hosts: koreaeast
gather_facts: true
become: true
tasks:
- name: httpd install
yum:
name: httpd
state: present
when: ansible_distribution == 'CentOS'
register: resulth
- debug:
var: resulth
- name: nginx install
apt:
pkg: nginx
state: present
update_cache: yes
when: ansible_pkg_mgr == 'apt'
- Playbook 을 실행할 때, 작업을 처리한 결과를 resulth 라는 변수에 담아 debug 를 통해 출력해준다. 이때, register 에 작업 처리 결과를 담을 변수를 지정해야지 debug 를 통해 출력할 수 있다. register 를 설정하지 않으면 처리 결과를 출력할 수 없다
TASK [debug]
*******************************************************************
TASK [debug] *******************************************************************
ok: [centos1] => {
"resulth": {
"changed": true,
"changes": {
"installed": [
"httpd"
]
},
"failed": false,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins:
~~~
ok: [ubuntu1] => {
"resulth": {
"changed": false,
"skip_reason": "Conditional result was False",
"skipped": true
}
}
- 위와 같이 httpd install 작업 처리 결과에 대해서 ubuntu 에서는 skipped 되었다고 처리 결과가 debug 로 출력된다. skip 되었다는 결과는 register 를 지정하지 않아도 무조건 debug 에 나온다
- 만약, skip 이 되지 않았을 때, register 로 처리 결과를 담을 변수를 지정하지 않으면 debug 에 출력되지 않는다
tasks:
- name: httpd install
service:
name: httpd
state: started
when: ansible_distribution == 'CentOS'
register: resulth
- debug:
var: resulth
when: ansible_distribution == 'CentOS'
- 위와 같이 debug 에도 조건을 둘 수 있다. 배포판이 CentOS 인 Node 에 대해서만 debug 를 출력하게 하였다
skipping: [ubuntu1] # debug 에서 skip, 즉, 처리 결과를 출력하지 않는다
- 작업에 대한 조건에 해당되지 않은 Node 에서 명령이 skip 된 것은 debug 에 무조건 출력되지만, debug 에 조건을 걸어서 debug 조건에 해당되지 않는 Node 는 명령이 skip 되었다는 처리 결과도 출력되지 않게 skip 할 수 있다. 즉, 처리 결과를 출력하는 것도 skip 시키는 것이다
---
- name: VM interface check
gather_facts: true
hosts: all
tasks:
- name: PRINT IP ADDRESS
debug:
msg:
- "NodeName : {{ ansible_nodename }}"
- "eth0 : {{ ansible_eth0.ipv4.address }}"
- "eth1 : {{ ansible_eth1.ipv4.address }}"
- "eth2 : {{ ansible_eth2.ipv4.address }}"
- 위와 같이 debug - msg 를 통해 message 로 처리 결과를 출력하게 할 수 있다. 모든 Node 가 자신의 facts 에서 Ip 정보를 출력하게 하였다
TASK [PRINT IP ADDRESS] ********************************************************
ok: [ubuntu1] => {
"msg": [
"NodeName : ubuntu1",
"eth0 : 192.168.121.107",
"eth1 : 211.183.3.159",
"eth2 : 10.10.10.16"
]
}
ok: [ubuntu2] => {
"msg": [
"NodeName : ubuntu1",
"eth0 : 192.168.121.196",
"eth1 : 10.10.10.17",
"eth2 : 211.183.3.158"
]
}
- 잘 출력된다
참고: 우아하게 앤서블 p. 436
- changed 가 될 때마다 지정된 작업이 시작되도록 하고 싶다. github 에서 pull 할 때마다 자동으로 httpd 를 재실행 시키고 싶다. 이 경우 트리거를 걸면 된다. 이러한 트리거를 ansible 에서는 handler 라고 한다
- 멱등성이 적용되지 않았으므로 같은 명령을 다시 실행했을 때, Skip 이 되지 않는다
- 해당 명령을 다시 실행했을 때, 가져온 파일의 내용이 바뀌었다면 changed 가 된다!!!
- 전 단계가 정상적으로 이루어지고, 변경 사항이 발생했을 때 동작한다
- 이를 통해 changed 가 되었을 때, 웹 서비스를 재실행 할 수 있다
- http://192.168.1.97/test.html
- 해당 내용은 CentOS 의 기본 페이지(/var/www/html/index.html) 로 보내라
- 페이지가 보이면 ansible-playbook 을 다시한번 실행했을 때 변경된 페이지를 다시 덮어 씌고 httpd 가 재 실행되어야 한다. 이때, httpd 의 재실행 결과를 debug 를 통해 화면에서 볼 수 있어야 한다
---
- name: httpd installation
hosts: koreaeast
gather_facts: true
become: true
tasks:
- name: httpd install
yum:
name: httpd
state: present
when: ansible_distribution == 'CentOS'
- name: httpd start
service:
name: httpd
state: started
when: ansible_distribution == 'CentOS'
- name: nginx installation
apt:
pkg: nginx
state: present
update_cache: yes
when: ansible_pkg_mgr == 'apt'
- name: get it
get_url:
url: http://192.168.1.97/test.html
dest: /var/www/html/index.html
mode: 644
when: ansible_distribution == 'CentOS'
notify:
- trigger1
register: resulth
- debug:
var: resulth
handlers:
- name: trigger1
service:
name: httpd
state: restarted
register: triggerre
notify:
- result
- name: result
debug:
var: triggerre
- 위와 같이 작성하면 된다. handlers 에 trigger1 을 정의하고, 이를 get_url 모듈을 이용한 작업에서 호출하게 설정하였다. 즉, get_url 을 할 때, changed 가 발생하는 경우에만 handler 가 호출되어 실행된다
- handler 가 실행됬을 때만, handler 처리 결과를 출력하는 debug 를 실행하게 한다
- notify 는 해당 작업이 끝났을 때 changed 가 됬다면 notify 에 적혀있는 작업을 호출한다
[vagrant@ansible-server ~]$ ansible all -m shell -a "sudo ip a | grep 211.183."
[WARNING]: Consider using 'become', 'become_method', and 'become_user' rather
than running sudo
centos1 | CHANGED | rc=0 >>
inet 211.183.3.154/24 brd 211.183.3.255 scope global noprefixroute dynamic eth2
centos2 | CHANGED | rc=0 >>
inet 211.183.3.153/24 brd 211.183.3.255 scope global noprefixroute dynamic eth2
centos3 | CHANGED | rc=0 >>
inet 211.183.3.155/24 brd 211.183.3.255 scope global noprefixroute dynamic eth2
ubuntu1 | CHANGED | rc=0 >>
inet 211.183.3.159/24 brd 211.183.3.255 scope global dynamic eth1
ubuntu2 | CHANGED | rc=0 >>
inet 211.183.3.158/24 brd 211.183.3.255 scope global dynamic eth2
- Public Network Ip 를 확인하자

- 처음 가져올 시

- 다시 Playbook 을 실행했을 때, 파일 내용이 변경되었다면, httpd 를 재실행하여 가져온 파일을 페이지에 반영한다
TASK [get it] ******************************************************************
skipping: [ubuntu1]
ok: [centos2]
ok: [centos1]
파일을 가져왔을 때, 파일 내용이 변경되있지 않다면 -> ok
TASK [get it] ******************************************************************
skipping: [ubuntu1]
changed: [centos2]
changed: [centos1]
파일을 가져왔을 때, 파일 내용이 변경되있다면 -> changed