文章目录
1. 重用ansible工件(导入角色及任务)
重用剧本: 静态导入
- import_playbook: playbook.yml
重用文件和角色:
静态导入:Ansible在运行剧本中的任何任务之前会对其进行预处理,因此导入的内容永远不会受到顶级剧本中其他任务的影响
静态:
- import_tasks: 任务文件.yml
- import_role: 角色
动态导入:Ansible进程在剧本中包含文件和角色,因此所包含的任务可能会受到顶级剧本中较早任务的结果的影响。所包含的角色和任务与处理程序相似-它们可能会或可能不会运行,这取决于顶级剧本中其他任务的结果
动态:
- include_tasks: 任务文件.yml
- include_role: 角色
- include_vars: {
{
变量名 }}
2. loop循环(with_*)
- 定义:loop
- 引用:{ { item }}
2.1 遍历列表
#playbook
---
- hosts: test
gather_facts: no
vars_files:
- userlist.yml
tasks:
- name: create users
user:
name: "{
{ item.user }}"
password: "{
{ item.passwd | password_hash('sha512') }}"
loop: "{
{ userlist }}"
#userlist.yml
---
userlist:
- user: 'user1'
passwd: '123'
- user: 'user2'
passwd: '456'
- user: 'user3'
passwd: '789'
2.2 遍历哈希表
示例1:
---
- hosts: test
tasks:
- name: create users
user:
name: "{
{ item.user }}"
password: "{
{ item.passwd | password_hash('sha512') }}"
loop:
- {
user: 'user1', passwd: '123' }
- {
user: 'user2', passwd: '124' }
- {
user: 'user3', passwd: '125' }
2.3 遍历字典
要遍历字典,使用
dict2items
- name: Using dict2items
ansible.builtin.debug:
msg: "{
{ item.key }} - {
{ item.value }}"
loop: "{
{ tag_data | dict2items }}"
vars:
tag_data:
Environment: dev
Application: payment
#遍历tag_data并从中打印键和值
2.4 用循环注册变量
- name: Register loop output as a variable
ansible.builtin.shell: "echo {
{ item }}"
loop:
- "one"
- "two"
register: echo
对注册变量进行的循环检查结果:
loop: "{
{ echo.results }}"
结果将放置在变量中 echo.stdout
2.5 循环输出函数 query与lookup
loop: "{
{ query('inventory_hostnames', 'all') }}"
loop: "{
{ lookup('inventory_hostnames', 'all', wantlist=True) }}"
3. 条件 when
3.1 基本条件when
【注:无双花括号】
示例:
---
- hosts: all
tasks:
- name: install apache
dnf:
name: httpd
state: present
when: ansible_hostname == "server2"
when: ansible_facts['XXX']['XXX']['XXX'] == XXX
3.2 在循环中使用条件
tasks:
- name: Run with items greater than 5
ansible.builtin.command: echo {
{
item }}
loop: [ 0, 2, 4, 6, 8, 10 ]
when: item > 5
若是字典:
when: item.value > 5
4. block块处理
任务分组
tasks:
- name: ...
block:
- name: ...
- name: ...
4.1 rescue 处理错误
仅在任务返回“失败”状态后运行rescue
示例:
---
- hosts: ...
tasks:
- name:
block:
- name: ...
dnf:
name: httpd
state: present
rescue:
- name: ...
4.2 always 处理错误
无论上一个块的任务状态如何,always 中的任务都会运行
示例:
---
- hosts: localhost
tasks:
- name: Handle the error
block:
- debug:
msg: 'I execute normally'
- name: i force a failure
command: /bin/false
rescue:
- debug:
msg: 'I caught an error, can do stuff here to fix it, :-)'
always:
- debug:
msg: "This always executes, :-)"
5. 剧本中的错误处理
当Ansible从命令接收到非零返回码或模块失败时,默认情况下它将停止在该主机上执行并在其他主机上继续执行。但是,在某些情况下,您可能想要不同的行为。有时,非零返回码表示成功。有时,您希望在一台主机上发生故障以停止所有主机上的执行
忽略失败的命令
- 默认情况下,当某个任务在主机上失败时,Ansible将停止在该主机上执行任务
ignore_errors: yes
:仅在任务能够运行且返回值“ failed”时起作用
忽略无法访问的主机错误
ignore_unreachable: yes
:Ansible会忽略任务错误,但对无法访问的主机不会继续执行将来的任务
重置无法访问的主机
- 问题:如果Ansible无法连接到主机,则将该主机标记为“ UNREACHABLE”,并将其从运行的活动主机列表中删除。
meta:clear_host_errors
:重新激活所有主机,后续任务可以尝试再次访问它们
定义"changed"
changed_when: XXX
:何时特定任务“更改”了远程节点
设置最大故障百分比:max_fail_percentage: 30
- 在某些情况下,例如执行滚动更新时,您可能希望在达到一定的失败阈值时中止play
示例:
---
- hosts: webservers
max_fail_percentage: 30
serial: 10
max_fail_percentage
当与serial
一起使用时,该设置适用于每个批次。在上面的示例中,如果第一批(或任何一批)服务器中的10台服务器中有3台以上发生故障,则其余的游戏将中止
用block处理错误:见本篇第4章
6. 标签 tags
使用标签执行或跳过所选任务的过程分为两个步骤:
- 可以单独或通过从块,角色,角色或导入的标签继承将标签添加到任务中。
- 运行剧本时选择或跳过标签
6.1 添加标签
- 将标签添加到单个任务:
- 多对一:一个或多个标签应用于单个任务
- 一对多:同一标签应用于多个任务
---
- hosts: test
tasks:
- name: ...
dnf:
name: ...
tags:
- packages
- webservers
- 向导入 import_ 中添加
---
- hosts: webservers
tasks:
- name: ...
import_role:
name: ...
tags:
- bar
- baz
- name: ...
import_tasks: ...yml
tags: [ web, foo ]
- 标签继承:将标签添加到多个任务
向block添加标签:
tasks:
- block: ...
tags: Apache
- name: ...
- name: ...
- name: ...
tags: 标签
向每一个play中添加:
- hosts: all
tags: 标签1
tasks: ...
- host: test
tags: 标签2
tasks: ...
向角色添加标签:
roles:
- role: ...
tags: [ web, foo ]
或
---
- hosts: ...
roles:
- role: ...
tags:
- 标签
- 标签
6.2 特殊标签 always与never
always:始终运行该任务或play(除非专门跳过 --skip-tags always)
never:跳过该任务或play(除非执行 --tags never)
---
- hosts: ...
tasks:
- name: ...
tags:
- always
- name: ...
tags:
- never
6.3 选择执行或跳过标签
|
|
---|---|
|
指定运行 |
|
跳过 |
|
|
---|---|
|
全部(默认) |
|
总是执行 |
|
永远不执行 |
|
带标签的 |
|
不带标签的 |
--tags all
:运行所有任务,忽略标签(默认行为)
--tags [tag1, tag2]
:仅运行带有标签tag1和tag2
--skip-tags [tag3, tag4]
:运行所有任务,除过带有标签tag3和tag4
--tags tagged
:仅运行至少带有一个标签的任务
--tags untagged
:只运行没有标签的任务
6.4 预览标签
--list-tags
:生成可用标签列表
--tags tagname --list-tags
:生成带标签的任务
--skip-tags tagname --list-tags
:生成不带标签的任务
7. 交互式输入输出 prompt
通过提示用户输入变量,可以避免记录诸如密码之类的敏感数据。除安全性外,提示还支持灵活性
关键字:vars_prompt
|
|
---|---|
|
定义输出的内容 |
|
private: no 用户输入内容可见 |
private: yes 隐藏用户输入(默认) | |
|
设置默认值,当不输入任何值时,使用该默认值 |
|
再次确认(适合密码使用) |
|
接受特殊字符 |
示例:
---
- hosts: localhost
vars_prompt:
- name: username
prompt: What is your username?
private: no
- name: password
prompt: What is your password?
tasks:
- name: 测试Apache,返回直
uri:
url: http://192.168.43.27
user: "{
{ username }}"
password: "{
{ password }}"
return_content: yes
status_code: 200
register: result
- debug:
var: result
加密示例:
vars_prompt:
- name: my_password2
prompt: Enter password2
private: yes
encrypt: sha512_crypt
confirm: yes
salt_size: 7