在游戏层面,我们必须serial: 1
允许我们一次在一个主机上运行整个游戏。但我还没有找到一种简单的方法在单个任务上做到这一点。如果相关任务没有执行正确的锁定(无论出于何种原因),这一点尤其重要。
一个显而易见的答案是将任务放入自己的剧本中。但这对角色没有帮助。(必须serial: 1
使用角色进行剧本并不是很直观。)
答案1
答案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 }}"