この投稿はAnsible 2 Advent Calendar 2019(通称裏アドベントカレンダー?)の9日めの記事です。
1週間全部俺の2回目です!
今回のネタはVMware環境の情報を収集するfactsやinfoモジュールの一部に実装されている properties
について紹介します。
propertiesを使うと何がいいかと言うと、自分の取得したい情報を自由に取得することが可能です。
ここではvmware_guest_infoを例にして説明します。
通常実行
propertiesを指定しないで通常実行してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
--- - name: Get VM information hosts: localhost gather_facts: no vars: hostname: vcenter-test01.local username: administrator@vsphere.local password: password tasks: - vmware_guest_info: hostname: "{{ hostname }}" username: "{{ username }}" password: "{{ password }}" validate_certs: no datacenter: DC folder: /vm/TenantA name: VM01 register: vm_info - debug: var=vm_info |
実行してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# ansible-playbook main.yml [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' PLAY [Clone VM from template] **************************************************************************************************************************************** TASK [vmware_guest_info] ********************************************************************************************************************************************* ok: [localhost] TASK [debug] ********************************************************************************************************************************************************* ok: [localhost] => { "vm_info": { "changed": false, "failed": false, "instance": { "annotation": "", "current_snapshot": null, "customvalues": {}, "guest_consolidation_needed": false, "guest_question": null, "guest_tools_status": "guestToolsNotRunning", "guest_tools_version": "10336", (snip) |
propertiesを指定しない場合は、このようにモジュールで定められた標準項目のみが取得できます。
ただ、運用しているとこれだけの情報だけでは足りない時があります。
そこで標準項目外のものを取得したい場合はpropertiesパラメーターを使用します。
propertiesを使う
propertiesを使う場合はschemaにvsphereを指定してpropertiesに取得したい対象のプロパティを指定します。
ここではconfigオブジェクトのいくつかのプロパティを取得してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
--- - name: Get VM information hosts: localhost gather_facts: no vars: hostname: vcenter-test01.local username: administrator@vsphere.local password: password tasks: - vmware_guest_info: hostname: "{{ hostname }}" username: "{{ username }}" password: "{{ password }}" validate_certs: no datacenter: DC folder: /vm/TenantA name: VM01 schema: vsphere properties: - config.name - config.guestFullName - config.version register: vm_info - debug: var=vm_info |
実行してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# ansible-playbook main.yml [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' PLAY [Get VM information] ******************************************************************************************************************************************** TASK [vmware_guest_info] ********************************************************************************************************************************************* ok: [localhost] TASK [debug] ********************************************************************************************************************************************************* ok: [localhost] => { "vm_info": { "changed": false, "failed": false, "instance": { "config": { "guestFullName": "CentOS 7 (64-bit)", "name": "VM01", "version": "vmx-14" } } } } PLAY RECAP *********************************************************************************************************************************************************** localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
指定したプロパティの情報が取得できたのが確認できます 🙂
propertiesって何が指定できるの?と思った方がいるかもしれないので簡単に説明したいと思います。
VMwareモジュールはSOAP APIを使ってやりとりをしており、VMなどはオブジェクトとして扱います。
次のようなイメージです。
オブジェクトにはプロパティが存在しているので、そのオブジェクトのプロパティの階層をpropertiesに指定してあげれば値が取得できます。
6.7の全プロパティについては以下を参照してください。
とは言っても、オブジェクトはオブジェクトの中にオブジェクトが存在するネスト構造なので複雑です。
実際に開発している人はピンときますが、それ以外の人がドキュメント見ただけでは「なるほど。よくわからん」になるかもしれません。
どうすればいいってのさ
と、言うことで一先ず簡単に階層のイメージができるよう次のツールを使ってみます。
インストール方法は上記ページを参照してください。
一先ず実行してVM01の仮想マシンのconfig情報を見てみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# ./mob-property-view.py -vc vcenter-test01.local --mob VirtualMachine -t VM01 | less Password: # vCenterのユーザーパスワードを入力 (snip) ---------- | config | ---------- (vim.vm.ConfigInfo) { dynamicType = <unset>, dynamicProperty = (vmodl.DynamicProperty) [], changeVersion = '2019-12-06T23:02:58.975195Z', modified = 1970-01-01T00:00:00Z, name = 'VM01', guestFullName = 'CentOS 7 (64-bit)', version = 'vmx-14', (snip) |
これを見るとconfigオブジェクトのnameプロパティには VM01
が存在します。
また guestFullName
プロパティには CentOS 7 (64-bit)
が存在します。
なのでpropertiesでこの情報を取得したい場合は
1 2 3 4 |
properties: - config.name - config.guestFullName |
となるわけです。
他にも見てみましょう。以下はsummaryオブジェクトの中身を表示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# ./mob-property-view.py -vc vcenter-test01.local --mob VirtualMachine -t VM01 | less Password: # vCenterのユーザーパスワードを入力 (snip) ----------- | summary | ----------- (vim.vm.Summary) { dynamicType = <unset>, dynamicProperty = (vmodl.DynamicProperty) [], vm = 'vim.VirtualMachine:vm-366', (snip) guest = (vim.vm.Summary.GuestSummary) { dynamicType = <unset>, dynamicProperty = (vmodl.DynamicProperty) [], guestId = <unset>, guestFullName = <unset>, toolsStatus = 'toolsNotRunning', (snip) |
例えば、VMware Toolsのステータスを取得したい場合は
1 2 3 |
properties: - summary.guest.toolsStatus |
となるわけです。
こんな感じで標準では取得できないものも拡張して取得することができます。
応用編
これを使うと何がうれしいかというと次のようなレポートが作れます。
また、CMDBへの情報登録用や棚卸用のレポート、既存の設定確認などでも使えます。
便利ですね 🙂
是非使ってみてください。
と、言うことで2回目は以上です!次!