1

我正在尝试在远程节点集上运行一些 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-witnessTHEN ondatabase-standby和 THEN on 上运行database-master

4

2 回答 2

1

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

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

这是否意味着 yum 命令集将首先在 database-witnessTHEN ondatabase-standby和 THEN on 上 运行database-master

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

由于您想在单个主机上的所有任务完成后移动到下一个主机,因此默认策略对您不起作用。


您可以在播放中添加一个serial: 1声明(请参阅Rolling Update Batch Size),这将导致 Ansible 在继续执行下一个主机之前在单个主机上运行所有任务,但顺序问题仍然存在。

从理论上讲,主机列表是有序的,一旦您对其进行了经验测试,它应该是可重复的,但是关于 SO 的问题中有(少量)示例表明 Ansible 并不总是保持“常识”顺序。

---
- 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 将继续下一个目标。

于 2017-03-07T01:01:01.663 回答
0

它们将在不同的主机上并行运行,在每台主机上这些任务按顺序运行

于 2017-03-06T20:18:30.660 回答