2017-10-07 31 views
1

可以说我有类似下面如何在另一个剧本中使用定义的事实/变量?

- name: install nagios client 
    hosts: client1 
    roles: 
    - nagios-client 
    set_fact: 
    client_ip: "{{ ansible_default_ipv4.address }}" 
    client_hostname: "{{ ansible_hostname }}" 

- name: register client 
    hosts: server 
    vars: 
    - ip: {{ client_ip }} 
    - hostname: {{ client_hostname }} 
    role: 
    - register-nagios-client 

我知道set_fact被绑定到一个主机,不能在另一种使用,也可以得到事实{{ hostvars['client1']['ansible_eth0']['ipv4']['address'] }}客户端的IP一个剧本。但是有没有办法来定义一个局部变量,可以在yml文件的多个位置引用?

回答

1

事实是绑定到主机不玩,并保持为正在运行的剧本的生命定义。

您似乎已经知道如何引用来自其他主机的事实,请使用它。或者(如果你在第一个剧本保留set_fact):

vars: 
    - ip: "{{ hostvars['hostname'][client_ip] }}" 
    - hostname: "{{ hostvars['hostname'][client_hostname] }}" 

或(因为似乎没有必要设置的事实,第一次玩):

vars: 
    - ip: "{{ hostvars['hostname'][ansible_default_ipv4][address] }}" 
    - hostname: "{{ hostvars['hostname'][ansible_hostname] }}" 

我用hostname以上请参考你想要的主机。您的Playbook中的client1是一个主机组。它可能会或可能不匹配主机的名称。它也可能解析为多个主机。

+0

我只是想知道是否有一个自动的方式来使用第二个剧本的'client1'名称。像局部变量或可以在剧本中的一个地方定义并在多个地方引用的东西。 – pdna

+0

您的示例中的'client1'是主机组名称(主机模式)。它可能会解析为匹配组名的单个主机,单个主机不匹配组名或多个主机。您正在尝试解决XY问题。 – techraf

+0

在我的用例中,它只匹配单个主机(不是组)。 – pdna

相关问题