8

ansible用来部署我的django App

使用

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

但我只想运行它,如果 requirements.txt 自上次运行以来发生了变化

4

3 回答 3

6

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

  1. 触摸临时需求文件。(如果它们不存在,新的空白文件的 md5 将不同)
  2. 计算之前需求文件的md5 hash
  3. 计算当前需求文件的 md5 散列(刚从 GIT 拉下来的那些)
  4. 逐步遍历这些 stat 命令的结果,比较 md5 哈希,注册比较的输出
  5. 只有当 #4 中的任何结果发生变化时,我们才会安装 pip 包
  6. 将当前需求文件复制到 tmp 位置。

这是我的剧本,{{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
于 2014-12-16T21:06:57.693 回答
4

这里有两个选项:

  • 将您的 requirements.txt 置于 Ansible 控制之下并使用“复制”或“模板”模块,然后使用“通知:”语句调用“pip”模块

  • 第二种方式更复杂:

    • 在每次 Ansible 运行时检索 requirements.txt 的 md5 总和,并将其与服务器上某处保存的 md5 进行比较(可以使用“stat”模块)
    • 检索预先保存的 md5 总和的 requirements.txt
    • 如果当前 md5 不等于 presaved,则调用 pip 任务('when:' 语句)
    • 在服务器上的某处保存新的 md5 以供下次 Ansible 运行
于 2014-03-14T13:59:01.750 回答
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

它不是通用的,也不是跨平台的配方,但适用于许多情况。

于 2016-08-18T10:33:50.993 回答