ansible playbook 执行策略
默认情况下, ansible在所有hosts中每次在5台机器上运行任务。
如果想要改变这种默认行为,可以改变forks 数量或者改变策略类型。
设置策略
默认是 linear strategy , ansible提供其他策略 debug strategy , free strategy, 它允许每个主机尽可能快地运行到播放结束:
可以通过下面方式修改
- hosts: all
strategy: free
tasks:
# ...
或者修改ansible.cfg 全局设置
[defaults]
strategy = free
所有策略都作为策略插件实现。
设置forks数量,并发数
如果有更多的cpu,可以设置更多的forks,修改ansible.cfg
[defaults]
forks = 30
或者通过下面的命令
ansible-playbook -f 30 my_playbook.yml
使用关键字控制执行
除了策略之外,还有几个关键字会影响playbook的执行。可以设置一次要管理的主机数量,百分比或者数量列表。
影响发挥执行其他关键字包括ignore_errors,ignore_unreachable,和any_errors_fatal。
设置批量大小 serial 串行数
默认情况下,Ansible 并行处理所有的任务到所有主机,在hosts: field of each play。如果您只想一次管理几台机器,例如在滚动更新期间,您可以使用serial关键字定义 Ansible 一次应管理多少台主机:
---
- name: test play
hosts: webservers
serial: 3
gather_facts: False
tasks:
- name: first task
command: hostname
- name: second task
command: hostname
在上面的例子中,如果我们在 ‘webservers’ 组中有 6 个主机,Ansible 将在继续执行接下来的 3 个主机之前在其中 3 个主机上完全执行播放(两个任务):
PLAY [webservers] ****************************************
TASK [first task] ****************************************
changed: [web3]
changed: [web2]
changed: [web1]
TASK [second task] ***************************************
changed: [web1]
changed: [web2]
changed: [web3]
PLAY [webservers] ****************************************
TASK [first task] ****************************************
changed: [web4]
changed: [web5]
changed: [web6]
TASK [second task] ***************************************
changed: [web4]
changed: [web5]
changed: [web6]
PLAY RECAP ***********************************************
web1 : ok=2 changed=2 unreachable=0 failed=0
web2 : ok=2 changed=2 unreachable=0 failed=0
web3 : ok=2 changed=2 unreachable=0 failed=0
web4 : ok=2 changed=2 unreachable=0 failed=0
web5 : ok=2 changed=2 unreachable=0 failed=0
web6 : ok=2 changed=2 unreachable=0 failed=0
按百分比指定,Ansible 将百分比应用于一次播放中的主机总数,以确定每次传递的主机数:
---
- name: test play
hosts: webservers
serial: "30%"
如果主机数不等分为传递数,则最终传递包含余数。在此示例中,如果 webservers 组中有 20 台主机,则第一批将包含 6 个主机,第二批将包含 6 个主机,第三批将包含 6 个主机,最后一批将包含 2 个主机。
您还可以将批量大小指定为列表。例如:
---
- name: test play
hosts: webservers
serial:
- 1
- 5
- 10
在上面的示例中,第一批将包含一个主机,下一个将包含 5 个主机,并且(如果还有剩余的主机),接下来的每个批次将包含 10 个主机或所有剩余的主机,如果少于 10 个主机留下了。
您可以按百分比列出多个批次大小:
---
- name: test play
hosts: webservers
serial:
- "10%"
- "20%"
- "100%"
您还可以混合和匹配这些值:
---
- name: test play
hosts: webservers
serial:
- 1
- 5
- "20%"
注意: 无论百分比有多小,每次通过的主机数将始终为 1 或更多。
限制执行throttle
throttle关键字针对特殊的任务限制worker的数量。使用throttle限制,可能是CPU密集型或相互作用与限速API任务:
tasks:
- command: /path/to/cpu_intensive_command
throttle: 1
如果您已经限制了forks的数量或并行执行的机器数量,您可以使用 减少工作线程的数量throttle,但不能增加它。换句话说,要产生效果,如果您将它们一起使用,您的throttle设置必须低于您的forks或serial设置。
基于inventory的执行顺序
order
关键字控制hosts的执行顺序
inventory
: (默认) inventory为所请求的选择提供的顺序
reverse_inventory
: 和上面一样,但是反转返回列表
sorted
: 按姓名字母顺序排序
reverse_sorted
: 按名称按字母逆序排序
shuffle
: 每次运行随机排序
inventory顺序不等同于inventory源文件中主机/组的顺序,而是从编译的order中返回选择的顺序。这是一个向后兼容的选项。虽然可以重复但通常是不可预测的。
在一台机器上运行run_once
如果你想要一个任务只运行在hosts的第一个机器上
---
# ...
tasks:
# ...
- command: /opt/application/upgrade_db.py
run_once: true
# ...
Ansible 在当前批处理中的第一台主机上执行此任务,并将所有结果和事实应用于同一批处理中的所有主机。这种方法类似于将条件应用于任务,例如:
- command: /opt/application/upgrade_db.py
when: inventory_hostname == webservers[0]
但是,使用run_once,结果将应用于所有主机。要在特定主机上运行任务,而不是批处理中的第一个主机,请委派任务:
- command: /opt/application/upgrade_db.py
run_once: true
delegate_to: web01.example.org
与委托一样,操作将在委托主机上执行,但信息仍然是任务中原始主机的信息。