Join this episode for more Stories from the EUC Road as Sean Donahue (Nutanix) and Al Solorzano (E360) tackle this all too familiar question. But does it have to an \u201cOR\u201d statement? Can you have an \u201cAND\u201d statement instead? Tune in to learn more about performance in EUC, happy employees and how you might sleep better at night in the age of Malware and Ransomware.<\/p><\/oembed>

Resources<\/p>

解决了

让uuid传递到Ansible


徽章

大家好,

我是Nutanix的新手,对Ansible的新手。我的任务是在需要它们的任何机器上更新 /安装宾客工具,并且他们更喜欢通过Ansible进行。

我希望能够让Ansible使用URI模块来获取给定VM的UUID,或获取UUID和相关VM的列表;但是,我在解析此信息时遇到了很多麻烦,以Ansible可以实际使用它。

有人对此有经验吗?还是至少可以告诉我,这样做有更好的方法?

谢谢!

图标

最好的答案CPatterson2019年12月2日,15:51

I have done this.\u00a0 The playbook below does it:\u00a0 :)<\/p>

It determines the UUID of a VM (myvm) and\u00a0powers it on.<\/p>

It also run\u00a0a couple scripts to start an Oracle database server on the VM which is a Linux host.\u00a0\u00a0f the VM is a Windows server you should use win_command instead of \u201ccommand\u201d.\u00a0 win_command is documented on the Ansible site here \u2192\u00a0https:\/\/docs.ansible.com\/ansible\/latest\/modules\/list_of_windows_modules.html<\/a><\/p>

\u00a0<\/p>

---

- name: Determine the UUID for VM myvm and power it on

\u00a0 # nutanixhostname is the name of the nutanix cluster as saved in \/etc\/ansible\/hosts

\u00a0 hosts: nutanixhostname

\u00a0 gather_facts: false

\u00a0 connection: local

\u00a0 vars:

\u00a0 \u00a0 # I use the v3 API to get the UUID and the v2 API to power on the VM

\u00a0 \u00a0 base_urlv2: \"https:\/\/ntnxb.irea.us:9440\/PrismGateway\/services\/rest\/v2.0\"

\u00a0 \u00a0 base_urlv3: \"https:\/\/ntnxb.irea.us:9440\/api\/nutanix\/v3\"

# \u00a0 Hard-coded Nutanix username and pasword

\u00a0 \u00a0 username: adminuser

\u00a0 \u00a0 password: adminoassword

# \u00a0 ALternatively, best practice is to retrieve the stored username and password

# \u00a0 \u00a0username: \"{{ lookup('env', 'ANSIBLE_USER') }}\"

# \u00a0 \u00a0password: \"{{ lookup('env', 'ANSIBLE_PASSWORD') }}\"<\/code><\/p>

\u00a0 tasks:

\u00a0 \u00a0 - name: Query Nutanix to get UUID of VM myvm

\u00a0 \u00a0 \u00a0 uri:

\u00a0 \u00a0 \u00a0 \u00a0 url: \"{{ base_urlv3 }}\/vms\/list\"

\u00a0 \u00a0 \u00a0 \u00a0 validate_certs: no

\u00a0 \u00a0 \u00a0 \u00a0 force_basic_auth: yes

\u00a0 \u00a0 \u00a0 \u00a0 method: POST

\u00a0 \u00a0 \u00a0 \u00a0 status_code: 200

\u00a0 \u00a0 \u00a0 \u00a0 user: \"{{ username }}\"

\u00a0 \u00a0 \u00a0 \u00a0 password: \"{{ password }}\"

\u00a0 \u00a0 \u00a0 \u00a0 return_content: yes

\u00a0 \u00a0 \u00a0 \u00a0 body_format: json

\u00a0 \u00a0 \u00a0 \u00a0 body:

\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 \u00a0# Important: \"myvm\" is case sensitive to be sure to specify the VM name as displayed in Prism ELement

\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 filter: \"vm_name==myvm\"

\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 kind: \"vm\"

\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sort_order: \"ASCENDING\"

\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 offset: 0

\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 length: 1

\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sort_attribute: \"//www.jhbzcj.com/next/how-it-works-22/\"

\u00a0 \u00a0 \u00a0 register: retvalq<\/code><\/p>

\u00a0 \u00a0 - name: Determine UUID for myvm

\u00a0 \u00a0 \u00a0 set_fact:

\u00a0\u00a0 \u00a0 \u00a0 \u00a0vm_uuid: \"{{ retvalq.json.entities[0].metadata.uuid }}\"<\/code><\/p>

\u00a0 \u00a0 - name: Start the VM

\u00a0 \u00a0 \u00a0 uri:

\u00a0 \u00a0 \u00a0 \u00a0 url: \"{{ base_urlv2 }}\/vms\/{{ vm_uuid }}\/set_power_state\"

\u00a0 \u00a0 \u00a0 \u00a0 validate_certs: no

\u00a0 \u00a0 \u00a0 \u00a0 force_basic_auth: yes

\u00a0 \u00a0 \u00a0 \u00a0 method: POST

\u00a0 \u00a0 \u00a0 \u00a0 status_code: 200,201

\u00a0 \u00a0 \u00a0 \u00a0 user: \"{{ username }}\"

\u00a0 \u00a0 \u00a0 \u00a0 password: \"{{ password }}\"

\u00a0 \u00a0 \u00a0 \u00a0 return_content: no

\u00a0 \u00a0 \u00a0 \u00a0 body_format: json

\u00a0 \u00a0 \u00a0 \u00a0 body:

\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 transition: \"ON\"

\u00a0 \u00a0 \u00a0 register: retvalp

\u00a0 \u00a0 - name: Wait 4 minutes for the VM to boot

\u00a0 \u00a0 \u00a0 pause:

\u00a0 \u00a0 \u00a0 \u00a0 seconds: 240<\/code><\/p>

- name: Start the Oracle database

\u00a0 hosts: myvm

\u00a0 gather_facts: true

\u00a0 become: yes

# \u00a0If you are using roles ...

# \u00a0roles:

# \u00a0 \u00a0- oradbhost

\u00a0 tasks: \u00a0 \u00a0

\u00a0 \u00a0 - name: Start the Oracle listener

\u00a0 \u00a0 \u00a0 command: \"sudo -i -u oracle \/oracle\/product\/11.2.0\/dbhome_1\/bin\/lsnrctl start\"

\u00a0 \u00a0 - name: Start the Oracle database

\u00a0 \u00a0 \u00a0 command: \"sudo -i -u oracle \/oracle\/localbin\/start_db mydatabase\"<\/code><\/p>","className":"post__content__best_answer"}">

查看原件

该主题已关闭以供评论

11个答复

UserLevel 6
徽章 +5

你好 @patw

你见过这个吗https://github.com/mattkeeler/ansible-nutanix-inventory/blob/master/nutanix.py

它有点旧,所以当然需要一些调整,但这可能是一个开始吗?

徽章

嘿,Alona,

我想我只是让这个脚本工作。但是,似乎它返回了JSON的样子,但实际上只是群集上所有VM中的一个巨型字符串。我知道这实际上只是我使用Ansible的局限性。但是我无法弄清楚如何理解输出,并且实际上可以使用它。

UserLevel 6
徽章 +5

@patw

很高兴听到有一些进展。也许尝试这个帖子nutanix动态库存脚本的Ansible并与其作者取得联系,以解决有关的问题?

UserLevel 4
徽章 +5

你好 @patw

也许您可以在此处发布输出片段,我们可以尝试解密和解析输出。
关于在多个VM上安装nutanix宾客工具的最初任务,也许您可​​以尝试读取此帖子。
https://next.nutanix.com/installation-configuration-configuration-23/ngt-series-install-ngt-ngt-on-multiple-vms-usis-using-rism-centrism-central-33591

徽章 +1

我做到了。下面的剧本做到了::)

它决定了VM(MyVM)的UUID并为其提供动力。

它还运行了几个脚本来在VM上启动Oracle数据库服务器,该服务器是Linux主机。f VM是Windows Server,您应该使用win_command而不是“命令”。win_command在此处的Ansible网站上进行了记录→https://docs.ansible.com/ansible/latest/modules/list_of_windows_modules.html

---

- 名称:确定VM MyVM的UUID并打开电源

#NutanixHostName是保存在/etc/ansible/hosts中的Nutanix群集的名称

主持人:nutanixhostname

gather_facts:false

连接:本地

vars:

#我使用V3 API使UUID和V2 API在VM上供电

base_urlv2:“ https://ntnxb.irea.us:9440/prismgateway/services/rest/rest/v2.0”

base_urlv3:“ https://ntnxb.irea.us:9440/api/nutanix/v3”

#硬编码的nutanix用户名和pasword

用户名:管理员

密码:AdminoAssword

#另外,最佳实践是检索存储的用户名和密码

#用户名:“ {{lookup('envy','ansible_user')}}}”

#密码:“ {{lookup('envy','ansible_password')}}}”

任务:

- 名称:查询nutanix可以获取vm myvm的UUID

URI:

URL:“ {{base_urlv3}}/vms/list”

validate_certs:否

force_basic_auth:是的

方法:帖子

status_code:200

用户:“ {{用户名}}”

密码:“ {{passwass}}”

return_content:是的

Body_Format:JSON

身体:

#重要:“ myVM”对案例敏感,确保指定Prism元素中显示的VM名称

过滤器:“ vm_name == myvm”

善良:“ VM”

sort_order:“上升”

偏移:0

长度:1

sort_attribute:“”

注册:retvalq

- 名称:确定myVM的UUID

set_fact:

vm_uuid:“ {{retvalq.json.entities [0] .metadata.uuid}}}”

- 名称:启动VM

URI:

url:“ {{base_urlv2}}/vms/{{vm_uuid}}}/set_power_state”

validate_certs:否

force_basic_auth:是的

方法:帖子

status_code:200,201

用户:“ {{用户名}}”

密码:“ {{passwass}}”

return_content:否

Body_Format:JSON

身体:

过渡:“ on”

注册:retvalp

- 名称:等待4分钟以启动VM

暂停:

秒:240

- 名称:启动Oracle数据库

主持人:myVM

gather_facts:true

成为:是的

#如果您正在使用角色...

#角色:

# - Oradbhost

任务:

- 名称:启动Oracle侦听器

命令:“ sudo -i -u oracle/oracle/product/11.2.0/dbhome_1/bin/lsnrctl开始”

- 名称:启动Oracle数据库

命令:“ sudo -i -u oracle/oracle/localbin/start_db mydatabase”

徽章

感谢大家的回答 - @cpatterson,该剧本非常有帮助。我在弄清楚如何通过API呼叫将信息回来的信息弄清楚的信息时遇到了很多麻烦。

我希望能够一次对付许多机器,因此,我不必在本地或群集上运行它,而是根据VM库存运行剧本,并使用Magic Contingrore变量传递VM名称:

身体:
过滤器:“ vm_name == {{invoctory_hostname}}”
善良:“ VM”
sort_order:“上升”

不幸的是,尽管我认为最初仍然必须通过OS分开VM;由于Windows和Linux的连接参数不同。我尚未找到使用Nutanix API或PowerShell CMDLET列举客座操作系统的方法。

谢谢!

徽章

不确定这是在这篇文章中还是在另一篇中进行,但是我找不到有关此错误代码的任何信息…

当我将上述剧本与他们交付上述剧本时,有少数VM正在计时。这是错误代码:

致命:[testvm1]:失败!=> {“更改”:false,“ content”:“”,“ msg”:“状态代码为-1而不是[200]:请求失败:“ out>”,“重定向”:false,'状态”:-1,“ url”:“ https://vipcluster1.domain.com:9440/api/nutanix/nutanix/v3/vms/list”}

无论API调用将成功返回还是使用上面的错误代码,似乎大约50/50。我试图发现有效的差异与无能为力的差异,但什么都看不到。

有任何想法吗?

谢谢!

徽章 +1

我认为Ansible不会拾取嵌入式库存_hostName值。更改您的过滤器,并尝试一下:

过滤器:“ vm_name ==” {{invoctory_hostname}}””

如果不起作用,您也可能会尝试以下内容:

过滤器:vm_name ==” {{intervory_hostname}}”

另请确保将以下内容包括在体内,因为API需要它们:

偏移:0
长度:1
sort_atributes:“”

徽章

因此,由于它有一些可用于的VM,而有些则不适,所以我觉得它一定不能是主机名的语法?同样,我尝试了您建议的方式,并且仍然获得相同的“ -1状态代码”。这是所讨论的任务,在此步骤中会发生什么:

任务:
- 名称:查询获取UUID
URI:
URL:“ {{base_urlv3}}/vms/list”
validate_certs:否
force_basic_auth:是的
方法:帖子
status_code:200
用户:“ {{用户名}}”
密码:“ {{passwass}}”
return_content:是的
Body_Format:JSON
身体:
过滤器:“ vm_name == {{invoctory_hostname}}”
善良:“ VM”
sort_order:“上升”
偏移:0
长度:1
sort_attribute:“”
注册:retvalq
标签:查询
任务[查询获取uuid] ************************************************************************************************************************************2019年12月3日,星期二08:12:22 -0500(0:00:01.408)0:00:01.496 ******
确定:[Testmachine01]
确定:[Testmachine02]
致命:[Testmachine03]:失败!=> {“更改”:false,“ content”:“”,“ msg”:“状态代码为-1而不是[200]:请求失败:“ out>”,“重定向”:false,'状态”:-1,“ url”:“ https://vipcluster1.vtinfo.com:9440/api/nutanix/nutanix/v3/vms/list”}

我想我只是不明白为什么它适用于某些VM,而其他VM则不起作用……API呼吁“征税”,因此如果您尝试一次击中太多次,它会超时?我还确保所有VM的情况与Prism中的内容相匹配。

徽章 +1

/etc/ansible/hosts中的主机名是否与Nutanix中的VM名称完全匹配?喜欢案吗?

徽章

是的;我直接从Nutanix拿出库存,还仔细检查了棱镜。它为特定的VM提供了此状态代码(我想这实际上只是一段时间吗?)。我猜想这些VM的配置必须有问题。

Learn more about our cookies.<\/a>","cookiepolicy.button":"Accept cookies","cookiepolicy.button.deny":"Deny all","cookiepolicy.link":"Cookie settings","cookiepolicy.modal.title":"Cookie settings","cookiepolicy.modal.content":"We use 3 different kinds of cookies. You can choose which cookies you want to accept. We need basic cookies to make this site work, therefore these are the minimum you can select. Learn more about our cookies.<\/a>","cookiepolicy.modal.level1":"Basic
Functional","cookiepolicy.modal.level2":"Normal
Functional + analytics","cookiepolicy.modal.level3":"Complete
Functional + analytics + social media + embedded videos"}}}">
Baidu