从多个citrix虚拟机监控程序vm';s使用ansible
我正在使用ansible和xenserver_guest_info模块创建citrix hypervisor服务器上多个虚拟机的ip地址列表。目前,我只想打印一个ip列表,但将这些ip存储在一个易读列表中会更好。我计划循环浏览这个ip列表,并使用ansible在所有这些vm上运行命令 这是我目前的ansible剧本。它通过xenserver模块返回的字典输出进行循环,试图提取ip地址:从多个citrix虚拟机监控程序vm';s使用ansible,ansible,citrix,xen,hypervisor,Ansible,Citrix,Xen,Hypervisor,我正在使用ansible和xenserver_guest_info模块创建citrix hypervisor服务器上多个虚拟机的ip地址列表。目前,我只想打印一个ip列表,但将这些ip存储在一个易读列表中会更好。我计划循环浏览这个ip列表,并使用ansible在所有这些vm上运行命令 这是我目前的ansible剧本。它通过xenserver模块返回的字典输出进行循环,试图提取ip地址: - name: Manage VMs connection: local hosts: localho
- name: Manage VMs
connection: local
hosts: localhost
# Hypervisor server info from vars file
vars_files:
- xen_vars.yml
tasks:
- name: Gather facts
xenserver_guest_info:
hostname: "{{ xen_address}}"
username: "{{ admin_username }}"
password: "{{ admin_password }}"
name: "{{ item }}"
loop: "{{ xen_machines }}"
register: facts
# - name: Get IP's of VM's
- debug:
msg: "{{item.instance.networks}}"
loop: "{{facts.results}}"
给定我的服务器上两个vm的列表,它将生成以下输出:
PLAY [Manage VMs] **************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Gather facts] ************************************************************
ok: [localhost] => (item=Ubuntu 20)
ok: [localhost] => (item=Ubuntu 20 2)
TASK [debug] *******************************************************************
ok: [localhost] => (item={'failed': False, 'changed': False, 'instance': {'state': 'poweredoff', 'name': 'Ubuntu 20', 'name_desc': '', 'uuid': 'cf5db672-67cf-7e8c-6951-f5959ab62e26', 'is_template': False, 'folder': '', 'hardware': {'num_cpus': 1, 'num_cpu_cores_per_socket': 1, 'memory_mb': 1024}, 'disks': [{'size': 21474836480, 'name': 'Ubuntu 20 0', 'name_desc': 'Created by template provisioner', 'sr': 'Local storage', 'sr_uuid': 'd7bb817b-281e-fd9c-33a3-54db8935d596', 'os_device': 'xvda', 'vbd_userdevice': '0'}], 'cdrom': {'type': 'iso', 'iso_name': 'ubuntu-20.04.1-desktop-amd64.iso'}, 'networks': [{'name': 'Pool-wide network associated with eth0', 'mac': 'a2:07:be:29:5f:ad', 'vif_device': '0', 'mtu': '1500', 'ip': '', 'prefix': '', 'netmask': '', 'gateway': '', 'ip6': [], 'prefix6': '', 'gateway6': ''}], 'home_server': 'citrix-mwyqyqaa', 'domid': '-1', 'platform': {'timeoffset': '0', 'videoram': '8', 'hpet': 'true', 'secureboot': 'false', 'device-model': 'qemu-upstream-compat', 'apic': 'true', 'device_id': '0001', 'vga': 'std', 'nx': 'true', 'pae': 'true', 'viridian': 'false', 'acpi': '1'}, 'other_config': {'base_template_name': 'Ubuntu Focal Fossa 20.04', 'import_task': 'OpaqueRef:3b6061a0-a204-4ed4-be20-842a359a70fa', 'mac_seed': 'f6ae87b5-2f00-0717-559e-8b624fe92f35', 'install-methods': 'cdrom,nfs,http,ftp', 'linux_template': 'true'}, 'xenstore_data': {'vm-data': '', 'vm-data/mmio-hole-size': '268435456'}, 'customization_agent': 'custom'}, 'invocation': {'module_args': {'hostname': '192.168.0.187', 'username': 'root', 'password': 'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER', 'name': 'Ubuntu 20', 'validate_certs': True, 'uuid': None}}, 'item': 'Ubuntu 20', 'ansible_loop_var': 'item'}) => {
"msg": [
{
"gateway": "",
"gateway6": "",
"ip": "192.168.0.2",
"ip6": [],
"mac": "a2:07:be:29:5f:ad",
"mtu": "1500",
"name": "Pool-wide network associated with eth0",
"netmask": "",
"prefix": "",
"prefix6": "",
"vif_device": "0"
}
]
}
ok: [localhost] => (item={'failed': False, 'changed': False, 'instance': {'state': 'poweredoff', 'name': 'Ubuntu 20 2', 'name_desc': '', 'uuid': 'b087832e-81f1-c091-1363-8b8ba8442c8e', 'is_template': False, 'folder': '', 'hardware': {'num_cpus': 1, 'num_cpu_cores_per_socket': 1, 'memory_mb': 1024}, 'disks': [{'size': 21474836480, 'name': 'Ubuntu 20 0', 'name_desc': 'Created by template provisioner', 'sr': 'Local storage', 'sr_uuid': 'd7bb817b-281e-fd9c-33a3-54db8935d596', 'os_device': 'xvda', 'vbd_userdevice': '0'}], 'cdrom': {'type': 'iso', 'iso_name': 'ubuntu-20.04.1-desktop-amd64.iso'}, 'networks': [{'name': 'Pool-wide network associated with eth0', 'mac': 'e6:cd:ca:ff:c3:e0', 'vif_device': '0', 'mtu': '1500', 'ip': '', 'prefix': '', 'netmask': '', 'gateway': '', 'ip6': [], 'prefix6': '', 'gateway6': ''}], 'home_server': 'citrix-mwyqyqaa', 'domid': '-1', 'platform': {'timeoffset': '0', 'videoram': '8', 'hpet': 'true', 'secureboot': 'false', 'device-model': 'qemu-upstream-compat', 'apic': 'true', 'device_id': '0001', 'vga': 'std', 'nx': 'true', 'pae': 'true', 'viridian': 'false', 'acpi': '1'}, 'other_config': {'base_template_name': 'Ubuntu Focal Fossa 20.04', 'import_task': 'OpaqueRef:3b6061a0-a204-4ed4-be20-842a359a70fa', 'mac_seed': '3c56a628-0f68-34f9-fe98-4bf2214a5891', 'install-methods': 'cdrom,nfs,http,ftp', 'linux_template': 'true'}, 'xenstore_data': {'vm-data': '', 'vm-data/mmio-hole-size': '268435456'}, 'customization_agent': 'custom'}, 'invocation': {'module_args': {'hostname': '192.168.0.187', 'username': 'root', 'password': 'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER', 'name': 'Ubuntu 20 2', 'validate_certs': True, 'uuid': None}}, 'item': 'Ubuntu 20 2', 'ansible_loop_var': 'item'}) => {
"msg": [
{
"gateway": "",
"gateway6": "",
"ip": "192.168.0.3",
"ip6": [],
"mac": "e6:cd:ca:ff:c3:e0",
"mtu": "1500",
"name": "Pool-wide network associated with eth0",
"netmask": "",
"prefix": "",
"prefix6": "",
"vif_device": "0"
}
]
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
我尝试只访问ip,但由于它存储在一个列表中,所以一直无法正常工作
同样,我的最终目标是让ansible列出一个ip列表,如下所示:
192.168.0.2
192.168.0.3
或者最好将它们存储在一个可供以后使用的列表中。任何帮助都将不胜感激。如果您遇到的唯一真正问题是IP位于列表中,并且您知道(由于您配置虚拟机的方式),该列表始终只有一个条目,那么只需获取列表中的第一项:
item.instance.networks[0].ip
如果您想使用这些IP地址在虚拟机上做一些简单的工作,我建议您使用为剧本中的第二个剧本建立一个新的目录:
-名称:管理虚拟机
连接:本地
主机:本地主机
#vars文件中的虚拟机监控程序服务器信息
vars_文件:
-xen_vars.yml
任务:
-名称:收集事实
xenserver\u来宾\u信息:
主机名:“{xen_address}”
用户名:“{admin_username}”
密码:{{admin_password}}
名称:“{{item}}”
循环:“{xen_machines}”
登记册:事实
#-名称:获取虚拟机的IP
-调试:
msg:“{item.instance.networks[0].ip}”
循环:“{facts.results}”
-名称:构建虚拟机清单
添加\u主机:
名称:“{item.instance.networks[0].ip}”
组别:越南船民
#如果需要,可以在此处为每个主机添加其他变量
循环:“{xen_machines}”
回路控制:
标签:“{item.instance.name}”
-名称:直接向虚拟机执行任务
主机:vms#这是您刚刚创建的组
连接:ssh
任务:
-调试:
msg:{{来自虚拟机的你好}}”
下面的任务
-设置事实:
ips:{{facts.results|
json_查询('[].instance.networks[].ip')}”
-调试:
变量:ips
应该给
ips:
- 192.168.0.2
- 192.168.0.3
您说“我尝试只访问ip”,但您没有展示如何尝试访问它。您还注意到,它们存储在一个列表中-如果您的一个虚拟机有多个网络接口(因此有多个IP地址),您想做什么?@lxop我设置了虚拟机,它们都有一个网络接口。至于访问ip,我的意思是我在yaml剧本中做了一个“item.instance.networks.ip”,这就抛出了一个错误。这是因为ip字段存储在一个列表中,该列表也需要遍历。我真的不知道如何在ansible中实现这一点。