如何阻止dpkg安装任务在第二次运行时通知已更改的状态?

时间:2013-10-01 23:09:04

标签: deb dpkg ansible

没有用于直接安装.deb软件包的模块。当您必须将dpkg作为命令运行时,它始终将安装任务标记为已更改的任务。我在配置它时遇到了一些麻烦,所以我在这里张贴为公共笔记本。

以下是使用dpkg安装的任务:

- name: Install old python 
  command: dpkg -i {{ temp_dir }}/{{ item }}
  with_items: 
    - python2.4-minimal_2.4.6-6+precise1_i386.deb
    - python2.4_2.4.6-6+{{ ubuntu_release }}1_i386.deb
    - libpython2.4_2.4.6-6+{{ ubuntu_release }}1_i386.deb
    - python2.4-dev_2.4.6-6+{{ ubuntu_release }}1_i386.deb

在其他任务中上传到{{temp_dir}}的文件。

3 个答案:

答案 0 :(得分:13)

下面的答案仍然有效,但较新的ansible版本有apt module。现在Mariusz Sawicki的回答是首选。我已将其标记为已接受的答案。

当添加changed_when参数时,它只适用于Ansible 1.3版。这有点笨拙,也许有人可以改进解决方案。我没有找到这个“寄存器”对象的文档。

- name: Install old python 
  command: dpkg --skip-same-version -i {{ temp_dir }}/{{ item }}
  register: dpkg_result
  changed_when: "dpkg_result.stdout.startswith('Selecting')"
  with_items: 
    - python2.4-minimal_2.4.6-6+precise1_i386.deb
    - python2.4_2.4.6-6+{{ ubuntu_release }}1_i386.deb
    - libpython2.4_2.4.6-6+{{ ubuntu_release }}1_i386.deb
    - python2.4-dev_2.4.6-6+{{ ubuntu_release }}1_i386.deb

在这里,您可以运行相同的任务,它将在第一次安装。第一次之后,将不会安装包。

有两处修改。一个是参数--skip-same-version,用于防止dpkg重新安装软件。另一个是register和changed_when属性。第一次运行dpkg时,它会打印到以“选择”开头的字符串stdout,并通知更改。稍后它会有不同的输出。我已经尝试了一种更具可读性的条件,但无法使用更加软化的条件使用“not”或搜索子字符串。

答案 1 :(得分:8)

在Ansible 1.6(及更新版本)中,apt模块有一个deb选项:

- apt: deb=/tmp/mypackage.deb

答案 2 :(得分:2)

您可以将apt模块与dpkg_options参数一起使用:

- name: Install old python 
  apt: deb={{ temp_dir }}/{{ item }} dpkg_options="skip-same-version"
  register: dpkg_result
  changed_when: dpkg_result.stderr.find("already installed") == -1
  with_items: 
    - python2.4-minimal_2.4.6-6+precise1_i386.deb
    - python2.4_2.4.6-6+{{ ubuntu_release }}1_i386.deb
    - libpython2.4_2.4.6-6+{{ ubuntu_release }}1_i386.deb
    - python2.4-dev_2.4.6-6+{{ ubuntu_release }}1_i386.deb