提问者:小点点

一个简单的任务来“grep”字符串,如果没有找到该字符串,任务将失败


下面是我的Ansible任务,我想确定它是否正确。

- name: check
    shell: curl -s 'http://<host>/path' | grep abc
       warn=no
    no_log: True
    register: grep_output
    ignore_errors: true
    failed_when: grep_output.stdout != ''

共1个答案

匿名用户

我理解您的问题,即您有兴趣验证grep结果(首先)。正如评论中已经提到的,您需要定义失败的含义。

---
- hosts: localhost
  become: false
  gather_facts: false

  vars:

    ANSIBLE_TOWER_URL: "yourURL"
    TOWER_LATEST_VERSION: "yourVersion"

  tasks:

  - name: Check Ansible Tower version
    shell:
      cmd: curl --silent --location "https://{{ ANSIBLE_TOWER_URL }}/api/v2/ping/" | jq '.version' | grep {{ TOWER_LATEST_VERSION }}
      warn: false
    register: result
    failed_when: result.rc != 0
    changed_when: false
    check_mode: false

  - name: Show result
    debug:
      msg: "{{ result.stdout }}"

您不应该使用ignore_errors指令,因为

它不会使Ansible忽略未定义的变量错误

以后再说。此外,上面的方法不考虑HTTP状态代码,如下例所示。

curl --silent --location "https://{{ ANSIBLE_TOWER_URL }}/api/v2/ping/" --write-out "%{http_code}" | jq '.'

因此,根据用例,不清楚预期的结果是否存在,或者页面是否不可达或不可访问,并且给出错误的结果和做出不正确的假设。

因此,最好使用<code>uri</code>模块与以下Web服务交互

  - name: Check Ansible Tower version
    uri:
      url: "https://{{ ANSIBLE_TOWER_URL }}/api/v2/ping/"
      method: GET
      validate_certs: yes
      return_content: yes
      status_code: 200
      body_format: json
    check_mode: false
    register: result

  - name: Show result
    debug:
      msg: "{{ result.json }}"

您可以使用它访问结果集的值,例如“{{ result.json.version }}”。

进一步Q

  • grep
  • 的返回代码
  • grep命令的退出状态代码
  • 关于HTTP状态代码的线程
  • curl返回HTTP状态代码和响应
  • 是否让<code>curl</code>输出HTTP状态代码