【问题标题】:multiple string search with failed_when in ansible在ansible中使用 failed_when 进行多个字符串搜索
【发布时间】:2019-10-02 20:03:26
【问题描述】:

团队, 不知何故无法弄清楚这是什么错误。我正在做一个多字符串搜索,并为每个未找到的字符串相应地失败。

      - name: "Validate kubectl access and k8s node lables"
        debug:
          msg: "kubectl get nodes --show-labels -l nodeType={{item}}"
        with_items:
          - gpu
          - cpu
          - monitoring
        register: k8s_labelsresponse

      - debug:
          var: k8s_labelsresponse.stdout
        failed_when: '"nodeType=gpu" not in k8s_labelsresponse.stdout or "nodeType=cpu" not in k8s_labelsresponse.stdout or "nodeType=monitoring" not in k8s_labelsresponse.stdout'

输出:

TASK [Validate kubectl access and k8s node lables] 
ok: [target1] => (item=gpu) => {
    "msg": "kubectl get nodes --show-labels -l nodeType=gpu"
}
ok: [target1] => (item=cpu) => {
    "msg": "kubectl get nodes --show-labels -l nodeType=cpu"
}
ok: [target1] => (item=monitoring) => {
    "msg": "kubectl get nodes --show-labels -l nodeType=monitoring"
}
TASK [debug] **************************************************************************************************************************************************
fatal: [target1]: FAILED! => {"msg": "The conditional check '\"nodeType=gpu\" not in k8s_labelsresponse.stdout or \"nodeType=cpu\" not in k8s_labelsresponse.stdout or \"nodeType=monitoring\" not in k8s_labelsresponse.stdout' failed. The error was: error while evaluating conditional (\"nodeType=gpu\" not in k8s_labelsresponse.stdout or \"nodeType=cpu\" not in k8s_labelsresponse.stdout or \"nodeType=monitoring\" not in k8s_labelsresponse.stdout): Unable to look up a name or access an attribute in template string ({% if \"nodeType=gpu\" not in k8s_labelsresponse.stdout or \"nodeType=cpu\" not in k8s_labelsresponse.stdout or \"nodeType=monitoring\" not in k8s_labelsresponse.stdout %} True {% else %} False {% endif %}).\nMake sure your variable name does not contain invalid characters like '-': argument of type 'AnsibleUndefined' is not iterable"}

【问题讨论】:

  • 查看变量debug: var=k8s_labelsresponse 以了解可能要测试的内容。

标签: ansible ansible-2.x ansible-template


【解决方案1】:

首先,你的变量k8s_labelsresponse 是一个映射,所以你没有stdout。看看debug: var=k8s_labelsresponse 您可以通过以下方式创建该变量:

      msg:
        - kubectl get nodes --show-labels -l nodeType=gpu
        - kubectl get nodes --show-labels -l nodeType=cpu
        - kubectl get nodes --show-labels -l nodeType=monitoring

但是这个解决方案非常难看,因为它是硬编码的。 我建议在 Jinja2 和 set_fact 的帮助下创建一个动态变量:

- hosts: localhost
  vars:
    params:
      - cpu
      - gpu
      - monitoring
  tasks:
  - set_fact:
      k8s_labelsresponse: "{% for param in params -%}
        nodeType={{ param }}

        {% endfor %}"
  - debug:
      msg: "{{ k8s_labelsresponse.splitlines() }}"
    failed_when:  '"nodeType=gpu" not in k8s_labelsresponse  or "nodeType=cpu" not in k8s_labelsresponse or "nodeType=monitoring" not in k8s_labelsresponse'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2015-12-12
    相关资源
    最近更新 更多