如何将部署的虚拟机(vmware_guest)的变量传递给角色以进行进一步配置

问题描述 投票:0回答:1

Ansible 新手,在使用 vmware_guest 新部署的虚拟机上运行角色时遇到困难。 尝试收集在某些角色中使用的变量,但这些似乎没有被转移。

我有这个剧本,可以部署并添加主机以进行进一步配置。 VM 部署正确。

如果有一些如何做到这一点的线索,我们将不胜感激。

---
- name: Deploy the VM
  hosts: localhost
  gather_facts: no

  tasks:
    - name: "Create VM from template"
      vmware_guest:
        validate_certs: false
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        datacenter: "{{ vcenter_datacenter }}"
        cluster: "{{ vm_cluster }}"
        template: "{{ vm_template }}"
        name: "{{ vm_name }}"
        folder: "{{ vm_folder }}"
        #annotation: " {{ creationdate }}"
        hardware:
          num_cpus: "{{ vm_hw_cpu_n }}"
          memory_mb: "{{ vm_hw_ram_mb }}"
        disk:
          - size_gb: "{{ vm_disk_gb }}"
            type: thin
            datastore: "{{ vm_datastore_cluster }}"
        networks:
          - name: "{{ vm_net_name }}"
            type: static
            device_type: vmxnet3
            ip: 172.16.100.123
            netmask: 255.255.255.0
            gateway: 172.16.100.1
            connected: true
            start_connected: true
        customization:
          hostname: "{{ vm_name }}.domain.invalid"
          domain: domain.invalid
          dns_servers:
            - 172.16.100.10
            - 172.16.100.11
          dns_suffix:
            - domain.invalid
        state: present
        #state: poweredon
        wait_for_ip_address: true
      register: vm_info

    - name: Add host to inventory
      ansible.builtin.add_host:
        name: "{{ vm_info.instance.ipv4 }}"
        groups: vmware_vms
     

- name: Run Additional Configurations
  hosts: vmware_vms
  roles:
    - role: base
      vars:
        var_vm_name: "{{ vm_name }}"
        var_vm_ip: "{{ vm_info.instance.ipv4 }}"
        var_vm_domain: "{{ vm_info.customization.domain }}"
        var_vm_fqdn: "{{ vm_info.customization.hostname }}"
        var_vm_dnsservers: "{{ vm_info.customization.dns_servers }}"

我收到的错误:

"msg": "AnsibleUndefinedVariable: 127.0.0.1       localhost\n127.0.1.1       {{ var_vm_name }}\n{{ var_vm_ip }} {{ var_vm_fqdn }} {{ var_vm_name }}\n\n# The following lines are desirable for IPv6 capable hosts\n::1     localhost ip6-localhost ip6-loopback\nff02::1 ip6-allnodes\nff02::2 ip6-allrouters\n: {{ vm_info.instance.ipv4 }}: 'vm_info' is undefined. 'vm_info' is undefined. {{ vm_info.instance.ipv4 }}: 'vm_info' is undefined. 'vm_info' is undefined. 127.0.0.1       localhost\n127.0.1.1       {{ var_vm_name }}\n{{ var_vm_ip }} {{ var_vm_fqdn }} {{ var_vm_name }}\n\n# The following lines are desirable for IPv6 capable hosts\n::1     localhost ip6-localhost ip6-loopback\nff02::1 ip6-allnodes\nff02::2 ip6-allrouters\n: {{ vm_info.instance.ipv4 }}: 'vm_info' is undefined. 'vm_info' is undefined. {{ vm_info.instance.ipv4 }}: 'vm_info' is undefined. 'vm_info' is undefined",
  "exception": "Traceback (most recent call last):\n  File \"/usr/lib/python3.9/site-packages/ansible/template/__init__.py\", line 1004, in do_template\n    res = myenv.concat(rf)\n  File \"/usr/lib/python3.9/site-packages/ansible/template/native_helpers.py\", line 83, in ansible_concat\n    return ''.join([to_text(v) for v in nodes])\n  File \"/usr/lib/python3.9/site-packages/ansible/template/native_helpers.py\", line 83, in <listcomp>\n    return ''.join([to_text(v) for v in nodes])\n  File \"<template>\", line 12, in root\n  File \"/usr/lib/python3.9/site-packages/ansible/template/__init__.py\", line 295, in wrapper\n    ret = func(*args, **kwargs)\n  File \"/usr/lib/python3.9/site-packages/ansible/template/__init__.py\", line 547, in _ansible_finalize\n    return thing if _fail_on_undefined(thing) is not None else ''\n  File \"/usr/lib/python3.9/site-packages/ansible/template/__init__.py\", line 519, in _fail_on_undefined\n    elif is_sequence(data):\n  File \"/usr/lib/python3.9/site-packages/ansible/module_utils/common/collections.py\", line 94, in is_sequence\n    if not include_strings and is_string(seq):\n  File \"/usr/lib/python3.9/site-packages/jinja2/runtime.py\", line 852, in _fail_with_undefined_error\n    raise self._undefined_exception(self._undefined_message)\nansible.errors.AnsibleUndefinedVariable: 127.0.0.1       localhost\n127.0.1.1       {{ var_vm_name }}\n{{ var_vm_ip }} {{ var_vm_fqdn }} {{ var_vm_name }}\n\n# The following lines are desirable for IPv6 capable hosts\n::1     localhost ip6-localhost ip6-loopback\nff02::1 ip6-allnodes\nff02::2 ip6-allrouters\n: {{ vm_info.instance.ipv4 }}: 'vm_info' is undefined. 'vm_info' is undefined. {{ vm_info.instance.ipv4 }}: 'vm_info' is undefined. 'vm_info' is undefined\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/usr/lib/python3.9/site-packages/ansible/plugins/action/template.py\", line 152, in run\n    resultant = templar.do_template(template_data, preserve_trailing_newlines=True, escape_backslashes=False, overrides=overrides)\n  File \"/usr/lib/python3.9/site-packages/ansible/template/__init__.py\", line 1038, in do_template\n    raise AnsibleUndefinedVariable(e, orig_exc=e)\nansible.errors.AnsibleUndefinedVariable: 127.0.0.1       localhost\n127.0.1.1       {{ var_vm_name }}\n{{ var_vm_ip }} {{ var_vm_fqdn }} {{ var_vm_name }}\n\n# The following lines are desirable for IPv6 capable hosts\n::1     localhost ip6-localhost ip6-loopback\nff02::1 ip6-allnodes\nff02::2 ip6-allrouters\n: {{ vm_info.instance.ipv4 }}: 'vm_info' is undefined. 'vm_info' is undefined. {{ vm_info.instance.ipv4 }}: 'vm_info' is undefined. 'vm_info' is undefined. 127.0.0.1       localhost\n127.0.1.1       {{ var_vm_name }}\n{{ var_vm_ip }} {{ var_vm_fqdn }} {{ var_vm_name }}\n\n# The following lines are desirable for IPv6 capable hosts\n::1     localhost ip6-localhost ip6-loopback\nff02::1 ip6-allnodes\nff02::2 ip6-allrouters\n: {{ vm_info.instance.ipv4 }}: 'vm_info' is undefined. 'vm_info' is undefined. {{ vm_info.instance.ipv4 }}: 'vm_info' is undefined. 'vm_info' is undefined\n",
  "_ansible_no_log": null,
  "changed": false

尝试了多种方法,但不确定我是否理解应该如何完成。

ansible vmware
1个回答
0
投票

您遇到变量委托/范围的问题。

让我解释一下: 例如在这个变量中:

var_vm_ip: "{{ vm_info.instance.ipv4 }}"

您在另一台主机上有此变量,而不是在当前主机上。考虑到第一个任务在“localhost”上执行,其余任务在库存组“vmware_vms”上执行。

我们该如何解决这个问题?使用:[主机变量][1] 首先,我会在第一个任务结束之前创建一个 set_fact 步骤,这样我们就可以更轻松地将变量传递给第二个任务:

- name: SetFact vminfo
      set_fact:
        vm_information: "{{ vm_info }}"
- name: Run Additional Configurations
  hosts: vmware_vms
  gather_facts: no
  roles:
    - role: base
      vars:
        var_vm_name: "{{ vm_name }}"
        var_vm_ip: "{{ hostvars['localhost'].vm_information.instance.ipv4 }}"
        var_vm_domain: "{{ hostvars['localhost'].vm_information.customization.domain }}"
        var_vm_fqdn: "{{ hostvars['localhost'].vm_information.customization.hostname }}"
        var_vm_dnsservers: "{{ hostvars['localhost'].vm_information.customization.dns_servers }}"

© www.soinside.com 2019 - 2024. All rights reserved.