我试图将一行与群集的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
答案 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(',') }}"