Невозможно найти строку в модуле json_query. - PullRequest
0 голосов
/ 22 октября 2019

Команда, у меня есть выходные данные, и я пытаюсь завершиться с ошибкой / передачей, основываясь на существовании строки в полученном ответе json. есть подсказка?

      - name: "Fetch all gpu/dgx nodes from clusters using K8s facts"
        k8s_facts:
          kubeconfig: $WORKSPACE
          kind: Node
          label_selectors:
          - nodeType=gpu
          verify_ssl: no
        register: node_list

      - debug:
          var: node_list
      - debug:
          var: node_list | json_query(query)
        vars:
          query: 'resources[].{node_name: metadata.name, nodeType: metadata.labels.nodeType}'
        failed_when: '"gpu" not in query.results'
TASK [2_k8s_validations : debug] ******************************************************************************************************************************************************************
ok: [target1] => {
    "node_list | json_query(query)": [
        {
            "nodeType": "gpu",
            "node_name": "dgx"
        },
        {
            "nodeType": "gpu",
            "node_name": "dgx"
        }
    ]
}```

ЗАДАЧА [2_k8s_validations: отладка] ****************************************************************************************************************************************************************** фатально: [target1]: СБОЙ! => {"msg": "Сбой условной проверки '\" gpu \ "не в query.results". Ошибка: ошибка при оценке условного выражения (\ "gpu \" не в query.results): невозможно найтиимя или доступ к атрибуту в строке шаблона ({% if \ "gpu \" отсутствует в query.results%} True {% else%} False {% endif%}). \ nУбедитесь, что имя вашей переменной не содержит недопустимых символовкак '-': аргумент типа 'AnsibleUndefined' не повторяется "}

PLAY RECAP ************************************************** target1: ok = 10 изменено = 5 недоступно = 0 не выполнено = 1 пропущено = 0 спасено = 0 проигнорировано = 0


1 Ответ

1 голос
/ 23 октября 2019

У вас недоразумение;vars: объявляет только "локальные" переменные для текущей задачи. Поскольку вы только что объявили переменную с именем query, а эта переменная не является dict, у нее нет такого дочернего свойства .results

Скорее всего, вы захотите использовать set_fact:, чтобы утвердить новый ансибальный факт в структуре hostvars, чтобы вы могли затем использовать его так, как пытались сделать:

  - set_fact:
      nodes_with_node_type: '{{ node_list | json_query(query) }}'
    vars:
      query: 'resources[].{node_name: metadata.name, nodeType: metadata.labels.nodeType}'

  - fail:
      msg: Expected to find at least one GPU node type
    vars:
      node_types: '{{ nodes_with_node_type | map(attribute="nodeType") | list }}'
    when: '"gpu" not in node_types'

Отдельно от вашего конкретного вопроса, фактической задачи, которой вы являетесьпытаться выполнить это - полная чушь, учитывая, что ваш селектор на k8s_facts: явно запрашивает nodeType=gpu - не будет никаких других типов возвращаемых узлов, и, таким образом, when: никогда не будет истинным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...