我正在制作一个 ansible 脚本,其中变量文件将保存服务器列表,我将在其中循环并关闭它们。 Ansible 似乎正在将我的列表更改为字符串,但也许我错了。
我尝试过使用“loop”、“with_items”,并将它们放在同一行。 serverA 和 ServerB 确实存在
文件目录:
taskName/vars/ServerListA.yaml
taskName/tasks/main.yaml
taskName/tasks/shutdown.yaml
服务器列表A.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] (item={u'evenServers': [u'serverA', u'serverB']}) => {"ansible_loop_var": "item", "changed": false, "item": {"evenServers": ["serverA", "serverB"]}, "msg": "无法设置 不存在的虚拟机的电源状态:'{'evenServers': ['服务器A','服务器B']}'"}
您将变量包含在顶级“命名空间”中,其名称与包含文件中定义的第一个变量同名。因此,包含后,您的数据如下所示:
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