如何使Ansible通知主机是相同的,避免任务冲突

时间:2018-03-05 18:35:41

标签: 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会话锁定。

我想知道如何告诉ansible跳过在 apps 上安装os软件包 代理一旦在案例2中已经在 db 上启动了yum。 (除了摆脱平行主义外)

1 个答案:

答案 0 :(得分:0)

您可以利用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