首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Ansible变量从一个角色传递到另一个角色

将Ansible变量从一个角色传递到另一个角色
EN

Stack Overflow用户
提问于 2021-11-28 16:18:07
回答 1查看 38关注 0票数 0

在Ansible攻略中,我的第一个角色是在云平台中创建3个VM,第二个角色是在每个VM上执行几个设置任务。我需要将每个VM IP地址从角色1传递到角色2。

这是我的清单主机文件

代码语言:javascript
复制
[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:

代码语言:javascript
复制
......
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指令的内存清点:

代码语言:javascript
复制
- 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)分配给每个服务器:

代码语言:javascript
复制
- 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 ...

代码语言:javascript
复制
- Name: Display IPs
  debug: msg="{{ item.hcloud_server.ipv4_address }}"
  with_items: "{{ groups.new_servers }}"
EN

回答 1

Stack Overflow用户

发布于 2021-11-28 17:51:28

例如,获取主机的IP(从hcloud_info获取)

代码语言:javascript
复制
- hosts: workers
  gather_facts: true
  tasks:
  - debug:
      var: ansible_all_ipv4_addresses|first
代码语言:javascript
复制
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适合您的需要)

代码语言:javascript
复制
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

给出

代码语言:javascript
复制
  my_ip:
    worker1.domain.tld: 10.1.0.61
    worker2.domain.tld: 10.1.0.62

在第二个角色中使用此词典

代码语言:javascript
复制
shell> cat roles/apply-ip-to-master/tasks/main.yml
- debug:
    msg: "Apply {{ my_ip[inventory_hostname] }} to master"

创建攻略

代码语言:javascript
复制
- hosts: workers
  gather_facts: true
  roles:
    - create-vm
    - apply-ip-to-master

给出

代码语言:javascript
复制
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”,而不是委托任务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70145290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档