becool

20210803 (화) ansible 작업제어 #2 본문

ansible

20210803 (화) ansible 작업제어 #2

gusalstm 2021. 8. 3. 15:17
반응형

9:33 review

작업제어

 

ignore_errors : true 태스크가 실패해도 다음 태스크를 수행함 (전역, 특정 task  지정 가능)

ignore_unreachable : true 특정 호스트가 응답이 없어도 태스크를 수행함.

force_handlers: true 진행 중 에러 발생시에도 handler를 실행하도록 설정

 

failed_when CONDITION : task 실패 조건 지정

changed_when CONDITION : changed 조건 지정

 

 

[user@ansible-server work]$ cat 0803_task_control.yaml
---
- name: task control 1   
  hosts: all
#ignore_errors: true

  tasks:
  - name: change hostname
    command: "hostnamectl set-hostname ansible-node"
    ignore_errors: true

→ 권한이 없어서 에러가 나더라도 다음 작업을 수행한다. 해당 설정은 전역적인 설정이 아니므로 세번째 /etc 위치에 디렉터리 생성 권한이 없는경우 4번째 fake.txt 파일 생성 작업은 수행되지 않는다. (전역적인 설정은 주석위치의 설정을 활성화하면 된다.)

  - name: create a file
    copy:
      content: "test file"
      dest: /tmp/testfile.txt
  - name: create a directory
    file:
      path: /etc/20210803_dir
      state: directory
  - name: create a file
    copy:
      content: "fake file"
      dest: /tmp/fake.txt


[user@ansible-server work]$ cat 0803_task_control2.yaml
---
- name: task control2  → 특정 호스트가 unreachable 상태여도 작업 수행. (skipped)
  hosts: all
  ignore_unreachable: true

  tasks:
  - name: check OS version
    command: cat /etc/centos-release
    register: result_os_ver
  - name: print OS version
    debug:
      msg: "{{ result_os_ver.stdout }}"
  - name: mark os version
    copy:
      content: "{{ result_os_ver.stdout }}"
      dest: /tmp/os_ver.txt

[user@ansible-server work]$ cat 0803_task_control3.yaml
---
- name: task control3   → vsf라는 잘못된 패키지이름으로 인해 에러가 발생해도 force_handlers를 통해 handler 수행을 강제함. (이 경우 아래의 ignore_errors로 대신할 수도 있음) 
  hosts: all
  become: true
  force_handlers: true

  tasks:
  - name: Install package
    yum:
      name: tree
      state: latest
    notify:
    - do next task
  - name: mark play status
    shell: "echo 'play ended' > /tmp/play_status.txt"
  - name: cause errors
    yum:
      name: vsf
      state: latest
 #   ignore_errors: true
  handlers:
  - name: do next task
    debug:
      msg: "Install package success!"

[user@ansible-server work]$

[user@ansible-server work]$ cat 0803_task_control5.yaml
---
- name: task control 5 → fail처리되는 조건을 변경하여 결과값을 true(성공)으로 반환
  hosts: all

  tasks:
  - name: task failed
    command: "/bin/false" → result.rc를 1을 반환하는 명령어로 결과값을 fail로 처리함.(커맨드는 성공했으나 fail로 반환)
    register: result
    failed_when: result.changed == false → result.changed가 false이면 fail 처리 result.changed가 true면 결과도 true
  - name: print task result
    debug:
      msg: "{{ result }}"



[user@ansible-server work]$ cat 0803_task_control6.yaml
---
- name: task control 6 
  hosts: all
→ command, shell 모듈 등은 실패해도 change를 true로 반환할 수 있음. rc(return code)가 0이 아니면 실제로 task가 성공했다고 볼 수 없으므로 아래와 같이 작성시, 중복 실행시 changed = false 출력하게 됨. (이미 디렉터리가 만들어져 있는경우)

  tasks:
  - name: make a directory
    command: mkdir /tmp/20210803
    register: result_dir
    changed_when: result_dir.rc == 0
    ignore_errors: true
  - name: print result
    debug:
      msg: "{{ result_dir }}"


 

플레이북 재사용을 위한 모듈

include 모듈

 플레이, 작업, 역할, 변수 등을 포함할 수 있으며 동적으로 플레이북을 추가할 수 있음

 이전 작업 내용의 영향을 받을 수 있음

 모듈 실행 시 처리

 

import 모듈

 플레이북, 역할, 작업을 가져올 수 있으며 정적으로 플레이북을 추가할 수 있음

 이전 작업 내용의 영향을 받지 않음

 플레이북 파싱시 전처리가 발생

 

#### include #1 ####
[user@ansible-server 20210803]$ cat reuse.yaml → include_tasks 모듈을 이용하여 순서대로 실행
---
- name: reuse include 1
  hosts: all

  tasks:
  - name: print task1
    debug:
      msg: task1

  - name: include task list in play
    include_tasks: tasks_include.yaml

  - name: print task10
    debug:
      msg: task10
[user@ansible-server 20210803]$ cat tasks_include.yaml
- name: print task2
  debug:
    msg: task2
- name: print task3
  debug:
    msg: task3

[user@ansible-server 20210803]$ ansible-playbook reuse.yaml

PLAY [reuse include 1] *************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [192.168.56.11]

TASK [print task1] *****************************************************************************************************
ok: [192.168.56.11] => {
    "msg": "task1"
}

TASK [include task list in play] ***************************************************************************************
included: /home/user/work/20210803/tasks_include.yaml for 192.168.56.11

TASK [print task2] *****************************************************************************************************
ok: [192.168.56.11] => {
    "msg": "task2"
}

TASK [print task3] *****************************************************************************************************
ok: [192.168.56.11] => {
    "msg": "task3"
}

TASK [print task10] ****************************************************************************************************
ok: [192.168.56.11] => {
    "msg": "task10"
}

PLAY RECAP *************************************************************************************************************
192.168.56.11              : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

반응형
#### include #2 ####
[user@ansible-server 20210803]$ cat reuse_include2.yaml → 설치/서비스 시작 플레이북을 각각 만들어두고 불러와서 실행
---
- name: Setup Hosts
  hosts: all
  become: true

  tasks:
  # install packages
  - name: include install
    include_tasks: tasks/include_packages.yaml

  # start service
  - name: include start
    include_tasks: tasks/include_service.yaml
  - name: playbook end
    debug:
      msg: playbook ended

[user@ansible-server 20210803]$ cat tasks/include_packages.yaml
- name: package1
  yum:
    name: httpd
    state: latest

- name: package1
  yum:
    name: vsftpd
    state: latest

[user@ansible-server 20210803]$ cat tasks/include_service.yaml
- name: start httpd service
  service:
    name: httpd
    state: started
    enabled: true
- name: start vsftp service
  service:
    name: vsftpd
    state: started
    enabled: true

 

 

 

 

728x90
Comments