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)を更新
タグを仮想マシンの Description 取得する Playbook です。
- 15行目: 設定対象の仮想マシン名を指定(この Playbook も、仮想マシン名の重複はない想定にしています)
- 50行目~: Description の文字列を、ディクショナリに変換
- 63行目~: 「env=dev」(env: dev)タグがあれば、「test-ok」を表示
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
以上。
