26

我想在 shell 命令不返回预期输出的情况下运行 Ansible 操作。ogr2ogr --formats漂亮地打印兼容文件格式的列表。我想 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
4

2 回答 2

33

首先,请确保您使用的是 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。它会吐出很多有用的字典值。

于 2013-11-15T19:02:37.873 回答
9

我的解决方案:

- 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) "
于 2016-01-05T11:50:33.107 回答