繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM