Ansible playbook - 带有变量和ip过滤器的set_fact中的语法 - centos7

时间:2018-03-27 02:06:11

标签: ansible

在centos7中,我试图定义一个远程主机,其中IP是后端或前端IP 然后我订购了IPADDR过滤器并且存在一些障碍。

例如,

# {{ ansible_all_ipv4.addresses | ipaddr('192.168.0.0/22') }}
['192.168.1.2', '192.168.2.2']

# {{ ansible_all_ipv4.addresses | ipaddr('192.168.1.0/24') }}
['192.168.1.2']

就我而言,由于在VM中有两个不同的IP,如192.168.56.101和172.16.1.10,我想通过变量预先定义网络和前缀来获取192.168.56.101。然后我设置:

[defaults/main.yml]
backend:
 network: 192.168.56.0
 prefix: 24

[tasks/main.yml]
- debug: var="{{item}}"
  with_items:
   - "ansible_all_ipv4_addresses|ipaddr('''{{backend.network}}/{{backend.prefix}}''')"

result: 
TASK [test : debug] ************************************************************
ok: [localhost] => (item=ansible_all_ipv4_addresses|ipaddr('''192.168.56.0/24''')) => {
    "ansible_all_ipv4_addresses|ipaddr('''192.168.56.0/24''')": [
        "192.168.56.101"    <------ THAT IS WHAT I WANT
    ], 
    "changed": false, 
    "item": "ansible_all_ipv4_addresses|ipaddr('''192.168.56.0/24''')"

然后我尝试设置事实并导出结果,这不是我想要的。

- name: define backend ip
  set_fact:  backendIP="{{ item }}"
  with_items:
   - "ansible_all_ipv4_addresses|ipaddr('''{{network}}/{{prefix}}''')"

- debug: var=backendIP

result:
TASK [test : define backend ip] ***********************************************************
ok: [localhost] => (item=ansible_all_ipv4_addresses|ipaddr('''192.168.56.0/24'''))

TASK [test : debug] ************************************************************
ok: [localhost] => {
    "backendIP": "ansible_all_ipv4_addresses|ipaddr('''192.168.56.0/24''')"

那么如何通过这种情况设置变量

1 个答案:

答案 0 :(得分:1)

由于您需要单个结果,因此不需要任何循环。

这就是你想要的(如果你确定你的过滤器匹配一个地址):

set_fact:
  backend: "{{ ansible_all_ipv4_addresses|ipaddr(backend.network + '/' + backend.prefix|string) }}"