0부터 시작하는 ANSIBLE 공부 - debug & handler

Jaehong Lee·2022년 9월 23일
post-thumbnail

1. debug

Playbook 처리 결과 담기

참고: 우아하게 앤서블 p. 334


debug 를 통해 출력

- name: test
   shell: ls /home

위의 작업 처리 결과는 Playbook 이 실행될 때, 출력되지 않는다. 따라서 해당 결과를 별도의 변수에 담고, 이를 debug 를 통해 출력시켜보자

---
- 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 를 설정하지 않으면 처리 결과를 출력할 수 없다

debug 는 결과를 출력하고 싶은 작업 밑에 작성해야 한다. 위에 작성하면 안된다

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 에 출력되지 않는다

하나의 task 에 대해 하나의 debug 가 1:1 관계를 형성한다. debug 는 하나의 task 에 대한 처리 결과만 담을 수 있다. 다수의 task 의 처리 결과를 담고 싶다면, 각각 debug 를 지정해줘야 한다


Quiz - debug

CentOS 만 별도로 골라서 httpd 를 실행하고 처리결과를 실시간으로 화면에 디버그로 띄워보자

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 시키는 것이다

message 로 출력

---
- 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"
    ]
}
  • 잘 출력된다

2. handler

참고: 우아하게 앤서블 p. 436


get_url & git clone 과 멱등성

질문. github 로 부터 초기에 파일을 클론하였다. 이후 update: yes 를 통해 변경된 부분에 대해서는 pull 을 하기로 yml 파일에 작성해 두었다. 이 경우 멱등성이 적용되지 않으므로 changed 된다

  • changed 가 될 때마다 지정된 작업이 시작되도록 하고 싶다. github 에서 pull 할 때마다 자동으로 httpd 를 재실행 시키고 싶다. 이 경우 트리거를 걸면 된다. 이러한 트리거를 ansible 에서는 handler 라고 한다

만약, get_url 이나 clone 같이 파일을 가져오는 모듈에 멱등성이 적용되있으면, 한 번 실행 후 파일에 대한 변경 사항이 생겨서 다시 실행했을 때, 해당 get_url 이나 clone 을 한 결과가 이미 보장되어 있으므로 다시 실행이 되지 않는 경우가 발생한다. 이러면 파일에 대한 변경 사항을 업데이트하지 못하므로 get_url 이나 clone 모듈에는 멱등성이 적용되지 않게 설정 되어있다

  • 멱등성이 적용되지 않았으므로 같은 명령을 다시 실행했을 때, Skip 이 되지 않는다
  • 해당 명령을 다시 실행했을 때, 가져온 파일의 내용이 바뀌었다면 changed 가 된다!!!

handler 란

handler 는 Task 에서 handler 호출했을 때 실행되는데, 아래의 조건을 만족해야 된다

  • 전 단계가 정상적으로 이루어지고, 변경 사항이 발생했을 때 동작한다
  • 이를 통해 changed 가 되었을 때, 웹 서비스를 재실행 할 수 있다

handler 사용하기

Question. 아래의 주소로 부터 get_url 을 하시오

  • 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 에 적혀있는 작업을 호출한다

즉, get_url 실행시 변경 사항이 있으면, 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 를 재실행하여 가져온 파일을 페이지에 반영한다

change & ok

TASK [get it] ******************************************************************
skipping: [ubuntu1]
ok: [centos2]
ok: [centos1]

파일을 가져왔을 때, 파일 내용이 변경되있지 않다면 -> ok


TASK [get it] ******************************************************************
skipping: [ubuntu1]
changed: [centos2]
changed: [centos1]

파일을 가져왔을 때, 파일 내용이 변경되있다면 -> changed

따라서, 파일의 내용이 변경되었을 때 changed 가 되므로 handler 가 호출된다

profile
멋진 엔지니어가 될 때까지

0개의 댓글