ansible playbook 执行策略

  • Post author:
  • Post category:其他




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

与委托一样,操作将在委托主机上执行,但信息仍然是任务中原始主机的信息。



版权声明:本文为weixin_58400622原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。