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


15

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

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

Answers:


11

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

ansible-playbook --forks=1 ...

您还可以将其放入您的anscfg文件中:

[defaults]
forks=1

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

编辑:

serial: 1所做的事情完全不同:这就像依次为每个主机运行该剧本,等待完整剧本的完成,然后再移至下一个主机。forks=1表示在一个主机上运行播放中的第一个任务,然后再在下一个主机上运行相同的任务,因此在触摸下一个任务之前,将为每个主机运行第一个任务。

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


2
我不想将其设置在整个剧本上。对于非粒度而言,这非常重要。serial: 1让我至少将其设置为播放。但是我只想将其设置为一个戏剧的子项目(无论该名称的正确名称是什么。我认为这是“任务”,但上面的评论似乎不同意)。
Elrond

3
serial: 1所做的事情完全不同:这就像依次为每个主机运行该剧本,等待完整剧本的完成,然后再移至下一个主机。forks=1表示在一个主机上运行播放中的第一个任务,然后再在下一个主机上运行相同的任务,因此在触摸下一个任务之前,将为每个主机运行第一个任务。所以你只想forks=1玩一玩;不幸的是,这目前是不可能的。
wurtel

好点子!您介意将其添加到答案中吗?
Elrond

2

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

1

如果您在一台机器上执行它,那么一台以上的主机就会出现排他锁问题。因此,您应该对所有主机一一执行。为此,您需要--forks=1在调用ansible playbook命令时进行设置。例子:ansible-playbook webserver.yml --forks=1webserver.yml 里面有app01和app02[webserver]


0

想想你想要的是

run_once:是


4
nope:“ run_once:true”表示要为主机列表中的一台主机运行任务。我想为列表中的每个主机运行它,但是一个接一个地运行。
Elrond

0

对于可以在本地运行的命令,请使用循环遍历播放中的所有主机。仅当命令可以在本地运行时,此选项才有效。如果设置了密钥,您也可以通过这种方式逐个向远程计算机运行一个带有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 }}"

1
您必须提供主机列表,而不是仅在名为的主机上提供inventory_hostname,否则循环将变得毫无意义。
Konstantin Suvorov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.