Ответ 1
В Ansible 1.6 (и новее) модуль apt имеет опцию deb:
- apt: deb=/tmp/mypackage.deb
Не существует модуля для непосредственной установки пакетов .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}} в другой задаче.
В Ansible 1.6 (и новее) модуль apt имеет опцию deb:
- apt: deb=/tmp/mypackage.deb
Ответ ниже по-прежнему работает, но более новые версии имеют 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", и уведомление об изменении. Позже он будет иметь другой выход. Я пробовал более читаемое условие, но не мог заставить его работать с более сложным условием, которое использует "не" или ищет подстроку.
Вы можете использовать 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