Назад | Перейти на главную страницу

Не определена командная переменная оболочки Ansible playbook

Мой сценарий ansible предназначен для развертывания виртуальных машин в virsh и их установки с помощью cobbler. Использование IP-адреса, закрепленного за MAC-адресом. Для этого нужен MAC-адрес. Но мне трудно получить вывод команды grep для регистрации как переменной mac_address. Переменная остается неопределенной.

При запуске команды ad-hoc все работает нормально:

[root@pxecobbler test]# ansible pirate.rum.local -m shell -a 'virsh 
domiflist testvm3 | grep -o -E "([0-9a-f]{2}:){5}([0-9a-f]{2})"' 
pirate.rum.local | SUCCESS | rc=0 >>
52:54:00:ec:a5:49

В доступной пьесе это не удается, переменная остается неопределенной:

- name: get MAC adres new VM
          shell: >
                  virsh domiflist {{ item.key }} | grep -o -E "([0-9a-f]{2}:){5}([0-9a-f]{2})"
          with_dict: "{{ guests }}"
          register: mac_address
        - debug:
          msg: "{{ mac_address }}"

сообщение об ошибке:

fatal: [pirate.rum.local]: FAILED! => {"msg": "The task includes an 
option with an undefined variable. 
The error was: 'dict object' has no attribute 'stdout_lines'\n\nThe 
error appears to have been in '/root/virsh-create-vm/virsh-create- 
vm.yml': line 47, column 7,
but may\nbe elsewhere in the file depending on the exact syntax 
problem.\n\nThe offending line appears to be:\n\n      
 register: mac_address\n    - debug: var=\"{{ mac_address.stdout_lines }}\"\n      
^ here\nWe could be wrong, but this one looks like it might be an issue with\nmissing quotes. 
Always quote template expression brackets when they\nstart a value. For instance:\n\n    with_items:\n      
- {{ foo }}\n\nShould be written as:\n\n    with_items:\n      - \"{{ foo }}\"\n\nexception type: 
<class 'ansible.errors.AnsibleUndefinedVariable'>\nexception: 'dict object' has no attribute 'stdout_lines'"}
to retry, use: --limit @/root/virsh-create-vm/virsh-create-vm.retry

весь сценарий:


- name: create VMs
  hosts: pirate.rum.local
  become: true
  vars_files:
    - vms.yml

  tasks:
    - name: get VM disks
      command: "ls {{ vm_location }}"
      register: disks
      changed_when: "disks.rc != 0"

    - name: create disk
      command: >
               qemu-img create -f qcow2 -o preallocation=metadata {{ vm_location }}/{{ item.key }}.qcow2 10G
      when: item.key not in disks.stdout
      with_dict: "{{ guests }}"

    - name: get list of VMs
      virt:
        command: "list_vms"
      register: vms

    - name: create vm
      command: >
                virt-install --name {{ item.key }}
               --memory {{ item.value.mem }} --vcpus {{ item.value.cpus }}
                --pxe --network network=nat,model=virtio \
                --disk {{ vm_location }}/{{ item.key }}.qcow2
               --noautoconsole --os-variant {{ item.value.os_type }}
      when: item.key not in vms.list_vms
      with_dict: "{{ guests }}"

    - name: get MAC adres new VM
      shell: >
              virsh domiflist {{ item.key }} | grep -o -E "([0-9a-f]{2}:){5}([0-9a-f]{2})"
      with_dict: "{{ guests }}"
      register: mac_address
    - debug:
        msg: "{{ mac_address }}"


  # new tasks sequence on PXECobbler
- name: Register new VM's on Cobbler PXE host
  hosts: pxecobbler.rum.local
  vars_files:
    - vms.yml

  tasks:
    - name: register new VM on PXE cobbler host mac {{ mac_address.stdout }}
      shell: >
              cobbler system add --name={{ item.key }} --profile=CentOS-7-x86_64  --interface=eth0 --mac={{ mac_address.stdout }}  --ip-address={{ item.value.ip }} --netboot-enabled=1 --static=1
      with_dict: "{{ guests }}"  

Когда ты говоришь with_dict это означает, что вы зацикливаетесь. С участием register: mac_address вы получаете не простой обычный объект, а массив, заполненный вашим циклом.

Попробуйте что-то вроде этого:

  # new tasks sequence on PXECobbler
- name: Register new VM's on Cobbler PXE host
  hosts: pxecobbler.rum.local
  vars_files:
    - vms.yml

  - shell: echo {{ item.changed }} {{ item.stdout }}     # will print: True 00:11:22:33:44
    with_items: "{{ mac_address.results }}"
    register: b
  - debug:
      msg: "{{ b }}"

В следующий раз, когда вы проиграете, обратите особое внимание на правильное выполнение действительно основных задач. Ваш вопрос был бы много проще, если вы указали свой фактический yml как есть (он содержал debug: var="{{ mac_address.stdout_lines }}" которую вы не цитировали).