在Ansible攻略中,我的第一个角色是在云平台中创建3个VM,第二个角色是在每个VM上执行几个设置任务。我需要将每个VM IP地址从角色1传递到角色2。
这是我的清单主机文件
[masters]
master.domain.tld
[workers]
worker1.domain.tld
worker2.domain.tld
[all:vars]
ansible_user=root
ansible_ssh_private_key_file=~/.ssh/id_rsa到目前为止,我设法注册了每个虚拟机IP,然后使用以下代码提取每个虚拟机IP:
......
register: hcloud_info
- debug:
msg: 'Hcloud IP address is {{ item.hcloud_server.ipv4_address }}'
with_items: "{{ hcloud_info.results }}"3个IP正确显示。
为了将VM in从角色1传递到角色2,我使用了使用add_host指令的内存清点:
- name: Add new servers to dynamic inventory
add_host:
name: "{{ item.hcloud_server.ipv4_address }}"
groups: new_servers
with_items: "{{ hcloud_info.results }}"现在,在第二个角色中,我需要访问内存清单中的数据,以提取每个虚拟机的公共IP,并使用以下代码片段将其(delegate_to: SERVER_PUBLIC_IP)分配给每个服务器:
- name: Apply private IP to master
hcloud_server_network:
api_token: "{{ hcloud_token }}"
network: priv_network
server: master.domain.tld
ip: 10.1.0.2
state: present
delegate_to: SERVER_PUBLIC_IP我一直试图在角色1中使用此代码,以将其传递给角色2,但出现了一个'hcloud_server' has no attribute error ...
- Name: Display IPs
debug: msg="{{ item.hcloud_server.ipv4_address }}"
with_items: "{{ groups.new_servers }}"发布于 2021-11-28 17:51:28
例如,获取主机的IP(从hcloud_info获取)
- hosts: workers
gather_facts: true
tasks:
- debug:
var: ansible_all_ipv4_addresses|firstok: [worker1.domain.tld] =>
ansible_all_ipv4_addresses|first: 10.1.0.61
ok: [worker2.domain.tld] =>
ansible_all_ipv4_addresses|first: 10.1.0.62在第一个角色中创建IP地址字典(使表达式_ip适合您的需要)
shell> cat roles/create-vm/tasks/main.yml
- set_fact:
my_ip: "{{ dict(ansible_play_batch|zip(_ip)) }}"
vars:
_ip: "{{ ansible_play_batch|
map('extract', hostvars, 'ansible_all_ipv4_addresses')|
map('first')|
list }}"
run_once: true给出
my_ip:
worker1.domain.tld: 10.1.0.61
worker2.domain.tld: 10.1.0.62在第二个角色中使用此词典
shell> cat roles/apply-ip-to-master/tasks/main.yml
- debug:
msg: "Apply {{ my_ip[inventory_hostname] }} to master"创建攻略
- hosts: workers
gather_facts: true
roles:
- create-vm
- apply-ip-to-master给出
ok: [worker1.domain.tld] =>
msg: Apply 10.1.0.61 to master
ok: [worker2.domain.tld] =>
msg: Apply 10.1.0.62 to master通过这种方式,您可以为每个worker“内网IP为master”,而不是委托任务。
https://stackoverflow.com/questions/70145290
复制相似问题