首页 > 解决方案 > 如何在迭代 with_item 调试列表时基于传递 when 条件执行 Ansible 任务?

问题描述

我正在尝试根据 with_item 用户列表的 when 条件执行 API POST。when 条件从 API GET 收集,然后存储为调试变量。

问题:调试变量似乎没有正确迭代,API POST 任务仅遵循第一个结果。这导致要么尝试对 with_items 列表中的所有项目执行 POST,要么全部跳过它们。

我不明白每个“request_ad_user”是否正在创建一个新变量,以及它们如何在“何时”条件下迭代。我错过了什么?

这是我的代码:

- name: Add a users to univention AD server.
  hosts: localhost

  tasks:
      - name: Include user to add as variable
        include_vars:
            file: users.yaml
            name: users

      - name: Check if AD users exist (object DN)
        uri:
          url: https://10.10.10.10/univention/udm/users/user/uid%3D{{item.username}}%2Ccn%3Dusers%2Cdc%3Dcybertax%2Cdc%3Dcso%2Cdc%3Dcom
          user: admin
          password: "{{users.adminpw}}"
          validate_certs: no
          return_content: yes
          status_code: 200,404
          method: GET
          timeout: 10
        with_items:
          - "{{users.user}}"
        register: request_ad_user

      - name: debug univention user object DN request
        debug:
          var: request_ad_user

      - name: Add AD user accounts
        uri:
          url: https://10.10.10.10/univention/udm/users/user/
          user: admindh
          password: "{{users.vcenterPassword}}"
          validate_certs: no
          return_content: yes
          status_code: 201
          method: POST
          body: "{\"uuid\": \"string\", \"uri\": \"https://10.104.8.110/univention/udm/users/user/uid={{item.username}},dc=cybertax,dc=cso,dc=com\", \"options\": {\"pki\": false}, \"policies\": {\"pol
          body_format: json
        when:
          - request_ad_user.results[0].status == 404
        with_items:
          - "{{users.user}}"

标签: loopsdebuggingansibleconditional-statements

解决方案


尝试添加一个循环索引,并在when子句中使用该索引:

  - name: Add AD user accounts
    uri:
      url: https://10.10.10.10/univention/udm/users/user/
      user: admindh
      password: "{{users.vcenterPassword}}"
      validate_certs: no
      return_content: yes
      status_code: 201
      method: POST
      body: "{\"uuid\": \"string\", \"uri\": \"https://10.104.8.110/univention/udm/users/user/uid={{item.username}},dc=cybertax,dc=cso,dc=com\", \"options\": {\"pki\": false}, \"policies\": {\"pol
      body_format: json
    when:
      - request_ad_user.results[ndx].status == 404
    with_items:
      - "{{users.user}}"
    loop_control:
      index_var: ndx

推荐阅读