Nikita Spitsky
Nikita Spitsky

Reputation: 79

How to transfer variables to include playbook?

i have playbook, which have include. Also have var_prompt "name_VM" and i need transfer variable in include playbook "new-vm.yml", but i have error:

TASK [hostname] **************************************************************** fatal: [192.168.250.102]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: {{ name_VM }}: 'name_VM' is undefined\n\nThe error appears to have been in '/etc/ansible/playbooks/tasks/new-vm.yml': line 7, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n pre_tasks:\n - hostname:\n ^ here\n"}

How to transfer variables in pre_tasks include playbook?

Main playbook:

- hosts: localhost
  gather_facts: false
  connection: local
  become: true
  vars_files:
    - ../roles/vm-create/vars/am-default.yml
  vars_prompt:
    - name: "name_VM"
      prompt: "VM name:"
      private: no
      default: "vm001"

    - name: "size_hard"
      prompt: "Size hard disk (Gb)"
      private: no
      default: "16"

    - name: "size_memory"
      prompt: "Size memory (Mb)"
      private: no
      default: "2048"

    - name: "count_CPU"
      prompt: "Count CPU:"
      private: no
      default: "2"

  roles:
    - vm-create

  tasks:
    - include: tasks/check-ip.yml

- include: tasks/new-vm.yml

new-vm playbook:

- hosts: temp
  vars:
      ldap_server: ldap://ldap.example.com
      agent_server: zabbix.aexample.com
  pre_tasks:
    - hostname:
        name: "{{ name_vm }}"
  roles:
    - { role: zabbix-agent, tags: [ 'zabbix' ] }
    - { role: ldap-client, tags: [ 'ldap' ] }
    - { role: motd, tags: [ 'motd' ] }
  tasks:
    - telegram:
        token: 'bot12345:XXXXXX'
        chat_id: XXXXX
        msg: "New VM {{ ansible_hostname }} ({{ ansible_all_ipv4_addresses }}) is created and has been configured."
      tags:
        - telegram

check_ip.yml in which i add host:

- vsphere_guest:
    vcenter_hostname: "{{ vcenter_hostname }}"
    username: "{{ vcenter_user }}"
    password: "{{ vcenter_pass }}"
    guest: "{{ name_VM }}"
    vmware_guest_facts: yes
    validate_certs: no
  register: vsphere_facts
  until: vsphere_facts.ansible_facts.hw_eth0.ipaddresses[0] | match("192.168.250.")
  retries: 6
  delay: 10
- name: Ensure virtual machine is in the dynamic inventory
  add_host:
    name: "{{ vsphere_facts.ansible_facts.hw_eth0.ipaddresses[0] }}"
    ansible_user: root
    ansible_ssh_pass: pass
    groups: temp

Upvotes: 0

Views: 1108

Answers (1)

Konstantin Suvorov
Konstantin Suvorov

Reputation: 68319

In your case name_VM is play-bound and will not be visible from second play.

You need to assign a fact to temp host (I guess you use add_host somewhere inside vm-create role; so just add name_vm: "{{ name_VM }}" host fact there).
Then in second play you can access {{ name_vm }} host fact.

Update: example, based on question edit.

- name: Ensure virtual machine is in the dynamic inventory
  add_host:
    name: "{{ vsphere_facts.ansible_facts.hw_eth0.ipaddresses[0] }}"
    name_vm: "{{ name_VM }}"
    ansible_user: root
    ansible_ssh_pass: pass
    groups: temp

Upvotes: 2

Related Questions