我想在 Ansible 剧本使用的 J2 模板中插入一个 IP 地址。该 IP 地址不是正在配置的主机的地址,而是完成配置的主机的 IP。到目前为止,我发现的所有内容都涵盖了使用与正在配置的主机相关的变量/事实。换句话说:我想插入的IP是['ansible_default_ipv4']['address']
执行时的IP ansible -m setup 127.0.0.1
。
我认为我可以使用本地剧本来编写包含 IP 的动态生成的模板文件,但我希望这可能是“Ansible 方式”。
我想在 Ansible 剧本使用的 J2 模板中插入一个 IP 地址。该 IP 地址不是正在配置的主机的地址,而是完成配置的主机的 IP。到目前为止,我发现的所有内容都涵盖了使用与正在配置的主机相关的变量/事实。换句话说:我想插入的IP是['ansible_default_ipv4']['address']
执行时的IP ansible -m setup 127.0.0.1
。
我认为我可以使用本地剧本来编写包含 IP 的动态生成的模板文件,但我希望这可能是“Ansible 方式”。
只需使用这个:
{{ ansible_env["SSH_CLIENT"].split()[0] }}
setup
您可以通过使用 alocal_action
或. 在本地运行模块来强制 Ansible 获取有关控制主机的事实delegate_to
。然后,您可以注册该输出并对其进行解析,也可以简单地使用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 }}
...
这就是我解决相同问题的方法(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
似乎像魅力一样工作。:-)