Как вы предотвращаете задачу установки dpkg уведомлять измененное состояние, когда оно выполняется во второй раз?

Не существует модуля для непосредственной установки пакетов .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}} в другой задаче.

Ответ 1

В Ansible 1.6 (и новее) модуль apt имеет опцию deb:

- apt: deb=/tmp/mypackage.deb

Ответ 2

Ответ ниже по-прежнему работает, но более новые версии имеют apt module. Ответ Мариуша Савицки теперь является предпочтительным. Я отметил это как принятый ответ.

Он будет работать только с Ansible версии 1.3, когда был добавлен параметр changed_when. Это немного неуклюжий, может быть, кто-то может улучшить решение. Я не нашел документацию этого объекта "register".

- 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. Другой - регистр и измененные атрибуты. В первый раз, когда dpkg запускается, он печатает в stdout строку, начинающуюся с "Selecting", и уведомление об изменении. Позже он будет иметь другой выход. Я пробовал более читаемое условие, но не мог заставить его работать с более сложным условием, которое использует "не" или ищет подстроку.

Ответ 3

Вы можете использовать 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