49345


現在、ansibleでyamlを使って、playbookを記載しています。  
サンプルをうまく使って、動かすことはできているのですが、yamlの書き方について以下の点を質問させてください。

■質問事項1  
たとえば以下のようなplaybookがある場合に、文頭に「-(ハイフン)」がつくものと付かないものがあります。  
調べるとシーケンスという考え方らしいのですが、「ハイフン」をつけるときとつけないときをどのように決めればいいのかおしえていただけないでしょうか。

以下、サンプル。  
「- name」となっていたり、「- size」となっているところが該当箇所になります。

[code]

    - name: Create a virtual machine on given ESXi hostname
    vmware_guest:
    hostname: "{{ vcenter_ip }}"
    username: "{{ vcenter_username }}"
    password: "{{ vcenter_password }}"
    validate_certs: False
    folder: /DC1/vm/
    name: test_vm_0001
    state: poweredon
    guest_id: centos64Guest
    esxi_hostname: "{{ esxi_hostname }}"
    disk:
    - size_gb: 10
    type: thin
    datastore: datastore1
    hardware:
    memory_mb: 512
    num_cpus: 4
    scsi: paravirtual
    networks:
    - name: VM Network
    mac: aa:bb:dd:aa:00:14
    ip: 10.10.10.100
    netmask: 255.255.255.0
    device_type: vmxnet3
    wait_for_ip_address: yes
    delegate_to: localhost
    register: deploy_vm
    
[/code]

以上です、よろしくおねがいいたします。


CC BY-SA 4.0
2018-10-16T06:03:19.750
49342
2018-10-16T09:55:00.417
2018-10-16T09:55:00.417
3054
30543
question
ansible 構成管理 yaml
ansibleのyamlでplaybookを作成した際の、各モジュールの頭にハイフンを付ける基準について


YAMLにおいて、行頭の`-`は **リスト** （配列）を表します。リストは、複数のものを並べるための記法です。

質問者さんのYAMLドキュメントを正しくインデントすると以下のようになります。これは全体として、[vmware_guestモジュール](https://docs.ansible.com/ansible/latest/modules/vmware_guest_module.html)を実行するタスク`Create
a virtual machine on given ESXi hostname`を定義するものであることが分かります。

[code]

    - name: Create a virtual machine on given ESXi hostname
      vmware_guest:
        hostname: "{{ vcenter_ip }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: False
        folder: /DC1/vm/
        name: test_vm_0001
        state: poweredon
        guest_id: centos64Guest
        esxi_hostname: "{{ esxi_hostname }}"
        disk:
          - size_gb: 10
            type: thin
            datastore: datastore1
        hardware:
          memory_mb: 512
          num_cpus: 4
          scsi: paravirtual
        networks:
          - name: VM Network
            mac: aa:bb:dd:aa:00:14
            ip: 10.10.10.100
            netmask: 255.255.255.0
            device_type: vmxnet3
        wait_for_ip_address: yes
      delegate_to: localhost
      register: deploy_vm
    
[/code]

`hostname`や`username`以下、たくさんのオプションが`vmware_guest`モジュールへのオプションとして渡されていることが分かります。

モジュールのオプションの中には、 **リスト**
で指定すべきものがあります。この例では`disk`と`networks`が該当します。実際、例えば`disk`については、上記のリファレンスから引用すると次のように書いてあり、リストを指定する必要があることが分かります。

> A **list** of disks to add.  
>  This parameter is case sensitive.
>
> （後略，強調は引用者）

この例では、`disk`の下にある`-`は1つですから、以下に示す1つのオブジェクトだけからなるリストを渡していることになります。

[code]

    size_gb: 10
    type: thin
    datastore: datastore1
    
[/code]

例えば2つのディスクが必要ならば、次のようにリスト記法を用いて指定することになります。`-`を先頭とする2つの行は、それぞれのオブジェクトの先頭となっていることが分かります。

[code]

    disk:
      - size_gb: 10
        type: thin
        datastore: datastore1
      - size_mb: 500
        type: thin
        datastore: datastore2
    
[/code]

下のほうにある`networks`についても同様で、これも`-`が1つだけであることから、以下のオブジェクト1つからなるリストです。

[code]

    name: VM Network
    mac: aa:bb:dd:aa:00:14
    ip: 10.10.10.100
    netmask: 255.255.255.0
    device_type: vmxnet3
    
[/code]

もし2つ以上のネットワークが必要ならば、上と同様に`-`を先頭とする複数のオブジェクトを並べればよいことになります。

* * *

> 「ハイフン」をつけるときとつけないときをどのように決めればいいのかおしえていただけないでしょうか。

という質問に対する答えとしては、使用したいモジュール（今回の場合はvmware_guest）のどのオプションにリストを渡すべきなのかを、ドキュメントを頼りに調べましょう、ということになります。

* * *

なお、一番最初の行（`- name: Create a virtual machine on given ESXi
hostname`）の行頭にもハイフンがありますが、これも当然リストの記法です。というのも、このファイルはタスクの **リスト**
を記述しなければいけないからです。今回定義されているタスクは1つだけですが、複数のタスクを定義する場合はやはりリストの記法を用いてタスクを並べていくことになります。


CC BY-SA 4.0
2018-10-16T07:09:17.630
49345
2018-10-16T07:25:55.920
2018-10-16T07:25:55.920
30079
30079
49342
answer