Как проверить, присутствует ли список строк в выводе команды в Ansible?

Я хочу запустить действие Ansible при условии, что команда оболочки не вернет ожидаемый результат. ogr2ogr --formats pretty-prints список совместимых форматов файлов. Я хочу, чтобы grep выводил форматы, и если ожидаемые форматы файлов не выводятся, я хочу запустить команду для установки этих компонентов. Кто-нибудь знает, как это сделать?

- name: check if proper ogr formats set up
  command: ogr2ogr --formats | grep $item
  with_items:
    - PostgreSQL
    - FileGDB
    - Spatialite
  register: ogr_check

# If grep from ogr_check didn't find a certain format from with_items, run this
- name: install proper ogr formats
  action: DO STUFF
  when: Not sure what to do here

Ответы

Ответ 1

Сначала убедитесь, что вы используете Ansible 1.3 или новее. Ansible по-прежнему очень быстро меняется из-за того, что я вижу, и очень много удивительных функций и исправлений ошибок.

Что касается проверки, вы можете попробовать что-то вроде этого, воспользовавшись grep кодом выхода:

- name: check if proper ogr formats set up
  shell: ogr2ogr --formats | grep $item
  with_items:
    - PostgreSQL
    - FileGDB
    - Spatialite
  register: ogr_check
  # grep will exit with 1 when no results found. 
  # This causes the task not to halt play.
  ignore_errors: true

- name: install proper ogr formats
  action: DO STUFF
  when: ogr_check|failed

Существуют и другие полезные регистровые переменные, а именно item.stdout_lines. Если вы хотите увидеть, что зарегистрировано в переменной подробно, попробуйте выполнить следующую задачу:

- debug: msg={{ogr_check}}

а затем запустите задачу в двойном подробном режиме ansible-playbook my-playbook.yml -vv. Он выплюнет множество полезных значений словаря.

Ответ 2

Мое решение:

- name: "Get Ruby version"
command: "/home/deploy_user/.rbenv/shims/ruby -v"
changed_when: true
register: ruby_installed_version
ignore_errors: true

- name: "Installing Ruby 2.2.4"
command: '/home/deploy_user/.rbenv/libexec/rbenv install -v {{ruby_version}}'
become: yes
become_user: deployer
when: " ( ruby_installed_version | failed ) or ('{{ruby_version}}' not in ruby_installed_version.stdout) "