使用 jinja 的 Ansible set_fact 列表

Mik*_*e S 2 jinja2 ansible

我正在尝试学习 jinja 和 Ansible。这是在 RHEL 7.9 上,

ansible 2.9.27
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, May 27 2022, 11:27:32) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
Run Code Online (Sandbox Code Playgroud)

我进行此练习的唯一原因是学习。但我很困惑。为什么这不产生一个列表found_route_list(这是一个列表)?

ansible 2.9.27
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, May 27 2022, 11:27:32) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
Run Code Online (Sandbox Code Playgroud)

我的剧本首先收集服务器上的路由:

- name: Get route info
  shell: /usr/sbin/ip route show | sed -e 's/ proto.*//' 
  register: cmdtmp
  changed_when:
    - cmdtmp.stdout | length == 0

- name: Get route list
  set_fact:
    found_route_list: "{{ cmdtmp.stdout.split('\n') }}"
Run Code Online (Sandbox Code Playgroud)

虽然只是产生几行输出,如下所示:

default via 10.13.99.1 dev bond0.99
10.13.101.0/23 dev p1p1.101
128.1.66.227 via 10.13.101.1 dev p1p1.101
Run Code Online (Sandbox Code Playgroud)

set_fact我使用to对其执行上述附加操作found_added_routes。然后我调试:

- name: Debug found_route_list
  debug:
    msg: "Found route list: {{ item }}"
  loop: "{{ found_route_list }}"

- name: Debug found_added_routes
  debug:
    msg: "Found: {{ item }}"
  loop: "{{ found_added_routes }}"
Run Code Online (Sandbox Code Playgroud)

这是我的输出:

TASK [networks : Debug found_route_list] **********************************************************************************************************************
ok: [server01.example.com] => (item=default via 10.13.99.1 dev bond0.99) => {
    "msg": "Found route list: default via 10.13.99.1 dev bond0.99"
}
ok: [server01.example.com] => (item=10.13.101.0/24 dev p1p1.101) => {
    "msg": "Found route list: 10.13.101.0/24 dev p1p1.101"
}
ok: [server01.example.com] => (item=128.1.66.227 via 10.13.101.1 dev p1p1.101) => {
    "msg": "Found route list: 128.1.66.227 via 10.13.101.1 dev p1p1.101"
}

TASK [networks : Debug found_added_routes] ********************************************************************************************************************
fatal: [server01.example.com]: FAILED! => {"msg": "Invalid data passed to 'loop', it requires a list, got this instead:  [u'default via 10.13.99.1 dev bond0.99', u'10.13.101.0/24 dev p1p1.101', u'128.1.66.227 via 10.13.101.1 dev p1p1.101']. Hint: If you passed a list/dict of just one element, try adding wantlist=True to your lookup invocation or use q/query instead of lookup."}
Run Code Online (Sandbox Code Playgroud)

我尝试像这样创建列表,但得到相同的输出:

- name: Populate appended route list
  set_fact:
    found_added_routes: "{%- set blah = [] %}
        {%- for line in found_route_list %}
          {%- set _ = blah.append(line) %}
        {%- endfor %} 
      {{ blah }}"
Run Code Online (Sandbox Code Playgroud)

另外,我已经在 中看到了语法set_fact,您可以在其中执行以下操作:set_fact: |-但在我的一生中,我找不到任何文档或参考。你能给我指出一些可以解释它的东西吗?

谢谢。

Vla*_*tka 5

模板的结果始终是一个字符串。引用

Jinja 可以生成任何基于文本的格式...

看一下变量found_add_routes的类型

    - debug:
        var: found_added_routes|type_debug
Run Code Online (Sandbox Code Playgroud)

给出

  found_added_routes|type_debug: str
Run Code Online (Sandbox Code Playgroud)

该字符串是有效的 YAML。使用过滤器from_yaml并将字符串转换为列表。例如,

    - debug:
        var: item
      loop: "{{ found_added_routes|from_yaml }}"
Run Code Online (Sandbox Code Playgroud)

给出(删节)

  item: default via 10.13.99.1 dev bond0.99
  item: 10.13.101.0/24 dev p1p1.101
  item: 128.1.66.227 via 10.13.101.1 dev p1p1.101
Run Code Online (Sandbox Code Playgroud)