省略操作系统子网';Ansible中的s变量dns_名称服务器

省略操作系统子网';Ansible中的s变量dns_名称服务器,ansible,jinja2,Ansible,Jinja2,如果变量文件中没有出现值,我想从以下Openstack函数中省略dns_nameservers变量: os_subnet: cloud: "{{ item.cloud }}" state: present validate_certs: no no_gateway_ip: yes dns_nameservers: - "{{ item.dns | default(None) }}" enable_dhcp: yes

如果变量文件中没有出现值,我想从以下Openstack函数中省略dns_nameservers变量:

 os_subnet: 
     cloud: "{{ item.cloud }}" 
     state: present
     validate_certs: no
     no_gateway_ip: yes
     dns_nameservers: 
     - "{{ item.dns | default(None) }}"
     enable_dhcp: yes
     name: "{{ item.subnet }}"
     network_name: "{{ item.network }}"
     cidr: "{{ item.cidr }}"
     allocation_pool_start: "{{ item.allocation_pool_start }}"
     allocation_pool_end: "{{ item.allocation_pool_end }}"
     host_routes: "{{ item.host_routes | default(omit) }}" 
  with_items: 
  - "{{ subnets }}"
  tags: subnets
到目前为止,我一直试图用
|default(omit)
|default(None)
忽略它,但它不起作用。是否有任何过滤器可以提供帮助或其他方式

编辑:

变量文件:

- cloud: tenant1
  network: nw
  subnet: nw_subnet
  cidr: 172.12.17.64/26
  dns:
  - 8.8.8.8
  - 8.8.8.9
  allocation_pool_start: 172.12.17.68
  allocation_pool_end: 172.12.17.70
  host_routes:
  - destination: 0.0.0.0/0
    nexthop: 172.12.17.65
我得到以下错误:

原因:“[u'8.8.8.8',u'8.8.9']”不是有效的 名称服务器。”[u'8.8.8.8',u'8.8.8.9']'不是有效的 IP地址。\“,\”类型\“:\”HTTPBadRequest\“,\”详细信息\“:\”}


您想要传递一个包含单个元素的列表,或者传递一个
ommit
关键字(占位符对象),它告诉Ansible不要将整个参数(
dns\u nameservers
此处)传递给模块:

 dns_nameservers: "{{ [item.dns] if item.dns is defined else omit }}"


在您的示例中,如果未定义
item.dns
,则传递了一个列表,其中单个元素是
omit
占位符。在这种情况下,
dns\u nameservers
参数已定义(代码中硬编码的列表),行为未定义(可能取决于模块)。

感谢您的解释。如果我在dns_名称服务器中没有或只有一个元素,它确实可以工作,但是如果我有多个元素,我应该如何继续?在变量文件中,我已将dns定义为:
dns:-8.8.8
\n
-8.8.8.9
,但它没有以这种方式工作。我尝试过这种方式,但我遇到了一个错误。我已经用我正在尝试的变量文件和错误更新了我的问题。代码已按您的建议更改。我已修改语法以接受多个值;接受后,我将宣布答案有效