Jinja2和ansible生成子目录的问题

Jinja2和ansible生成子目录的问题,ansible,yaml,jinja2,Ansible,Yaml,Jinja2,我需要读取一个具有不同IP的csv文件,并制作一个带有jinja2过滤器的字典,用于根据IPNumber值修改IP。yml文件类似于: - read_csv: path: vms.csv key: Number fieldnames: Name,IP1,IP2,IP3,IP4,IPNumber delimiter: ';' register: vms - name: vms to dict debug: msg: - {{'Name

我需要读取一个具有不同IP的csv文件,并制作一个带有jinja2过滤器的字典,用于根据IPNumber值修改IP。yml文件类似于:

- read_csv:
    path: vms.csv
    key: Number
    fieldnames: Name,IP1,IP2,IP3,IP4,IPNumber 
    delimiter: ';'
  register: vms

- name: vms to dict
  debug:
    msg:
      - {{'Name':{{ item.value.Name }},
          {% if item.value.IPNumber == "1" %}
          'IP':{{ item.value.IP1 }},
          {% endif %}
          {% if item.value.IPNumber ==  "2"%}
          'IP':{{ item.value.IP2 }},
          {% endif %}
          {% if item.value.IPNumber ==  "3"%}
          'IP':{{ item.value.IP3 }},
          {% endif %}
          {% if item.value.IPNumber ==  "4"%}
          'IP':{{ item.value.IP4 }},
          {% endif %}}}
  loop: "{{ vms.dict | dict2items }}"
  register: vms2
但我得到了一个错误:

The error appears to be in '/etc/ansible/roles/vms.yml': line 17, column 16, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

              'Name':{{ item.value.Name}},
              {% if item.value.IPNumber == "1" %}
               ^ here
我知道这是个语法问题,但我猜不出问题出在哪里


我需要一些帮助。

您应该只在
{{
{%
中放置变量/表达式。对我来说,
'Name'
看起来像普通文本,应该在外部

例如:

#注意调试消息开头和结尾的引号``符号
-调试:
味精:
-“名称:{{item.value.Name}},
{%if item.value.IPNumber==“1”%}
IP:{{item.value.IP1}}
#等等。。。
{%endif%}”

这至少应该解决错误消息。

以下任务应该根据您的要求在var中创建字典,您可以在其他地方重用。重命名
my\u ip\u dict
,以使其更适合您的项目

-name:创建我的IP字典
设定事实:
我的遗嘱:>-
{{
my_ip_dict|默认值({})
|组合({item.value.Name:item.value['IP'+item.value.IPNumber]})
}}
循环:{vms.dict | dict2items}”
-名称:检查结果:
调试:
var:我的遗嘱
请注意,通过根据
IPNumber
直接调用正确的字段,我删除了所有if/else结构。我想当然地认为它总是在有效范围内或其他现有
IP*
字段中有一个值。如果不是这样,您可以始终默认该值,例如
item.value['IP'+item.value.IPNumber]|默认值('N/A')