首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在无法执行的任务中,在条件中使用变量和项

在无法执行的任务中,在条件中使用变量和项
EN

Stack Overflow用户
提问于 2022-08-04 06:03:03
回答 2查看 300关注 0票数 0

我使用下面的剧本来捕获vmware数据中心信息,它运行良好,没有任何问题:

代码语言:javascript
复制
---
- hosts: localhost
  vars_files: 1credentials.yml
  tasks:
    - name: Gather information about all datacenters
      community.vmware.vmware_datacenter_info:
        hostname: '{{ vcenter_hostname }}'
        username: '{{ vcenter_username }}'
        password: '{{ vcenter_password }}'
        validate_certs: no
      delegate_to: localhost
      register: datacenter

    - debug:
        msg: "{{ item.name }}"
      loop: "{{ datacenter.datacenter_info }}"
      when:
        - item.name is defined
        - item.name == datacenter

以下是产出:

代码语言:javascript
复制
PLAY [localhost] *******************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************
ok: [localhost]

TASK [Gather information about all datacenters] ************************************************************************************************************************
ok: [localhost]

TASK [debug] ***********************************************************************************************************************************************************
skipping: [localhost] => (item={'name': 'Datacenter-Test', 'moid': 'datacenter-1247', 'config_status': 'gray', 'overall_status': 'gray'})
ok: [localhost] => (item={'name': 'opendc-rookie', 'moid': 'datacenter-2', 'config_status': 'gray', 'overall_status': 'gray'}) => {
    "msg": "opendc-rookie"
}

PLAY RECAP *************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

但是,当我尝试使用var_prompt并请求变量数据中心的用户输入时,如下所示:

代码语言:javascript
复制
---
- hosts: localhost
  vars_files: 1credentials.yml
  vars_prompt:
    - name: datacenter
      prompt: mention the datacenter name
      private: no
  tasks:
    - name: Gather information about all datacenters
      community.vmware.vmware_datacenter_info:
        hostname: '{{ vcenter_hostname }}'
        username: '{{ vcenter_username }}'
        password: '{{ vcenter_password }}'
        validate_certs: no
      delegate_to: localhost
      register: datacenter

    - debug:
        msg: "{{ item.name }}"
      loop: "{{ datacenter.datacenter_info }}"
      when:
        - item.name is defined
        - item.name == "datacenter"

它跳过调试任务而不替换数据中心变量的值,该值是用户在when条件下的输入。请建议我如何将变量值与具有项的条件合并。下面是跳过变量的输出

代码语言:javascript
复制
mention the datacenter name: opendc-rookie

PLAY [localhost] *******************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************
ok: [localhost]

TASK [Gather information about all datacenters] ************************************************************************************************************************
ok: [localhost]

TASK [debug] ***********************************************************************************************************************************************************
skipping: [localhost] => (item={'name': 'Datacenter-Test', 'moid': 'datacenter-1247', 'config_status': 'gray', 'overall_status': 'gray'})
skipping: [localhost] => (item={'name': 'opendc-rookie', 'moid': 'datacenter-2', 'config_status': 'gray', 'overall_status': 'gray'})
skipping: [localhost]

PLAY RECAP *************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-04 07:41:03

我建议您重命名您的注册值(与提示var相同的名称)

代码语言:javascript
复制
- hosts: localhost
  vars_files: 1credentials.yml
  vars_prompt:
    - name: datacenter
      prompt: mention the datacenter name
      private: no
  tasks:
    - name: Gather information about all datacenters
      community.vmware.vmware_datacenter_info:
        hostname: '{{ vcenter_hostname }}'
        username: '{{ vcenter_username }}'
        password: '{{ vcenter_password }}'
        validate_certs: no
      delegate_to: localhost
      register: datacenterX

    - debug:
        msg: "{{ item.name }}"
      loop: "{{ datacenterX.datacenter_info }}"
      when:
        - item.name is defined
        - item.name == datacenter
票数 1
EN

Stack Overflow用户

发布于 2022-08-04 06:23:05

在跟踪中,我们可以看到debug任务正在使用键(或属性) name = "Datacenter-Test"name = "opendc-rookie"迭代超过2个dict项。因为您在item.name == "datacenter"上有一个条件,所以这个条件只适用于具有属性‘`name = "datacenter“的项。这不是你想要达到的目标。

如何将列表值“Datacenter”和"opendc-rookie“添加为

条件中的变量

以下是两个筛选数据中心列表的选项,以保留所选的两个名称。

  • “简单条件”:在when条件中使用简单的or:直接过滤列表以迭代列表wanted_datacenters中定义的项。此选项适用于输入ansible-playbook loop.yml --extra-vars='{"wanted_datacenters": ["opendc-rookie", "Datacenter-Test"]}'

代码语言:javascript
复制
- hosts: localhost
  vars:
    datacenter:
      - name: opendc-rookie
      - name: Datacenter-Test
    wanted_datacenters:
      - opendc-rookie
      - Datacenter-Test
  tasks:
    - name: "simple condition"
      debug:
        msg: "{{ item.name }}"
      loop: "{{ datacenter }}"
      when: item.name == "Datacenter-Test" or item.name == "opendc-rookie"
    - name: "list condition"
      debug:
        msg: "{{ item.name }}"
      loop: "{{ datacenter|selectattr('name', 'in', wanted_datacenters)|list }}"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73230985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档