2013-10-01 3 views
10

Существует не модуль для установки пакетов .deb напрямую. Когда вам нужно запустить команду dpkg в качестве команды, она всегда ставит задачу установки как измененную. У меня возникли проблемы с правильной настройкой, поэтому я размещаю здесь публичный блокнот.Как вы предотвращаете задачу установки 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}} в другой задаче.

ответ

8

В анзибль 1.6 (и выше), то apt модуль имеет опцию DEB:

- apt: deb=/tmp/mypackage.deb 
13

Ответ ниже по-прежнему работает, но более новые версии могут иметь 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», и уведомление об изменении. Позже он будет иметь другой выход. Я пробовал более читаемое условие, но не мог заставить его работать с более сложным условием, которое использует «не» или ищет подстроку.

+6

ловкий трюк! Я бы предпочел проверить STDERR: «changed_when:» «уже установлен» не в dpkg_result.stderr »' – tokarev

+2

Из документов Ansible: [Переопределение измененного результата] (http://docs.ansible.com/playbooks_error_handling.html # overriding-the-changed-result) – user272735

+0

Так как with_items, with_dict и т. д. не работают при использовании параметра версии 1.6+ deb, это лучший способ перебрать несколько локальных файлов .deb для установки. – senorsmile

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 
+0

Я изменил принятый ответ на этот вопрос, так как новый apt-модуль заботится о проблеме. – neves

 Смежные вопросы

  • Нет связанных вопросов^_^