らくがきちょう

なんとなく

Ansible で仮想マシンをクローンした際の電源状態を操作する

Ansible から vSphere ゲスト(仮想マシン)を操作するモジュールを使って仮想マシンを作成する際、電源の状態は state の定義を利用して制御します。 しかし、from_template を使ってテンプレートからクローンを実行した際は state を使って電源状態を制御することが出来ません。 from_template を使った場合の電源状態は(state では無く)power_on_after_clone を使います。

state の引数

state は下記の引数を取りえます。 但し前述の通り、from_template を使った場合は state が使えません。 実際に from_templatestate を同時に指定するとエラーになります。

  • present
  • powered_off
  • absent
  • powered_on
  • restarted
  • reconfigured

power_on_after_clone の引数

power_on_after_clone は下記の引数を取りえます。 from_template する場合は (state では無く) こちらの power_on_after_clone を使います。

  • yes
  • no

yes を指定した場合は電源オンに、no を指定した場合は電源オフになります。

Ansible モジュールの実装を見てみる

Ansible から仮想マシンを操作する部分のソースコードvphere_guest.py で公開されています。 from_template に関連する部分は以下のように定義されています。

        elif from_template:
            deploy_template(
                vsphere_client=viserver,
                esxi=esxi,
                resource_pool=resource_pool,
                guest=guest,
                template_src=template_src,
                module=module,
                cluster_name=cluster,
                snapshot_to_clone=snapshot_to_clone,
                power_on_after_clone=power_on_after_clone,
                vm_extra_config=vm_extra_config
            )

尚、statefrom_template を排他にするよう、定義しているのは以下部分のようです。

        mutually_exclusive=[['state', 'vmware_guest_facts'],['state', 'from_template']],

利用例

テンプレートから仮想マシンを作成しつつ、Inventory 中の power_on_after_clone 変数で電源状態を制御するサンプルは以下の通りです。

playbook

---
- hosts: all
  gather_facts: false
  connection: local
  user: remote
  sudo: true
  
  tasks:
    - vsphere_guest:
        validate_certs: false
        vcenter_hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_user }}"
        password: "{{ vcenter_pass }}"
        guest: "{{ inventory_hostname }}"
        power_on_after_clone: "{{ power_on_after_clone }}"
        from_template: yes
        template_src: "{{ template }}"
        cluster: "{{ cluster }}"
        vm_extra_config:
          folder: "{{ folder }}"
          notes: "{{ notes }}"
        esxi:
          datacenter: "{{ datacenter }}"
          hostname: "{{ esxi_host }}"

inventory

VM-1 ~ 3 という 3 台の仮想マシンを作成します。

[vms]
VM-[1:3]

[vms:vars]
vcenter_hostname     = '10.0.0.100'
vcenter_user         = 'administrator@vsphere.local'
vcenter_pass         = 'password'
cluster              = 'Cluster'
datacenter           = 'Datacenter'
esxi_host            = '10.0.0.101'
folder               = 'Folder'
notes                = 'Created by Ansible'
power_on_after_clone = 'no'
template             = 'CentOS7_template'