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
以上。