Ansible &引用;ScannerError:此处不允许映射值“;与jinja模板相关

Ansible &引用;ScannerError:此处不允许映射值“;与jinja模板相关,ansible,yaml,jinja2,Ansible,Yaml,Jinja2,我正在写一本Ansible剧本。在YAML文件“jinja.YAML”中,我有以下jinja2模板 {% set cnt = 0 %} {% for x in range(4, 20) %} {% for y in range(1, 251) %} - pool_name: pool_{{ cnt }} {% set cnt = cnt + 1 %} pool_member: 10.30.{{ x }}.{{ y }} {% en

我正在写一本Ansible剧本。在YAML文件“jinja.YAML”中,我有以下jinja2模板

{% set cnt = 0 %} 
{% for x in range(4, 20) %}
    {% for y in range(1, 251) %}
        - pool_name: pool_{{ cnt }}
          {% set cnt = cnt + 1 %}
          pool_member: 10.30.{{ x }}.{{ y }}
{% endfor %} {% endfor %}
以下是Ansilbe代码中的代码片段:

tasks:
    - name: XXX
      set_fact:
        members: "{{ lookup('template', 'jinja.yaml') | from_yaml}}"
当我运行Ansible playbook时,我收到以下错误消息:

 return loader.get_single_data()
  File "/usr/lib/python2.7/dist-packages/yaml/constructor.py", line 37, in get_single_data
    node = self.get_single_node()
  File "/usr/lib/python2.7/dist-packages/yaml/composer.py", line 36, in get_single_node
    document = self.compose_document()
  File "/usr/lib/python2.7/dist-packages/yaml/composer.py", line 55, in compose_document
    node = self.compose_node(None, None)
  File "/usr/lib/python2.7/dist-packages/yaml/composer.py", line 82, in compose_node
    node = self.compose_sequence_node(anchor)
  File "/usr/lib/python2.7/dist-packages/yaml/composer.py", line 111, in compose_sequence_node
    node.value.append(self.compose_node(node, index))
  File "/usr/lib/python2.7/dist-packages/yaml/composer.py", line 84, in compose_node
    node = self.compose_mapping_node(anchor)
  File "/usr/lib/python2.7/dist-packages/yaml/composer.py", line 127, in compose_mapping_node
    while not self.check_event(MappingEndEvent):
  File "/usr/lib/python2.7/dist-packages/yaml/parser.py", line 98, in check_event
    self.current_event = self.state()
  File "/usr/lib/python2.7/dist-packages/yaml/parser.py", line 428, in parse_block_mapping_key
    if self.check_token(KeyToken):
  File "/usr/lib/python2.7/dist-packages/yaml/scanner.py", line 116, in check_token
    self.fetch_more_tokens()
  File "/usr/lib/python2.7/dist-packages/yaml/scanner.py", line 220, in fetch_more_tokens
    return self.fetch_value()
  File "/usr/lib/python2.7/dist-packages/yaml/scanner.py", line 576, in fetch_value
    self.get_mark())
ScannerError: mapping values are not allowed here
  in "<unicode string>", line 2, column 32:
                        pool_member: 10.30.4.1
                                   ^

fatal: [10.6.177.160]: FAILED! => {
    "msg": "Unexpected failure during module execution.",
    "stdout": ""
}
返回加载器。获取单个数据()
文件“/usr/lib/python2.7/dist packages/yaml/constructor.py”,第37行,在get_single_数据中
node=self.get\u single\u node()
文件“/usr/lib/python2.7/dist packages/yaml/composer.py”,第36行,在get_single_节点中
document=self.compose_document()
文件“/usr/lib/python2.7/dist packages/yaml/composer.py”,第55行,在compose_文档中
node=self.compose\u节点(无,无)
文件“/usr/lib/python2.7/dist packages/yaml/composer.py”,第82行,在compose_节点中
节点=self.compose\u sequence\u节点(锚定)
文件“/usr/lib/python2.7/dist packages/yaml/composer.py”,第111行,在compose_sequence_节点中
node.value.append(self.compose_节点(节点,索引))
文件“/usr/lib/python2.7/dist packages/yaml/composer.py”,第84行,在compose_节点中
node=self.compose\u mapping\u节点(锚定)
文件“/usr/lib/python2.7/dist-packages/yaml/composer.py”,第127行,在compose\u-mapping\u节点中
而不是自我检查事件(MappingEndEvent):
文件“/usr/lib/python2.7/dist packages/yaml/parser.py”,第98行,在check_事件中
self.current_event=self.state()
文件“/usr/lib/python2.7/dist packages/yaml/parser.py”,第428行,在parse_block_mapping_键中
如果自校验令牌(KeyToken):
文件“/usr/lib/python2.7/dist packages/yaml/scanner.py”,第116行,在check_标记中
self.fetch\u更多\u令牌()
文件“/usr/lib/python2.7/dist packages/yaml/scanner.py”,第220行,在fetch\u more\u令牌中
返回self.fetch_值()
文件“/usr/lib/python2.7/dist packages/yaml/scanner.py”,第576行,在fetch_值中
self.get_mark())
ScannerError:此处不允许映射值
在“”第2行第32列中:
池_成员:10.30.4.1
^
致命:[10.6.177.160]:失败!=>{
“msg”:“模块执行期间出现意外故障。”,
“标准输出”:”
}
我99%确定这是jinja.yaml中的语法错误,但我没有修复它。任何帮助都可以
谢谢

你解决了错误的问题;如果您想要一个
list[dict]
,那么不要试图使用jinja模板构建yaml文本,只是为了稍后将其转换为您想要的实际数据结构:只需构建您想要的
list[dict]
,而不需要中间序列化:

- name: XXX
  set_fact:
    members: >-
     {%- set cnt_holder = {"cnt": 0} -%}
     {%- set results = [] -%} 
     {%- for x in range(4, 20) -%}
     {%- for y in range(1, 251) -%}
     {%- set _ = results.append({
        "pool_name": ("pool_%d" | format(cnt_holder.cnt)),
        "pool_member": ("10.30.%d.%d"|format(x, y)),
        }) -%}
     {%- set _ = cnt_holder.update({"cnt": cnt_holder.cnt + 1}) -%}
     {%- endfor -%}
     {%- endfor -%}
     {{ results }}

正如您将要观察到的,您的原始代码块有一个bug:无法重新分配变量(在像
for
循环这样的词法块中,这种情况会加倍);jinja2的“功能”实际上在

但是,您可以改变现有的数据结构(事实上,这就是
results.append
的要点)。因此,我们避开了jinja2的
set
行为,并将可变的
cnt
存储在一个全局dict中,以便对其进行变异。这就是我的
{%set cnt_holder
与您的语法不同的原因