如何使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通知主机是相同的,避免任务冲突的主要内容,如果未能解决你的问题,请参考以下文章

Ansible1: 简介与基本安装

ansible运维工具

Ansible1:简介与基本安装

ansible 的Playbook

Ansible常用模块

Ansible-playbook 同一组相同主机