我正在制作一个ansible脚本,其中一个变量文件将保存服务器列表,在其中循环并关闭它们。看来Ansible正在将我的列表更改为字符串,但也许我错了。
我尝试使用“循环”,“ with_items”,并将它们放在同一行上。 serverA和ServerB确实存在
文件目录:
taskName/vars/ServerListA.yaml
taskName/tasks/main.yaml
taskName/tasks/shutdown.yaml
ServerListA.yaml:
---
evenServers:
- serverB
- serverA
main.yaml:
---
- import_tasks: shutdown.yaml
shutdown.yaml:
---
- name: get vars
include_vars:
file: ServerListA.yaml
name: evenServers
- name: shutdown guest
vmware_guest_powerstate:
hostname: virtualCenterName
state: powered-on
username: user
name: "{{ item }}"
password: pass
validate_certs: no
loop:
- "{{ evenServers }}"
输出:
任务[vCenter_Infra_HA_Test:关机的来宾] ****************************************************** ****************************************************** ***** [警告]:值{'evenServers':['serverA','serverB']}(类型 dict)在字符串字段中被转换为u“ {'evenServers':['serverA', 'serverB']}“(类型字符串)。如果这看起来不像您 期望,引用整个值以确保其不变。
失败:[localServer](项目= {u'evenServers':[u'serverA”, u'serverB']})=> {“ ansible_loop_var”:“ item”,“ changed”:false, “ item”:{“ evenServers”:[“ serverA”,“ serverB”]},“ msg”:“无法设置 不存在的虚拟机的电源状态:'{'evenServers': ['serverA','serverB']}'“}
答案 0 :(得分:0)
您正在将var包含在顶级“名称空间”内,该名称与您所包含文件中定义的第一个var的名称相同。因此,包含之后,您的数据如下所示:
evenServers:
evenServers:
- serverA
- serverB
由于ansible无法遍历第一级哈希(没有任何其他指令),因此它将其转换为字符串表示形式以供使用。
您应该像这样从任务文件进行转换:
---
- name: get vars
include_vars:
file: ServerListA.yaml
- name: shutdown guest
vmware_guest_powerstate:
hostname: virtualCenterName
state: powered-on
username: user
name: "{{ item }}"
password: pass
validate_certs: no
loop: "{{ evenServers }}"
我还建议您修复var文件中的缩进
---
evenServers:
- serverB
- serverA