在Ansable中遍历列表变量

时间:2019-08-09 16:45:31

标签: ansible redhat

我正在制作一个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']}'“}

1 个答案:

答案 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