如何使Ansible仅运行一个步骤

时间:2018-12-13 17:11:32

标签: ansible

我有一个Ansible步骤如下

- name: pipenv install of bluebird workers, pg helpers, boto helpers
       shell: pipenv --python 3.6 install "bluebird-workers>=3.0.24" "pg_helpers>=1.0.9" "boto_helpers>=1.0.28"

以上步骤将在每次运行剧本时保持重新运行。如何使以上步骤仅运行一次。我想要安装1x的语义(并且另一个任务进行更新-该任务应每次重新运行)

2 个答案:

答案 0 :(得分:3)

尽可能避免使用shell模块!

shell模块不是幂等的;它无法知道它是否在先运行,因为您可以从外壳上按字面意思运行任何

一种更清洁的方法是改用pip module

tasks:
- name: Install python libraries.
  pip:
    name:
      - bluebird-workers>=3.0.24
      - pg_helpers>=1.0.9
      - boto_helpers>=1.0.28
    virtualenv: /path/to/your/virtualenv

答案 1 :(得分:2)

您需要创建一个可以搜索的工件,例如文件。检查您的Ansible任务中是否存在该文件,如果不存在,请不要运行任务。

一个简单的剧本来演示:

---
- hosts: localhost
  tasks:
     - name: test if file is present
       stat:
          path: /var/pip_installed
       register: stat_result

     - name: Install something
       shell: ls -l > /var/pip_installed creates=/var/pip_installed
       become: true
       when: stat_result.stat.exists == false

您将用外壳程序命令替换ls -l

这是两次运行的输出:

运行一个

  

$ ansible-playbook test_ps.yml    [警告]:提供的主机列表为空,只有localhost可用。请注意,隐式本地主机与“ all”不匹配

     

播放[localhost] ****

     

任务[聚会事实] ****   好的:[localhost]

     

任务[测试文件是否存在] ****   好的:[localhost]

     

任务[安装物品] ****   更改为:[localhost]

     

PLAY RECAP ****

     

localhost:确定= 3已更改= 1无法访问= 0失败= 0

运行两次

  

播放[localhost] ****

     

任务[聚会事实] ****   好的:[localhost]

     

任务[测试文件是否存在] ****   好的:[localhost]

     

任务[安装物品] ****   跳过:[本地主机]

     

PLAY RECAP ****

     

localhost:ok = 2更改= 0不可达= 0失败= 0

您还可以搜索已知与pip一起安装的文件,或创建自己的文件。