如何将数组分配给Ansible-Playbook中的变量

时间:2014-07-17 08:23:31

标签: ansible ansible-playbook

在剧本中我得到了以下代码:

---
- hosts: db
  vars:
    postgresql_ext_install_contrib: yes
    postgresql_pg_hba_passwd_hosts: ['10.129.181.241/32']
...

我想用{strong>我的所有网络服务器私有网址替换postgresql_pg_hba_passwd_hosts的值。我了解我可以在模板中获取this之类的值:

{% for host in groups['web'] %}
   {{ hostvars[host]['ansible_eth1']['ipv4']['address'] }}
{% endfor %}

将此循环的结果分配给剧本中的变量的最简单/最简单的方法是什么?或者,有没有更好的方法来收集这些信息?我应该把这个循环放在模板中吗?

其他挑战:我必须在每个条目中添加/32

5 个答案:

答案 0 :(得分:24)

您可以按set_fact和ansible filter plugin为变量分配列表。

将自定义过滤器插件放到 filter_plugins 目录中,如下所示:

(ansible top directory)
site.yml
hosts
filter_plugins/
    to_group_vars.py

to_group_vars.py 将hostvars转换为按组选择的列表。

from ansible import errors, runner
import json

def to_group_vars(host_vars, groups, target = 'all'):
    if type(host_vars) != runner.HostVars:
        raise errors.AnsibleFilterError("|failed expects a HostVars")

    if type(groups) != dict:
        raise errors.AnsibleFilterError("|failed expects a Dictionary")

    data = []
    for host in groups[target]:
        data.append(host_vars[host])
    return data

class FilterModule (object):
    def filters(self):
        return {"to_group_vars": to_group_vars}

像这样使用:

---
- hosts: all
  tasks:
  - set_fact:
      web_ips: "{{hostvars|to_group_vars(groups, 'web')|map(attribute='ansible_eth0.ipv4.address')|list }}"
  - debug:
      msg: "web ip is {{item}}/32"
    with_items: web_ips

答案 1 :(得分:9)

在剧本中:

vars:
     - arrayname:
        - name: itemname
          value1: itemvalue1
          value2: itemvalue2
        - name: otheritem
          value1: itemvalue3
          value2: itemvalue4
模板中的

:(示例是ini文件类型,包含节,键和值):

{% for item in arrayname %}
[{{ item.name }}]
key1 = {{ item.value1 }}
key2 = {{ item.value2 }}
{% endfor %}

这应该将模板呈现为:

[itemname]
key1 = itemvalue1
key2 = itemvalue2
[otheritem]
key1 = itemvalue3
key2 = itemvalue4

答案 2 :(得分:6)

变量可以表示为标准YAML结构,因此您可以为这样的键分配一个列表值:

---
- hosts: db
  vars:
    postgresql_ext_install_contrib: yes
    postgresql_pg_hba_passwd_hosts:
      - '10.129.181.241/32'
      - '1.2.3.0/8'

答案 3 :(得分:4)

您可以使用jinja2过滤器:

{{ groups['nodes']|map('extract', hostvars, ['ansible_eth1','ipv4', 'address']) |list }}

将返回ip地址列表。即。

---
- hosts: db
  vars:
    postgresql_ext_install_contrib: yes
    postgresql_pg_hba_passwd_hosts: {{ groups['nodes']|map('extract', hostvars, ['ansible_eth1','ipv4', 'address']) |list }}
...

不包括挑战(追加/32)。但它也应该以某种方式与jinja2过滤器。

Reqiures ansible version> = 2.1

答案 4 :(得分:0)

要向地址添加'/ 32',您可以使用Ansible ipaddr过滤器(converting to CIDR notation)。

$('.collapse').on('shown.bs.collapse', function() {
  $("a.secondaryAction").text('Read Less');
}).on('hidden.bs.collapse', function() {
  $("a.secondaryAction").text('Read More');
});