在Jinja模板中使用Ansible控制主站的IP地址

时间:2015-11-27 11:32:00

标签: ansible ansible-facts

我想将一个IP地址插入到Ansible playbook使用的J2模板中。该IP地址正在配置的主机的地址,而是完成配置的主机的IP。到目前为止,我发现的所有内容都涵盖了与正在配置的主机相关的变量/事实。 换句话说:我要插入的IP是执行['ansible_default_ipv4']['address']ansible -m setup 127.0.0.1中的IP。

我认为我可以使用local playbook来编写一个包含IP的动态生成的模板文件,但我希望这可能是“Ansible方式”。

3 个答案:

答案 0 :(得分:1)

您可以通过使用setuplocal_action在本地运行delegate_to模块,强制Ansible获取有关控制主机的事实。然后,您可以注册该输出并对其进行解析,或者只需使用set_fact为其提供一个有用的名称,以便稍后在模板中使用。

示例游戏可能类似于:

   tasks:
    - name: setup
      setup:
      delegate_to: 127.0.0.1

    - name: set ansible control host IP fact
      set_fact:
        ansible_control_host_address: "{{ hostvars[inventory_hostname]['ansible_eth0']['ipv4']['address'] }}"
      delegate_to: 127.0.0.1

    - name: template file with ansible control host IP
      template:
        src: /path/to/template.j2
        dest: /path/to/destination/file

然后正常使用模板中的ansible_control_host_address变量:

...
Ansible control host IP: {{ ansible_control_host_address }}
...

答案 1 :(得分:1)

请使用:

{{ ansible_env["SSH_CLIENT"].split()[0] }}

答案 2 :(得分:0)

这就是我解决相同问题的方式(Ansible 2.7):

- name: Get local IP address
  setup:
  delegate_to: 127.0.0.1
  delegate_facts: yes

- name: Add to hosts file
  become: yes
  lineinfile:
    line: "{{ hostvars['127.0.0.1']['ansible_default_ipv4']['address'] }}   myhost"
    path: /etc/hosts

看起来像是一种魅力。 :-)