Ansible:如何按主机运行一个任务主机?

Elr*_*ond 23 task ansible ansible-playbook

在游戏层面,我们必须serial: 1允许我们一次一个主机运行整个游戏。但是我还没有找到一种简单的方法来在单个任务上做到这一点。如果有问题的任务没有执行正确的锁定(无论出于何种原因),这尤其重要。

一个明显的答案是将任务放在自己的游戏中。但这对角色没有帮助。(不得不serial: 1使用这个角色来演戏并不是很直观。)

wur*_*tel 17

如果您不希望在执行剧本中的步骤时有任何并行性,请将 fork 级别设置为 1:

ansible-playbook --forks=1 ...
Run Code Online (Sandbox Code Playgroud)

你也可以把它放在你的 ansible cfg 文件中:

[defaults]
forks=1
Run Code Online (Sandbox Code Playgroud)

但如果您需要单独使用,请使用上面的命令行选项。

编辑:

serial: 1做一些完全不同的事情:这就像依次为每个主机运行剧本,等待完整剧本完成,然后再转到下一个主机。forks=1意味着在一个主机上运行第一个任务,然后在下一个主机上运行相同的任务,所以第一个任务将在下一个任务被触及之前为每个主机运行。

所以你只想forks=1玩一场;不幸的是,这目前是不可能的。

  • `serial: 1` 做了一些完全不同的事情:这就像依次为每个主机运行剧本,在移动到下一个主机之前等待完整的剧本完成。`forks=1` 意味着在一个主机上运行第一个任务,然后在下一个主机上运行*相同*的任务,所以第一个任务将在下一个任务被触及之前为每个主机运行。所以你想要`forks=1` 只玩一场;不幸的是,这目前是不可能的。 (3认同)
  • 我不想在整个剧本中设置它。这对非颗粒来说非常重要。`serial: 1` 让我至少将它设置为戏剧。但我只想将它设置在戏剧的一个子项目上(它的正确名称是什么。我认为,这是“任务”,但上面的评论似乎不同意)。 (2认同)

max*_*zig 11

您可以通过添加throttle: 1来串行(即逐个主机)运行单个任务。

例子:

---

- hosts: all
  tasks:
      - name: wait in parallel
        command: sleep 20
      - name: wait  in serial
        command: sleep 30
        throttle: 1
Run Code Online (Sandbox Code Playgroud)

参考:

注意:throttle在 Ansible 2.9 中引入


小智 5

这个问题有一个解决方法 - 可以将主机(或一组)列表传递给with_items,然后delegate_to与此列表一起使用。这种方式任务将由主机主机执行。

例如:

- name: start and enable rabbitmq (run task host by host)
  service:
    name: "rabbitmq-server"
    state: "started"
    enabled: true
  delegate_to: "{{ item }}"
  with_items: "{{ groups['rabbitmq-cluster'] }}"
  run_once: true
Run Code Online (Sandbox Code Playgroud)