Назад | Перейти на главную страницу

Как я могу правильно использовать stdout в условном выражении ansible?

tasks:
    - name: check if rpmforge installed
      shell: rpm -q rpmforge-release-0.5.3-1.el6.rf.i686
      register: shell_output

    - name: Enable repo for htop
      shell: "{{ item }}"
      with_items:
        - wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm
        - sudo rpm -Uhv rpmforge-release-0.5.3-1.el6.rf.i686.rpm
      when: shell_output.stdout.find('not installed') != -1

Вышеуказанная задача не выполняется с:

failed: [default] => {"changed": true, "cmd": "rpm -q rpmforge-release-0.5.3-1.el6.rf.i686", "delta": "0:00:00.100877", "end": "2016-01-08 09:05:30.495234", "rc": 1, "start": "2016-01-08 09:05:30.394357", "warnings": ["Consider using yum module rather than running rpm"]}
stdout: package rpmforge-release-0.5.3-1.el6.rf.i686 is not installed

Стандартный вывод содержит фразу «не установлен».

Ansible версии 1.9.4, работающий на OSX El Capitan с Vagrant и Virtualbox (последние версии по состоянию на январь 2016 г.)

Ansible видит rpm -q возвращает ненулевой код выхода и прерывает выполнение.

Вы захотите изменить его вот так, чтобы Ansible не заботился о коде выхода:

tasks:
    - name: check if rpmforge installed
      shell: rpm -q rpmforge-release-0.5.3-1.el6.rf.i686
      register: shell_output
      failed_when: false
      changed_when: false

(Я также добавил changed_when поэтому Ansible не скажет вам, что что-то изменилось, как обычно shell задача. Потому что при запросе базы данных RPM ничего не меняется.)

Вторая задача в порядке.