如果某个文件发生了变化,我怎样才能运行ansible命令

时间:2014-03-14 03:47:57

标签: ansible ansible-playbook

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

使用

- name: Upgrade the virtualenv.
  pip: requirements={{project_root}}/www/requirements.txt virtualenv={{project_root}}/www/virtualenv

但是我只想在上次运行后更新requirements.txt

时运行它

3 个答案:

答案 0 :(得分:6)

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

  1. 触摸临时要求文件。 (如果它们不存在,则新的空白文件的md5将不同)
  2. 计算先前需求文件的md5哈希值
  3. 计算当前需求文件的md5哈希值(刚刚从GIT下拉的文件)
  4. 在步骤中迭代这些stat命令的结果,比较md5哈希,注册比较的输出
  5. 只有当#4中的任何结果发生变化时,我们才会安装pip包
  6. 将当前需求文件复制到tmp位置。
  7. 这是我的剧本,{{virtualenv.requirements}}是需求文件列表,例如:['/work/project/requirements.txt', '/work/project/requirements-prod.txt']

    - 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
    

答案 1 :(得分:4)

以下是两个选项:

  • 将您的requirements.txt置于Ansible控件下并使用' copy'或者'模板'模块,然后调用' pip'模块与'通知:'声明

  • 第二种方式更复杂:

    • 在每次Ansible运行中检索md5的requirements.txt总和,并将其与服务器上某处保存的md5进行比较(可以使用' stat'模块)
    • 检索预先保存的md5需求总和.txt
    • 如果当前的md5不等于presaved,则调用pip任务(' when:' statement)
    • 在服务器上的某处保存新的md5以进行下一次Ansible运行

答案 2 :(得分:1)

我将这个非常简短的解决方法用于git存储库。

  - 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

它不是通用的,也不是跨平台的配方,但在许多情况下效果很好。