![](/img/trans.png)
[英]Access variable from one role in another role in an Ansible playbook with multiple hosts
[英]Passing an Ansible variable from one role to another
在 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
到目前为止,我设法使用以下代码注册并提取每个 VM IP:
......
register: hcloud_info
- debug:
msg: 'Hcloud IP address is {{ item.hcloud_server.ipv4_address }}'
with_items: "{{ hcloud_info.results }}"
正确显示 3 个 IP。
要将 VM IP 从角色 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 }}"
现在在第二个角色中,我需要访问内存清单中的数据以提取每个 VM 的公共 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 }}"
例如,获取主机的 IP(从hcloud_info 获取)
- hosts: workers
gather_facts: true
tasks:
- debug:
var: ansible_all_ipv4_addresses|first
ok: [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
这样,您可以为每个工作人员“将私有 IP 应用到 master”,而不是委派任务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.