AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79288278
Accepted
G4nja Wizard
G4nja Wizard
Asked: 2024-12-17 22:30:57 +0800 CST2024-12-17 22:30:57 +0800 CST 2024-12-17 22:30:57 +0800 CST

Como fazer um loop de subelementos com condições baseadas em valor de string?

  • 772

Estou trabalhando com dicts aninhados e tenho vários arquivos de dicionário com chaves idênticas. O dict e a tarefa em si estão funcionando, mas preciso adicionar a seguinte condição. Não execute a tarefa, se o estado do subelemento == ausente

Meu dict:

qualitygate:
  - qualitygate_name: QA-dev
    operators:
      - metric: coverage
        operator: CT
        error: 1
        state: present
  - qualitygate_name: Department-xyc
    operators:
      - metric: coverage
        operator: CT
        error: 10
        state: absent
      - metric: duplicated_lines
        operator: GT
        error: 5
        state: present

Usando minha tarefa:

- ansible.builtin.uri:
    url: "{{ protocol }}://{{ server_fqdn }}/api/qualitygates/create_condition"
    user: "{{ token }}"
    method: POST
    body_format: form-urlencoded
    body:
        error: "{{ item.1.error }}"
        metric: "{{ item.1.metric }}"
        gateName: "{{ item.0.qualitygate_name }}"
        op: "{{ item.1.operator }}"
  loop: "{{ qualitygate | subelements('operators', 'skip_missing=True') }}"
  when: qualitygate[item]['state'] is match("present")

Como posso alterar o filtro para corresponder apenas ao valor "presente"

ansible
  • 2 2 respostas
  • 26 Views

2 respostas

  • Voted
  1. Vladimir Botka
    2024-12-18T00:00:23+08:002024-12-18T00:00:23+08:00

    Use o item subelemento na condição

          when: item.1.state == 'present'
    

    Exemplo de um manual completo para testes

    - hosts: localhost
    
      vars:
    
        qualitygate:
          - operators:
            - {error: 1, metric: coverage, operator: CT, state: present}
            qualitygate_name: QA-dev
          - operators:
            - {error: 10, metric: coverage, operator: CT, state: absent}
            - {error: 5, metric: duplicated_lines, operator: GT, state: present}
            qualitygate_name: Department-xyc
    
      tasks:
    
        - debug:
            msg: |
              error: {{ item.1.error }}
              metric: {{ item.1.metric }}
              op: {{ item.1.operator }}
              gateName: {{ item.0.qualitygate_name }}
          loop: "{{ qualitygate | subelements('operators', skip_missing=True) }}"
          loop_control:
            label: "{{ item.0.qualitygate_name }} {{ item.1.operator }} {{ item.1.state }}"
          when: item.1.state == 'present'
    

    dá resumido

    ok: [localhost] => (item=QA-dev CT present) => 
      msg: |-
        error: 1
        metric: coverage
        op: CT
        gateName: QA-dev
    skipping: [localhost] => (item=Department-xyc CT absent) 
    ok: [localhost] => (item=Department-xyc GT present) => 
      msg: |-
        error: 5
        metric: duplicated_lines
        op: GT
        gateName: Department-xyc
    
    • 1
  2. Best Answer
    larsks
    2024-12-18T00:06:08+08:002024-12-18T00:06:08+08:00

    O problema aqui é que itemno seu loop não há um único valor. Se você executar alguns diagnósticos simples, como este:

    - loop: "{{ qualitygate | subelements('operators', 'skip_missing=True') }}"
      debug:
        msg: "{{ item }}"
    

    Você verá que itemfica assim:

    [
        {
            "operators": [
                {
                    "error": 1,
                    "metric": "coverage",
                    "operator": "CT",
                    "state": "present"
                }
            ],
            "qualitygate_name": "QA-dev"
        },
        {
            "error": 1,
            "metric": "coverage",
            "operator": "CT",
            "state": "present"
        }
    ]
    

    Isso é descrito na documentação :

    O filtro ansible.builtin.subelements produz um produto de um objeto e os valores de subelementos desse objeto, semelhante à pesquisa ansible.builtin.subelements. Isso permite que você especifique subelementos individuais para usar em um modelo. Por exemplo, esta expressão:

    Você quer usar o segundo valor em item-- que para cada iteração representa um valor de uma das operatorslistas -- em seu condicional. Isso lhe dá algo como isto:

    - ansible.builtin.uri:
        url: "{{ protocol }}://{{ server_fqdn }}/api/qualitygates/create_condition"
        user: "{{ token }}"
        method: POST
        body_format: form-urlencoded
        body:
            error: "{{ item.1.error }}"
            metric: "{{ item.1.metric }}"
            gateName: "{{ item.0.qualitygate_name }}"
            op: "{{ item.1.operator }}"
      loop: "{{ qualitygate | subelements('operators', 'skip_missing=True') }}"
      when: item.1.state == "present"
    

    Se envolvermos tudo em uma debugtarefa, assim:

    - debug:
        msg:
          ansible.builtin.uri:
            url: "{{ protocol }}://{{ server_fqdn }}/api/qualitygates/create_condition"
            user: "{{ token }}"
            method: POST
            body_format: form-urlencoded
            body:
              error: "{{ item.1.error }}"
              metric: "{{ item.1.metric }}"
              gateName: "{{ item.0.qualitygate_name }}"
              op: "{{ item.1.operator }}"
      loop: "{{ qualitygate | subelements('operators', 'skip_missing=True') }}"
      when: item.1.state == "present"
    

    Isso nos dá:

    TASK [debug] **********************************************************************************************************************************************
    ok: [localhost] => (item=[{'qualitygate_name': 'QA-dev', 'operators': [{'metric': 'coverage', 'operator': 'CT', 'error': 1, 'state': 'present'}]}, {'metric': 'coverage', 'operator': 'CT', 'error': 1, 'state': 'present'}]) => {
        "msg": {
            "ansible.builtin.uri": {
                "body": {
                    "error": "1",
                    "gateName": "QA-dev",
                    "metric": "coverage",
                    "op": "CT"
                },
                "body_format": "form-urlencoded",
                "method": "POST",
                "url": "https://www.example.com/api/qualitygates/create_condition",
                "user": "mytoken"
            }
        }
    }
    skipping: [localhost] => (item=[{'qualitygate_name': 'Department-xyc', 'operators': [{'metric': 'coverage', 'operator': 'CT', 'error': 10, 'state': 'absent'}, {'metric': 'duplicated_lines', 'operator': 'GT', 'error': 5, 'state': 'present'}]}, {'metric': 'coverage', 'operator': 'CT', 'error': 10, 'state': 'absent'}])
    ok: [localhost] => (item=[{'qualitygate_name': 'Department-xyc', 'operators': [{'metric': 'coverage', 'operator': 'CT', 'error': 10, 'state': 'absent'}, {'metric': 'duplicated_lines', 'operator': 'GT', 'error': 5, 'state': 'present'}]}, {'metric': 'duplicated_lines', 'operator': 'GT', 'error': 5, 'state': 'present'}]) => {
        "msg": {
            "ansible.builtin.uri": {
                "body": {
                    "error": "5",
                    "gateName": "Department-xyc",
                    "metric": "duplicated_lines",
                    "op": "GT"
                },
                "body_format": "form-urlencoded",
                "method": "POST",
                "url": "https://www.example.com/api/qualitygates/create_condition",
                "user": "mytoken"
            }
        }
    }
    

    O que eu acho que demonstra exatamente o que você quer.

    • 1

relate perguntas

  • Como extrair vários hostvars de todos os hosts de um grupo?

  • Execute a tarefa ansible apenas uma vez no localhost

  • Como registrar variável no loop Ansible?

  • É possível usar o registro para atribuir a origem do arquivo dinamicamente no Ansible? [fechado]

  • Comparando duas listas depois de passar pelo mapa Ansible ('regex_replace')

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve