Автоматизация Ansible VMware с помощью lookup dig

В настоящее время я пытаюсь дополнительно автоматизировать автоматизацию VM, не включая IP-адрес в файл переменных. Я нашел модуль nslookup с помощью dig, но чувствую, что делаю это неправильно, например, вот файл переменных, который читается при создании для деталей:

# VMware Launch Variables

# If this is a test deployment you must ensure the vm is terminated after use.
vmname: agent5

esxi_datacenter: Datacenter
esxi_cluster: Cluster
esxi_datastore: ds1 # Do not change value.
esxi_template: template-v2
esxi_folder: agents # Folder must be pre-created

# Static IP Addresses
esxi_static_ip: "{{ lookup('dig', '{{ vmname }}.example.com.') }}"
esxi_netmask: 255.255.252.0
esxi_gateway: 10.0.0.1

Что я надеялся сделать с ними, так это просто получить «esxi_static_ip», но вытащил на лету из поиска с помощью dig. Это, однако, в его нынешнем состоянии не работает.

Происходит то, что виртуальная машина запускается без ipv4-адреса, либо чаще всего происходит сбой со следующей ошибкой:

fatal: [localhost -> localhost]: FAILED! => {"changed": false, "msg": "Failed to create a virtual machine : A specified parameter was not correct: spec.nicSettingMap.adapter.ip.ipAddress"}

Я получаю IP-адрес и передаю его, что работает, когда я жестко запрограммирую esxi_static_ip: в моем файле vmware-lanch-vars.yml. Однако, если я использую (включая примеры), это не удается.

newvm регистрируется, когда я запускаю свой плейбук vmware_guest.

- name: Make virtual machine IP persistant
  set_fact:
    newvm_ip_address: '{{ newvm.instance.ipv4 }}'

- name: Add host to in memory inventory
  add_host:
    hostname: "{{ newvm_ip_address }}"
    groups: just_created
    newvm_ip_address: "{{ newvm.instance.ipv4 }}"

Когда я запускаю с -vvvv, я вижу, что IP-адрес не подключен:

    "networks": [
        {
            "device_type": "vmxnet3",
            "gateway": "0.0.0.01",
            "ip": "",
            "name": "Network",
            "netmask": "255.255.252.0",
            "type": "static"
        }
    ],

ОБНОВЛЕНИЕ 3

Когда я создал простую пьесу, она работает, но не когда я помещаю ее в свой обычный поток, это работает ниже:

---
- hosts: localhost
  vars:
    vmname: "apim-sb-ng1-agent2"
    vm_dig_fqdn: "{{ vmname }}.example.com."
    esxi_static_ip: "{{ lookup('dig', vm_dig_fqdn) }}"

  tasks:
    - debug: msg="{{ esxi_static_ip }}" 

person Bryan Dobson    schedule 17.06.2020    source источник
comment
Пожалуйста, дайте точное определение не работает.   -  person Zeitounator    schedule 18.06.2020
comment
Мои извинения за отсутствие этой информации. Я добавил, что происходит, в том числе с использованием приведенных ниже примеров. Я надеялся, что так и будет, поскольку все запускаемые виртуальные машины имели статический IP-адрес, что это будет самый простой метод.   -  person Bryan Dobson    schedule 18.06.2020


Ответы (1)


Я не уверен, что это первая проблема, с которой вы столкнулись (см. мой комментарий выше), но ваше выражение шаблона jinja2 неверно.

Вы не можете использовать расширение выражения jinja2, если оно уже находится внутри расширения выражения jinja2.

В этом случае вам нужно объединить вашу переменную и строку с помощью оператора +:

esxi_static_ip: "{{ lookup('dig', vmname + '.example.com.') }}"

Если вы предпочитаете использовать расширение jinja2 везде, вы можете разделить его на разные переменные, например:

vm_dig_fqdn: "{{ vmname }}.example.com."
esxi_static_ip: "{{ lookup('dig', vm_dig_fqdn) }}"
person Zeitounator    schedule 18.06.2020
comment
Я обновил приведенный выше пример, чтобы показать, как я это делаю. Как указано, если я жестко запрограммирую IP-адрес в esxi_static_ip, он создаст экземпляр instance.ipv4, найденный в get_facts, и я передам его. Если я попробую динамический, этого не должно быть. - person Bryan Dobson; 18.06.2020
comment
В конце концов, это похоже на опечатку на моей стороне, теперь это работает со вторым примером. Большое спасибо. - person Bryan Dobson; 18.06.2020