我有一个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的语义(并且另一个任务进行更新-该任务应每次重新运行)
答案 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
一起安装的文件,或创建自己的文件。