Ansible主机偏好

时间:2017-03-06 19:52:06

标签: ansible ansible-inventory

我正在尝试在远程节点集上运行一些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

我的env文件是::

[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-witnessdatabase-standby然后在database-master上运行。

2 个答案:

答案 0 :(得分:1)

  

在上面的剧本中我已经指定:

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

这是否意味着首先运行yum命令集   database-witness那么database-standby然后就是这样   database-master

没有。 Ansible使用指定的strategy运行playbooks。默认情况下(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 - 方法,您没有这样的保证,因此如果database-witness上的任务失败,Ansible将继续执行下一个目标。

答案 1 :(得分:0)

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