调用第二个剧本时如何将 Ansible 剧本切换到另一个主机

How to switch Ansible playbook to another host when calling second playbook

我有两个 playbook - 我的第一个 playbook 在 ESXi 服务器列表上迭代获取所有 VM 的列表,然后将该列表传递给第二个 playbook,它应该在 VM 的 IP 上迭代。相反,它仍在尝试在最后一个 ESXi 服务器上执行。我必须将主机切换到我当前传递给第二个剧本的那个 VM IP。不知道如何切换...有人吗?

第一个剧本:

- name: get VM list from ESXi
  hosts: all

  tasks:
  - name: get facts
    vmware_vm_facts:
      hostname: "{{ inventory_hostname }}"
      username: "{{ ansible_ssh_user }}"
      password: "{{ ansible_ssh_pass }}"
    delegate_to: localhost
    register: esx_facts

  - name: Debugging data
    debug:
      msg: "IP of {{ item.key }} is {{ item.value.ip_address }} and is {{ item.value.power_state }}"
    with_dict: "{{ esx_facts.virtual_machines }}"

  - name: Passing data to include file
    include: includeFile.yml ip_address="{{ item.value.ip_address }}"
    with_dict: "{{ esx_facts.virtual_machines }}"

我的第二本剧本:

- name: <<Check the IP received
  debug:
    msg: "Received IP: {{ ip_address }}"

- name: <<Get custom facts
  vmware_vm_facts:
    hostname: "{{ ip_address }}"
    username: root
    password: passw
    validate_certs: False
  delegate_to: localhost
  register: custom_facts

我确实收到了正确的 VM ip_address,但 vmware_vm_facts 仍在尝试 运行 在 ESXi 服务器上代替...

如果您无力为 VM 设置动态清单,您的剧本应该有两个剧本:一个用于收集 VM 的 IP,另一个用于该 VM 上的任务,如下所示(伪代码):

---
- hosts: hypervisors
  gather_facts: no
  connection: local
  tasks:
    - vmware_vm_facts:
        ... params_here ...
      register: vmfacts
    - add_host:
        name: "{{ item.key }}"
        ansible_host: "{{ item.value.ip_address }}"
        group: myvms
      with_dict: "{{ vmfacts.virtual_machines }}"

- hosts: myvms
  tasks:
    - apt:
        name: "*"
        state: latest

在第一个游戏中,我们从每个管理程序收集事实并填充 myvms 组内存清单。在第二场比赛中,我们 运行 aptmyvms 组中的每个主机模块。