web-dev-qa-db-ja.com

Ansibleプレイブックのシェルコマンド変数が未定義です

私の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 }}"  
1
Ewt

あなたが言う時 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 }}"引用しませんでした)。

0
kubanczyk