在 Ansible 中循环列表变量

问题描述 投票:0回答:1

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

ansible redhat
1个回答
0
投票

您将变量包含在顶级“命名空间”中,其名称与包含文件中定义的第一个变量同名。因此,包含后,您的数据如下所示:

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
© www.soinside.com 2019 - 2024. All rights reserved.