如何使Ansible通知主机是相同的,避免任务冲突
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使Ansible通知主机是相同的,避免任务冲突相关的知识,希望对你有一定的参考价值。
我的库存文件保持相同的逻辑主机数,但ansible_host的数量可能不同:
案例1,三个逻辑,主机三个ansible_hosts
all:
hosts:
db:
ansible_host: db.example.com
apps:
ansible_host: app.example.com
proxy:
ansible_host: proxy.example.com
案例2,三个逻辑,主持一个ansible_host
all:
hosts:
db: &ahost
ansible_host: allinone.example.com
apps:
<<: *ahost
proxy:
<<: *ahost
在我的剧本中,有一些适用于所有人的共同任务,如yum
- name: "Install OS packages"
yum: pkg={{item}} state=installed
with_items:
- p1
- p2
- ... (quite a lot)
它们可能在运行时发生冲突,因为ansible试图并行运行它们会导致yum会话锁定。
我想知道如果在案例2中已经在db上启动了yum,我怎么能告诉ansible跳过在应用程序和代理上安装os包。(除了切断parrallelism之外)
答案
你可以利用Ansible File模块。在你Install OS Packages
步骤之前,你可以创建一个临时文件。
- name: "Create temporary file to lock yum"
file:
path: /tmp/yum.lock
state: present
接下来,您将创建一个任务以检查锁定文件是否存在。一旦它在第一次连接期间创建,我们期望它存在。
- name: "Check if yum lock file exists"
stat:
path: /tmp/yum.lock
register: yum_lock
然后,修改您的任务:
- name: "Install OS packages"
yum: pkg={{item}} state=installed
when: yum_lock.stat.exists == False
with_items:
- p1
- p2
- ... (quite a lot)
最后,添加清理任务以删除yum lock文件。
- name: "Delete temporary file to lock yum"
file:
path: /tmp/yum.lock
state: absent
以上是关于如何使Ansible通知主机是相同的,避免任务冲突的主要内容,如果未能解决你的问题,请参考以下文章