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
尝试了多种方法,但不确定我是否理解应该如何完成。
您遇到变量委托/范围的问题。
让我解释一下: 例如在这个变量中:
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 }}"