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

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

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

一个显而易见的答案是将任务放入自己的剧本中。但这对角色没有帮助。(必须serial: 1使用角色进行剧本并不是很直观。)

答案1

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

例子:

---

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

参考:

注意:throttle是在 Ansible 2.9 中引入的

答案2

如果你不想在执行剧本中的步骤时出现任何并行性,请将 fork 级别设置为 1:

ansible-playbook --forks=1 ...

您也可以将其放入您的 ansible cfg 文件中:

[defaults]
forks=1

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

编辑:

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

因此,您只想forks=1玩一次;不幸的是,目前还不可能。

答案3

这个问题有一个解决方法 - 可以将主机列表(或组)传递给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

答案4

对于可以在本地运行的命令,使用循环遍历剧中的所有主机。这仅在命令可以在本地运行时才有效。如果设置了密钥,您还可以以这种方式逐个向远程计算机运行包含 ssh 的命令,但在谈到升级时会变得困难。

例如:

- name: Init New Appliances - Remove the known hosts entry for the server in case it has changed
  run_once: yes
  connection: local
  become: no
  command: "ssh-keygen -R {{ item }}"
  with_items:
  - "{{ inventory_hostname }}"

相关内容