私のansibleスクリプトは、virshにvmをデプロイし、cobblerでそれらをインストールするために作成されています。 MACアドレスに固定されたIPアドレスを使用します。これを行うには、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
失敗したansibleプレイブックでは、変数は未定義のままになります。
- 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をそのまま引用した場合、質問はmuchより簡単になります(debug: var="{{ mac_address.stdout_lines }}"
引用しませんでした)。