【问题标题】:Split debug variable output into two separate variables in ansible在ansible中将调试变量输出拆分为两个单独的变量
【发布时间】:2020-08-31 21:59:10
【问题描述】:

我正在使用下面的代码 sn-p 将打印图像详细信息:

- set_fact:
    image_name: "{{ load.results|map(attribute='stdout_lines')|list }}"

- debug:
    var: image_name

输出:

TASK [set_fact] ***************************************************************************************************************************************************************************
ok: [xx.xx.xx.xx]

TASK [debug] ******************************************************************************************************************************************************************************
ok: [xx.xx.xx.xx] => {
  "image_name": [
    [
        "Loaded image(s): localhost/cim:v1.5"
    ],
    [
        "Loaded image(s): localhost/cim:v1.8"
    ]
  ]
}

有没有办法可以将图像名称和标签存储在set_fact 本身下的两个单独变量中或以任何其他形式,以便我可以将这两个变量重用于下一个任务?

【问题讨论】:

    标签: ansible jinja2 ansible-template


    【解决方案1】:

    您可以使用regex_findall 过滤器来实现此目的。

    这里使用的正则表达式是(\S*):(\S+)如有需要,可查看here

    鉴于剧本:

    - hosts: all
      gather_facts: no
      vars:
        load:
          results:
            - stdout_lines:
              - "Loaded image(s): localhost/cim:v1.5"
            - stdout_lines:
              - "Loaded image(s): localhost/cim:v1.8"
          
      tasks:
        - set_fact:
            images: "{{ images | default([]) + item | regex_findall('(\\S*):(\\S+)') }}"
          loop: "{{ load.results | map(attribute='stdout_lines') | flatten }}"
      
        - debug:
            msg: "This image repository is `{{ item.0 }}` and its tag is `{{ item.1 }}`"
          loop: "{{ images }}"
    

    这产生了回顾:

    PLAY [all] *********************************************************************************************************
    
    TASK [set_fact] ****************************************************************************************************
    ok: [localhost] => (item=Loaded image(s): localhost/cim:v1.5)
    ok: [localhost] => (item=Loaded image(s): localhost/cim:v1.8)
    
    TASK [debug] *******************************************************************************************************
    ok: [localhost] => (item=['localhost/cim', 'v1.5']) => {
        "msg": "This image repository is `localhost/cim` and its tag is `v1.5`"
    }
    ok: [localhost] => (item=['localhost/cim', 'v1.8']) => {
        "msg": "This image repository is `localhost/cim` and its tag is `v1.8`"
    }
    
    PLAY RECAP *********************************************************************************************************
    localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
    

    【讨论】:

    • 感谢您的快速支持..现在我可以获取相应的图像 id TASK [debug] ******************** * ok: [xx.xx.xx.xx] => { "msg": { "changed": true, "msg": "All items completed", "results": [ { "stdout": "v1.5 124715a6d46f", "stdout_lines": [ "v1.5 124715a6d46f" ] }, 如何获取标签对应的图片ID?
    • 我正在尝试这个但得到错误: - set_fact: image_id: "{{ results.stdout | regex_findall('(^v[0-9].* )([0-9a-z] *)') }}" 任务 [set_fact] ************** 致命:[10.10.6.83]:失败! => {"msg": "在 ({{ results.stdout | regex_findall('(^v[0-9].* )([0-9a-z]*)') }}) 上发生了意外的模板类型错误: 预期的字符串或缓冲区"}
    • 很可能是因为您的results 来自循环,因此您将拥有stdout 的列表,而不是简单的字符串。
    • 好的,现在我正在执行此操作:- set_fact: image_id: "{{ image_id | default([]) + item | regex_findall('(\\S*[a-z0-9]) [[:space:]](\\S*)') }}" 循环:"{{ imagestatus.results | map(attribute='stdout_lines') | flatten }}" - debug: msg: "image tag is @ 987654329@" loop: "{{ image_id }}" 但没有得到 image_id 和调试 o/p TASK [set_fact] ***************** ok: [localhost] => ( item=v1.5 124715a6d46f) => { "ansible_facts": { "image_id": [] }, "ansible_loop_var": "item", "changed": false, "item": "v1.5 124715a6d46f" }跨度>
    猜你喜欢
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2018-01-31
    • 2015-08-17
    相关资源
    最近更新 更多