我正在尝试在远程节点集上运行一些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-witness
上database-standby
然后在database-master
上运行。
答案 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)
它们将在不同的主机上并行运行,在每台主机上这些任务按顺序运行