在ansible的playbook中为一个任务设置分支。

7

我在我的playbook中有一个任务,我希望一次只在一个主机上运行。其余的任务我想遵守--forks选项。这可能吗?

注:--forks是ansible-playbook命令的一个选项,用于指定并发操作的主机数。
4个回答

5

是的,可以使用throttle关键字来实现:

在任务、块和剧本级别上限制并发任务运行的数量。这与forks和serial设置无关,但不能高于这些限制。例如,如果forks设置为10,而节流阀设置为15,则最多会并行操作10个主机。

示例:

---

- hosts: all
  tasks:
      - name: wait in parallel
        command: sleep 20
      - name: wait  in serial
        command: sleep 30
        throttle: 1

throttle 关键词自 Ansible 2.9 版本开始提供。


5

是的,结账时请检查滚动更新

具体来说,您可以为一个play添加“serial: x”参数,其中x是forks的数量。


3
这不完全是我想要的。我想限制只有一个任务的并行执行数量,而不是整个剧本。 - Todd Chapman
1
这不是针对整个playbook的。serial参数是基于每个play的。一个play由一个或多个任务组成。只需将您想要串行执行的主机放在一个单独的play中即可。 - Petro026

2
在 Ansible 的术语词汇文档中有如下段落:

滚动更新

一次性处理一组 N 个节点,以避免全部更新并将系统离线。例如,在一个处理大量数据的 500 个节点的 Web 拓扑结构中,每次更新 10 或 20 台机器是合理的,完成后再继续下一个 10 或 20 台。在 Ansible 的 playbooks 中,serial 关键字控制滚动更新池的大小。默认情况下,会一次性处理整个批次,因此这是您必须选择的内容。操作系统配置(例如确保配置文件正确)通常不必使用滚动更新模型,但如果需要,也可以这样做。

使用--forks=Xserial:剧本构造一起使用时,无法将单个任务限制为按顺序运行。这是因为serial:关键字仅适用于playbook。您唯一的解决方案是将任务拆分为两个playbook,并将包含要按顺序运行的任务的整个playbook限制为serial: 1

示例

$ cat helloansible.yml
---
- hosts: all
  serial: 1

  tasks:
    - debug:
        msg: "hello ansible - serial"

- hosts: all

  tasks:
    - debug:
        msg: "hello ansible - batched"

当我针对一个清单运行这个命令时,你会看到第一本剧本会遍历清单中的每个主机:
$ ansible-playbook -i inventory/lab helloansible.yml -l server*

PLAY [all] **************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************************************
ok: [server-01a.lab1.mydom.local]

TASK [debug] ************************************************************************************************************************************************************************************************
ok: [server-01a.lab1.mydom.local] => {
    "msg": "hello ansible - serial"
}

PLAY [all] **************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************************************
ok: [server-01b.lab1.mydom.local]

TASK [debug] ************************************************************************************************************************************************************************************************
ok: [server-01b.lab1.mydom.local] => {
    "msg": "hello ansible - serial"
}

PLAY [all] **************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************************************
ok: [server-redis-01a.lab1.mydom.local]

TASK [debug] ************************************************************************************************************************************************************************************************
ok: [server-redis-01a.lab1.mydom.local] => {
    "msg": "hello ansible - serial"
}

PLAY [all] **************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************************************
ok: [server-redis-01b.lab1.mydom.local]

TASK [debug] ************************************************************************************************************************************************************************************************
ok: [server-redis-01b.lab1.mydom.local] => {
    "msg": "hello ansible - serial"
}

PLAY [all] **************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************************************
ok: [server-redis-01c.lab1.mydom.local]

TASK [debug] ************************************************************************************************************************************************************************************************
ok: [server-redis-01c.lab1.mydom.local] => {
    "msg": "hello ansible - serial"
}

而在第二个运行的剧本中:
PLAY [all] **************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************************************
ok: [server-01b.lab1.mydom.local]
ok: [server-redis-01a.lab1.mydom.local]
ok: [server-redis-01c.lab1.mydom.local]
ok: [server-redis-01b.lab1.mydom.local]
ok: [server-01a.lab1.mydom.local]

TASK [debug] ************************************************************************************************************************************************************************************************
ok: [server-01a.lab1.mydom.local] => {
    "msg": "hello ansible - batched"
}
ok: [server-01b.lab1.mydom.local] => {
    "msg": "hello ansible - batched"
}
ok: [server-redis-01a.lab1.mydom.local] => {
    "msg": "hello ansible - batched"
}
ok: [server-redis-01b.lab1.mydom.local] => {
    "msg": "hello ansible - batched"
}
ok: [server-redis-01c.lab1.mydom.local] => {
    "msg": "hello ansible - batched"
}

PLAY RECAP **************************************************************************************************************************************************************************************************
server-01a.lab1.mydom.local : ok=4    changed=0    unreachable=0    failed=0
server-01b.lab1.mydom.local : ok=4    changed=0    unreachable=0    failed=0
server-redis-01a.lab1.mydom.local : ok=4    changed=0    unreachable=0    failed=0
server-redis-01b.lab1.mydom.local : ok=4    changed=0    unreachable=0    failed=0
server-redis-01c.lab1.mydom.local : ok=4    changed=0    unreachable=0    failed=0

自 Ansible 2.9 开始就提供了 throttle 功能,可以实现这一点(参见我的回答)。 - maxschlepzig

0

使用节流选项,允许每个任务的进程数与命令行中定义的不同。该选项仅在ansible 2.9中可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接