2016-10-04 13 views
0

次の変数を使用してan-playbookコマンドを実行しました。変数を辞書キーとして使用しているときに、変数が拡張されました。

コマンド

ansible-playbook -vvv reconfig_vm.yml --extra-vars '{"disks":[{"name":"disk1","size_gb":"30","type":"thin","datastore":"nfs01"},{"name":"disk2","size_gb":"15","type":"thin","datastore":"nfs01"}}' 

してから、脚本を次のように作成。

脚本コンテンツ(reconfig_vm.yml)

..(omitted).. 
tasks: 
- name: reconfig VM Disk 
    local_action: 
     module: vsphere_guest 

      ..(omitted).. 

     vm_disk: 
     "{{ item.name }}": 
      size_gb: "{{ item.size_gb }}" 
      type: "{{ item.type }}" 
      datastore: "{{ item.datastore }}" 

        ..(omitted).. 

    with_items: "{{ disks }}" 

私はこの脚本を実行すると、私は結果を以下ました。

実行結果

failed: [localhost -> localhost] (item={u'size_gb': u'30', u'type':  u'thin', u'name': u'disk1', u'datastore': u'nfs01'}) => {"failed": true, "invocation": {"module_name": "vsphere_guest"}, "item": {"datastore": "nfs01", "name": "disk1", "size_gb": "30", "type": "thin"}, "module_stderr": "Traceback (most recent call last):\n File *..(omitted)..* ansible_module_vsphere_guest.py\", line 793, in update_disks\n hd.UnitNumber = int(disk_id)\nValueError: invalid literal for int() with base 10: '{{ item.name }}'\n", "module_stdout": "", "msg": "MODULE FAILURE", "parsed": false} 

質問

実行結果が "{{item.nameは}}" ハンドブックに私は--extraとして得た変数で置換されていないことを示し-vars。

  1. --extra-varsを辞書キーとして展開することをお考えですか?

  2. この問題を解決する方法はありますか?

ありがとうございます。まあ作品

コード(を解決)コンスタンチン・スヴォーロフの答えに

おかげで、私は最終的に私がやってみたかった仕事をするコードを作成しました。

@Playbookコンテンツ(reconfig_vm.yml)

tasks: 
- set_fact: 
    vm_disk_solo: "'{{ item.name }}':{'size_gb':'{{ item.size_gb }}','type':'{{ item.type }}','datastore':'{{ item.datastore }}'}" 
    with_items: "{{ vm.disks }}" 
    register: vm_disk_mul 

- set_fact: 
    vm_disks: "{ {{ vm_disk_mul.results | join(',',attribute='ansible_facts.vm_disk_solo') }} }" 


- name: reconfig VM Disk 
    local_action: 
    module: vsphere_guest 

    ..(omitted).. 

    vm_disk: "{{ vm_disks }}" 

答えて

1

最も簡単な方法は、適切な形式で余分-VARを渡すことです:

--extra-vars '{"disks":{"disk1":{"size_gb":"30","type":"thin","datastore":"nfs01"},"disk2":{"size_gb":"15","type":"thin","datastore":"nfs01"}}}' 

やループで必要とせずvm_disk: "{{ disks }}"を渡します。

リストをループする必要がある場合は、vsphere_guestを呼び出す前にいくつかのダイナミックファクトを設定する必要があります。 https://stackoverflow.com/a/37731028/2795592

+0

2番目のソリューションが機能します。私の場合、「ディスク」には複数の要素があるため、以下の変更を追加します。 vm_disk_solo:「 '{{item.name}}' { 'SIZE_GB':」set_fact - ハンドブックコンテンツ(reconfig_vm.yml) ==============で '{{item.datastore}}'} " with_items:" {{vm.disks}} "{{itemize_gb}} '、' type ':' {{item.type}} '、' datastore ' 登録:vm_disk_mul - set_fact: vm_disks: "{{{vm_disk_mul。結果| – Asayu

+0

実際には、あなたが私に言った最初の方法もうまくいきますが、 "vsphere_guest"の変更を伝播する可能性があります(この場合は、 "vsphere_guest "モジュールのインターフェイス(将来起こった場合)、私はあなたの2番目の方法を選択しました。 – Asayu

関連する問題