Answers:
如果您不希望在执行剧本中的步骤时出现任何并行性,请将派生级别设置为1:
ansible-playbook --forks=1 ...
您还可以将其放入您的anscfg文件中:
[defaults]
forks=1
但是如果您希望单独使用它,请使用上面的命令行选项。
编辑:
serial: 1
所做的事情完全不同:这就像依次为每个主机运行该剧本,等待完整剧本的完成,然后再移至下一个主机。forks=1
表示在一个主机上运行播放中的第一个任务,然后再在下一个主机上运行相同的任务,因此在触摸下一个任务之前,将为每个主机运行第一个任务。
所以你只想forks=1
玩一玩;不幸的是,这目前是不可能的。
serial: 1
所做的事情完全不同:这就像依次为每个主机运行该剧本,等待完整剧本的完成,然后再移至下一个主机。forks=1
表示在一个主机上运行播放中的第一个任务,然后再在下一个主机上运行相同的任务,因此在触摸下一个任务之前,将为每个主机运行第一个任务。所以你只想forks=1
玩一玩;不幸的是,这目前是不可能的。
有一种解决此问题的方法-可以将主机(或组)列表传递给 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_once: true
在那里的人,请尝试将其取出。您将不喜欢发生的事情。(如此多的重复运行aaaahhhh)
如果您在一台机器上执行它,那么一台以上的主机就会出现排他锁问题。因此,您应该对所有主机一一执行。为此,您需要--forks=1
在调用ansible playbook命令时进行设置。例子:ansible-playbook webserver.yml --forks=1
webserver.yml 里面有app01和app02[webserver]
对于可以在本地运行的命令,请使用循环遍历播放中的所有主机。仅当命令可以在本地运行时,此选项才有效。如果设置了密钥,您也可以通过这种方式逐个向远程计算机运行一个带有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 }}"
inventory_hostname
,否则循环将变得毫无意义。
serial: 1
让我至少将其设置为播放。但是我只想将其设置为一个戏剧的子项目(无论该名称的正确名称是什么。我认为这是“任务”,但上面的评论似乎不同意)。