首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果某些文件发生更改,我如何运行ansible命令

问如果某些文件发生更改,我如何运行ansible命令
EN

Stack Overflow用户
提问于 2014-03-14 11:47:57
回答 3查看 18.1K关注 0票数 8

我正在使用ansible部署我的django App

使用

代码语言:javascript
复制
- name: Upgrade the virtualenv.
  pip: requirements={{project_root}}/www/requirements.txt virtualenv={{project_root}}/www/virtualenv

但我只想在上次运行后requirements.txt发生变化的情况下运行它

EN

回答 3

Stack Overflow用户

发布于 2014-12-17 05:06:58

我们需要确定是否有任何需求文件已更改。具体步骤如下:

  1. 触摸临时要求文件。(如果它们不存在,新的空白file)
  2. Calculate的md5将不同先前需求的md5散列和当前需求文件(刚从GIT中拉下的那些)的md5散列)
  3. 在步骤中迭代这些md5命令的结果,比较pip散列,注册tmp的输出如果#4中的任何结果发生更改,我们将pip packages
  4. Copy当前需求文件安装到临时位置。

这是我的行动手册,{{virtualenv.requirements}}是需求文件的列表,例如:['/work/project/requirements.txt', '/work/project/requirements-prod.txt']

代码语言:javascript
复制
- name: Assures temp requirements directory exists
  file: path="/tmp{{ virtualenv.path }}" state=directory
  sudo: yes
  when: install_pip_packages

- name: Assures temp requirements files exists
  file: path="/tmp{{ item }}" state=touch
  sudo: yes
  with_items: virtualenv.requirements_files
  when: install_pip_packages

- name: Calculate md5 of temp requirements
  stat: path="/tmp{{ item }}"
  with_items: virtualenv.requirements_files
  register: temp_requirements_stat
  when: install_pip_packages

- name: Calculate md5 of current requirements
  stat: path="{{ item }}"
  with_items: virtualenv.requirements_files
  register: current_requirements_stat
  when: install_pip_packages

- name: Check requirement files for changes
  command: test {{ temp_requirements_stat.results[item.0].stat.md5 }} = {{ current_requirements_stat.results[item.0].stat.md5 }}
  changed_when: "requirements_check.rc != 0"
  failed_when: requirements_check.stderr
  with_indexed_items: virtualenv.requirements_files
  register: requirements_check
  when: install_pip_packages

- name: Install packages required by the Django app inside virtualenv
  pip: virtualenv={{ virtualenv.path }} extra_args='-U' requirements="{{ virtualenv.requirements_files | join(' -r ') }}"
  when: install_pip_packages and requirements_check.changed

- name: Copy requirements to /tmp
  command: cp "{{ item }}" "/tmp{{ item }}"
  sudo: yes
  with_items: virtualenv.requirements_files
  when: install_pip_packages
票数 6
EN

Stack Overflow用户

发布于 2014-03-14 21:59:02

这里有两个选项:

notify

  • 将你的模板置于Ansible控制之下,使用‘requirements.txt’或'template‘模块,然后用'notify:’调用'pip‘模块,方法更复杂:

代码语言:javascript
复制
- retrieve md5 sum of requirements.txt on each Ansible run and compare it with saved md5 somewhere on the server ('stat' module could be used)
- retrieve pre-saved md5 sum of requirements.txt
- if current md5 is not equal to presaved, then invoke pip task ('when:' statement)
- save new md5 somewhere on the server for next Ansible run

​

票数 4
EN

Stack Overflow用户

发布于 2016-08-18 18:33:51

我在git仓库中使用了这个相当简短的变通方法。

代码语言:javascript
复制
  - name: get requirements changes since last pull
    shell: "cd {{ project_root }}; git log --name-status --oneline origin/master
           {{ git_result.before }}..{{ git_result.after }} | grep requirements.txt"
    register: pip_check
    failed_when: false

  - name: update pip requirements
    pip: requirements={{ project_root }}/requirements.txt
         virtualenv=~/.virtualenvs/www/
    when: pip_check.stdout_lines

它不是通用的,也不是跨平台的配方,但在许多情况下都能很好地工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22395733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档