Мой сценарий 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 }}"
которую вы не цитировали).