Ansible Playbook扩展

handlers

Handlers是一组task(与普通的task没有任何区别),用于被notify调用。Handlers只会在Play的末尾执行一次,即使被多个不同的task notify,且只有指定notify的task执行结果为changed才会触发。

1
2
3
4
5
6
7
8
9
tasks:
- name: Disable DNS resolv for ssh
lineinfile: path=/etc/ssh/sshd_config regexp=".*UseDNS" line="UseDNS no"
notify:
- restart ssh server

handlers:
- name: restart ssh server
service: name=sshd state=restarted

changed_when、failed_when

使用shell和command模块时,如果不使用changed_when,Ansible将永远返回changed。通过changed_when语句可对返回的信息进行重写,根据任务返回结果判断运行结果是否真正符合预期。同理failed_when也可达到相同的效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  tasks:
- name: Nothing to do for shell
shell: echo "Nothing to do"
register: result
changed_when: "'Something to do' in result.stdout"
- name: Something to do for shell
shell: echo "Something to do"
register: result
changed_when: "'Something to do' in result.stdout"

TASK [Nothing to do for shell] ***********************************************
ok: [localhost]

TASK [Something to do for shell] *********************************************
changed: [localhost]

ignore_errors

默认情况下,Ansible执行task时遇到任务执行失败则会中断后续的playbook运行,通过ignore_errors可忽略该task中的报错。

1
2
3
4
5
6
tasks:
- name: determine the device was formated filesystem if is exist
shell: blkid -s TYPE /dev/sdb1
register: filesystem
when: ansible_devices.sdb is defined
ignore_errors: True

delegate_to、local_action

delegate_to用于在特定的task中指定需要运行该task的主机,local_action用于指定task在localhost上执行。

1
2
3
4
5
6
7
8
9
10
11
12
tasks:
- name: Get hostname
shell: hostname
register: hostname
delegate_to: 10.1.10.71
- name: Display IP
debug: msg="{{ hostname.stdout }}"
- name: Get hostname
local_action: command hostname
register: hostname
- name: Display IP
debug: msg="{{ hostname.stdout }}"

vars_prompt

vars_prompt主要用于通过交互式对变量进行赋值。

  • private:隐藏输入值(默认为yes)
  • default:默认值
  • confirm:要求对变量输入2次,增加输入的正确性
1
2
3
4
5
6
7
8
9
10
11
- hosts: localhost
vars_prompt:
- name: key
prompt: "value of key"
private: yes
default: test
confirm: yes

tasks:
- name: test
debug: msg="{{ key }}"

tags标签

默认情况下,Ansible会执行playbook中定义的所有任务。tags可为roles、单个task、或整个playbook打上标签,然后通过--tags=TAGS指定要运行其中的个别任务或--skip-tags=SKIP_TAGS跳过指定的任务。

1
2
3
4
5
6
7
8
- hosts: localhost
tags: deploy
roles:
- { role: tomcat, tags: ['tomcat','app'] }
tasks:
- name: "Tags Test"
debug: msg="Tags Test!"
tags: test

Block块

Block可对任务进行分组,且可在块级别上应用任务变量。
Block块中可插入rescuealways,当block中定义的task执行失败将会触发rescue部分中的task,可用于回滚操作。always部分则无论block中的task是否执行成功都会触发。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- hosts: localhost
tasks:
- name: Attempt and gracefull roll back demo
block:
- debug: msg='[Block]:正常执行'
- debug: msg='[Block]:执行失败,中断Block中后续的task执行'
failed_when: true
- debug: msg='[Block]:由于上一个task失败,中断执行'
rescue:
- debug: msg='[Rescue]:block中的task失败将触发rescue中的task'
- debug: msg='[Rescue]:执行失败,中断Rescue中后续的task执行'
failed_when: true
- debug: msg='[Rescue]:由于上一个task失败,中断执行'
always:
- debug: msg="[Always]:无论block中的task是否失败都会执行"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
TASK [debug] ************************************************************
ok: [localhost] => {
"msg": "[Block]:正常执行"
}

TASK [debug] ************************************************************
fatal: [localhost]: FAILED! => {
"changed": false,
"failed_when_result": true,
"msg": "[Block]:执行失败,中断Block中后续的task执行"
}

TASK [debug] ************************************************************
ok: [localhost] => {
"msg": "[Rescue]:block中的task失败将触发rescue中的task"
}

TASK [debug] ************************************************************
fatal: [localhost]: FAILED! => {
"changed": false,
"failed_when_result": true,
"msg": "[Rescue]:执行失败,中断Rescue中后续的task执行"
}

TASK [debug] ************************************************************
ok: [localhost] => {
"msg": "[Always]:无论block中的task是否失败都会执行"
}
坚持原创技术分享,您的支持将鼓励我继续创作!
0%