【问题标题】:Using a job identifier to group ansible tasks into logical task group使用作业标识符将 ansible 任务分组到逻辑任务组
【发布时间】:2020-06-10 21:12:51
【问题描述】:

我是 ansible 的新手,但我正在努力进步和学习。

我正在运行一些 API 调用来配置网络代理工具。

流程本质上是,发出一个GET请求来查看对象是否存在,如果不存在,则跟进一个POST请求来创建该对象。很标准。

此过程会重复多次,因为产品可以有多个相同类型配置的实例。所以我想通过关联一个 id 使 GET/POST 例程尽可能通用可重复。

剧本是:

    set_fact:
      'vh_task_id': 01

  - name: check virtual host exists
    uri:
      method: GET
      url: "{{ admin_api_url }}/hosts?vHost={{ public_virtual_host|urlencode() }}"
      return_content: yes
      headers:
        X-XSRF-Header: "Access"
      user: "{{ admin_user }}"
      password: "{{ admin_password }}"
      status_code: 200
      validate_certs: no
    register: response

  - name: set fact virtual host task id response '{{ public_virtual_host }}'
    set_fact:
      'response_{{ vh_task_id }}': "{{ response }}"

到目前为止,这一切都很好,response_{{ vh_task_id }} 正确包含来自上述 set_fact 的响应正文,正如我所看到的,如果我输出它的话。

当我想查询 response_{{ vh_task_id }} 中的 JSON 作为要查询以获取 id 值的变量时,问题就变成了。

set_fact 是设置response_01 的文字值,而不是将连接视为注册变量。

这是我尝试做的一个例子:

set_fact:
'vh_id': "{{ hostvars[inventory_hostname].response_{{ vh_task_id }} | json_query('json.items[0].id') }}"

非常感谢您的帮助。

【问题讨论】:

  • 感谢您抽出宝贵的时间回来,我对此进行了测试,但最后,我了解到使用 with_items 可以得到更好的结果并且更可重复。

标签: ansible ansible-facts


【解决方案1】:

试试这个:

set_fact:
  'vh_id': "{{ hostvars[inventory_hostname].hostvar | json_query('json.items[0].id') }}"
vars:
  hostvar: response_{{ vh_task_id }}

此外,您不需要显式引用 ' 将纯字符串作为变量名。比如,如果没有其他理由将名称保留在引号中,您可以将 'vh_id': 更改为 vh_id:

【讨论】:

    【解决方案2】:

    感谢您抽出宝贵的时间回来,我对此进行了测试,但最后,我了解到使用 with_items 可以得到更好的结果并且更可重复

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多