NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

Nutanix UVM の Description フィールドを Tag 欄として利用してみる。(Ansible)

Nutanix の Prism Element では、仮想マシンにタグやカテゴリを付与できません。そこで、ためしに仮想マシンの Description フィールドにタグのようなものを記載してみます。ただし、本来であれば Prism Central でカテゴリを利用するはずなので、バッド プラクティスかなと思います。

今回の内容です。

今回の環境

今回は、Nutanix CE 2.0 を利用しています。

Ansible は、Nutanix DevStation から実行しています。

Ansible のバージョンです。

vscode ➜ /workspaces/nutanix-devstation (main) $ ansible --version
ansible [core 2.14.6]
  config file = None
  configured module search path = ['/home/vscode/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.11/site-packages/ansible
  ansible collection location = /home/vscode/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.11.4 (main, Jun  7 2023, 18:32:58) [GCC 10.2.1 20210110] (/usr/local/bin/python)
  jinja version = 3.0.3
  libyaml = True

Nutanix の Ansible Collection(nutanix.ncp)は、DevStation にデフォルトでインストールされるものを利用します。

vscode ➜ /workspaces/nutanix-devstation (main) $ ansible-galaxy collection list nutanix.ncp

# /home/vscode/.ansible/collections/ansible_collections
Collection  Version
----------- -------
nutanix.ncp 1.8.0  

DevStation での様子です。

Ansible Playbook の作成

タグを仮想マシンの Description に設定する Playbook は、下記のように作成しました。

  • 9~11行目: Prism Element のログイン情報を設定
  • 15行目: 設定対象の仮想マシン名を指定(この Playbook では、仮想マシン名の重複はない想定にしています)
  • 16~19行目: 3つのタグを設定する(env: dev、app: web、cmdb: id-12345)
  • 30行目~: タグのディクショナリを、1行の文字列に変換
  • 45行目~: 対象 仮想マシンの UUID を取得。55行目で 1台に絞っている。
  • 65行目~: 仮想マシンの Description(desc)を更新

gist.github.com

タグを仮想マシンの Description 取得する Playbook です。

  • 15行目: 設定対象の仮想マシン名を指定(この Playbook も、仮想マシン名の重複はない想定にしています)
  • 50行目~: Description の文字列を、ディクショナリに変換
  • 63行目~: 「env=dev」(env: dev)タグがあれば、「test-ok」を表示

gist.github.com

Ansible Playbook の実行

Prism Element で、仮想マシン「vm01」の Description が、まだ空欄であることを確認しておきます。

Description へのタグ文字列の設定

Playbook を実行します。

$ ansible-playbook vm_set_desc.yml 

実行すると、下記のようになります。

vscode ➜ /workspaces/nutanix-devstation (main) $ ansible-playbook vm_set_desc.yml 
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not
match 'all'

PLAY [Set VM Description-Tags] ************************************************************************************

TASK [Set VM Name] ************************************************************************************************
ok: [localhost]

TASK [Output vm_desc_tags (to set)] *******************************************************************************
ok: [localhost] => {
    "vm_desc_tags": {
        "app": "web",
        "cmdb": "id-12345",
        "env": "dev"
    }
}

TASK [Convert vm_desc_tags (dict to list)] ************************************************************************
ok: [localhost] => (item={'key': 'env', 'value': 'dev'})
ok: [localhost] => (item={'key': 'app', 'value': 'web'})
ok: [localhost] => (item={'key': 'cmdb', 'value': 'id-12345'})

TASK [Convert vm_desc_tags (list to string)] **********************************************************************
ok: [localhost]

TASK [Output vm_desc_tags string (for VM desc)] *******************************************************************
ok: [localhost] => {
    "tags_string": "env=dev, app=web, cmdb=id-12345"
}

TASK [Get VM info by vm_name] *************************************************************************************
ok: [localhost]

TASK [Get VM UUID] ************************************************************************************************
ok: [localhost]

TASK [Output VM Info (Original)] **********************************************************************************
ok: [localhost] => {
    "result.response.entities[0].spec.description": "VARIABLE IS NOT DEFINED!"
}

TASK [Output VM UUID] *********************************************************************************************
ok: [localhost] => {
    "vm_uuid": "b547604b-7b5a-407b-b878-1dd34881ffd8"
}

TASK [Update VM] **************************************************************************************************
changed: [localhost]

PLAY RECAP ********************************************************************************************************
localhost                  : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

仮想マシン「vm01」の Description に、Playbook で定義していた Tag 文字列が設定されました。

Description のタグ文字列の取得

Description に記入したタグを取得する Playbook を実行してみます。

$ ansible-playbook vm_get_desc.yml 

実際に実行してみると下記のようになります。「env:dev」タグが見つかり、「test-ok」と表示されています。

vscode ➜ /workspaces/nutanix-devstation (main) $ ansible-playbook vm_get_desc.yml 
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not
match 'all'

PLAY [Get VM Description-Tags] ************************************************************************************

TASK [Set VM Name] ************************************************************************************************
ok: [localhost]

TASK [Get VM info by vm_name] *************************************************************************************
ok: [localhost]

TASK [Get VM UUID] ************************************************************************************************
ok: [localhost]

TASK [Get description (from VM)] **********************************************************************************
ok: [localhost]

TASK [Output VM UUID] *********************************************************************************************
ok: [localhost] => {
    "vm_uuid": "b547604b-7b5a-407b-b878-1dd34881ffd8"
}

TASK [Output VM desc] *********************************************************************************************
ok: [localhost] => {
    "tags": "env=dev, app=web, cmdb=id-12345"
}

TASK [Output tags] ************************************************************************************************
ok: [localhost] => {
    "tags": "env=dev, app=web, cmdb=id-12345"
}

TASK [Split description (from VM desc)] ***************************************************************************
ok: [localhost]

TASK [Convert tags (list to dict)] ********************************************************************************
ok: [localhost] => (item=env=dev)
ok: [localhost] => (item=app=web)
ok: [localhost] => (item=cmdb=id-12345)

TASK [Output the dict] ********************************************************************************************
ok: [localhost] => {
    "dict_tag": {
        "app": "web",
        "cmdb": "id-12345",
        "env": "dev"
    }
}

TASK [Test VM-Tag (env=dev)] **************************************************************************************
ok: [localhost] => {
    "msg": "test-ok"
}

PLAY RECAP ********************************************************************************************************
localhost                  : ok=11   changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

以上。

©2023 gowatana
クリエイティブ・コモンズ・ライセンスこの 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。