Ansible 主机首选项

Ansible hosts preference

我正在尝试 运行 在远程节点集上执行一些 yum 命令。但它们需要按特定顺序 运行 而不是并行。

---
- name: Java 1.8 upgrade for EFM on Witness
  hosts: database-witness:database-standby:database-master
  tasks:
  - name: Installating Java 1.8 on Witness
    yum: name=java-1.8.0-openjdk-1.8.0.111-2.b15.el7_3 state=present
    notify: set unlimited java 1.8 security
  - name: Remove Java 1.7
    shell: rm -f /usr/lib/jvm/$(ls /usr/lib/jvm | grep "java-1.7")/jre/lib/security/*.jar
  - name: Remove SDK
    yum: name=java-1.7.0-openjdk.x86_64 state=absent
  - name: Remove Headless
    yum: name=java-1.7.0-openjdk-headless.x86_64 state=absent

我的环境文件是 ::

[database-master]
172.X.X.1

[database-standby]
172.X.X.2

[database-witness]
172.X.X.3

在上面的剧本中我指定了:

hosts: database-witness:database-standby:database-master

这是否意味着 yum 命令集将首先在 database-witness 上 运行 然后在 database-standby 上然后在 database-master.

他们将运行在不同主机上并行,在每个主机上这些任务运行顺序

In the above playbook I've specified:

hosts: database-witness:database-standby:database-master

Does this mean the set of yum commands will first be run on database-witness THEN on database-standby and THEN on database-master.

没有。使用指定 strategy 的 Ansible 运行s 剧本。默认情况下(linear 策略),Ansible 将在五个主机上并行分叉五个线程和 运行 每个任务。只有当当前组中的所有主机都完成(或失败)时,Ansible 才会移动到下一个任务。

由于您想在一台主机上的所有任务完成后移动到下一台主机,因此默认策略不适合您。


您可以在游戏中添加一个 serial: 1 声明(参见 Rolling Update Batch Size),这将导致 Ansible 在继续下一个主机之前 运行 所有任务,但是订单的问题仍然存在。

理论上主机的列表是有序的,一旦你对它进行了经验测试,它应该是可重复的,但是在关于 SO 的问题中有少量的例子表明 Ansible 并不总是保持 "common-sense"订单。

---
- name: Java 1.8 upgrade for EFM on Witness
  hosts: database-witness:database-standby:database-master
  serial: 1
  tasks:
    # the tasks

但是如果你像你的问题一样有严格的要求,最可靠的方法是将你的游戏分成三部分。

您可以将任务提取到单独的文件中以避免重复。所以:

---
- name: Java 1.8 upgrade for EFM on Witness
  hosts: database-witness
  tasks:
    - include: tasks.yml

- name: Java 1.8 upgrade for EFM on Witness
  hosts: database-standby
  tasks:
    - include: tasks.yml

- name: Java 1.8 upgrade for EFM on Witness
  hosts: database-master
  tasks:
    - include: tasks.yml

tasks.yml

- name: Installating Java 1.8 on Witness
  yum: name=java-1.8.0-openjdk-1.8.0.111-2.b15.el7_3 state=present
  notify: set unlimited java 1.8 security
- name: Remove Java 1.7
  shell: rm -f /usr/lib/jvm/$(ls /usr/lib/jvm | grep "java-1.7")/jre/lib/security/*.jar
- name: Remove SDK
  yum: name=java-1.7.0-openjdk.x86_64 state=absent
- name: Remove Headless
  yum: name=java-1.7.0-openjdk-headless.x86_64 state=absent

后一种解决方案还可以确保在任何主机出现错误时停止执行。使用 serial: 1-method 你没有这样的保证,所以如果任务在 database-witness 失败,Ansible 将继续下一个目标。