循环打印IP地址

时间:2019-03-28 14:55:23

标签: ansible

我试图将一行与群集的IP地址放在一起:

set_fact: nodelist={%for host in groups['proxmox-cluster']%}"{{hostvars[host].ansible_all_ipv4_addresses|string}}"{% if not loop.last %},{% endif %}{% endfor %}

但是当我尝试将此行放入文件中时

 lineinfile:
        path: "/etc/security/access.conf"
        line: "+:root:{{ nodelist }}"

我得到:

  

“ [u'192.168.31.238']”,“ [u'192.168.31.248']”,“ [u'192.168.31.252']”,“ [u'192.168.31.250',u'192.168.1.250 ',u'192.168.32.250',u'192.168.33.250']“

代替

  

192.168.31.238、192.168.31.248、192.168.31.252、192.168.31.250、192.168.1.250、192.168.32.250、192.168.33.250

3 个答案:

答案 0 :(得分:0)

在下面尝试更简单的版本

LDAPAttributesContextHolder

答案 1 :(得分:0)

尝试对 lineinfile 模块中的 nodelist 变量进行过滤:

lineinfile:
  path: "/etc/security/access.conf"
  line: "{{ nodelist | join(',') }}"

答案 2 :(得分:0)

其原因是hostvars[host].ansible_all_ipv4_addresses是一个数组。这就是为什么要在数组"[u'192.168.31.238']","[u'192.168.31.248']"...

中打印连接的字符串列表的原因

如果您只想打印默认的ipv4地址,则可以将hostvars表达式替换为:

hostvars[host].ansible_default_ipv4.address

如果要打印地址总列表中的第一个地址,可以将hostvars表达式替换为:

hostvars[host].ansible_all_ipv4_addresses | first

如果要包括来自 all 主机的 all 个IP地址,则需要两个循环。可以使用Jinja2模板语法,聪明的过滤器链或同时使用两者来完成。例如,用jinja2循环和过滤器的组合替换整个表达式将为您提供

{% for host in groups['proxmox-cluster'] %}"{{ hostvars[host].ansible_all_ipv4_addresses | join(',') }}"{% if not loop.last %},{% endif %}{% endfor %}

我个人试图避免在可完成的任务/剧本中混用Jinja2模板语法。通常,仅使用过滤器链是一种更清洁的方法。例如,您可能会执行以下操作:

- name: Print ips in access.conf
  lineinfile:
    path:  /etc/security/access.conf
    line: "{{ groups['proxmox-cluster'] 
            | map('extract', hostvars, 'ansible_default_ipv4')
            | map(attribute='address')
            | join(',') }}"