首页 > 解决方案 > 在 with_items 和循环中使用通配符

问题描述

团队,

with_item在我的任务中使用单个完整定义的字符串运行良好。但是,在规模上,我想循环使用 with_items 内的字符串变化。任何提示?

      - name: "Fetch all CPU nodes from clusters using K8s beta.kubernetes.io/instance-type"
        k8s_facts:
          kind: Node
          label_selectors:
          - "beta.kubernetes.io/instance-type=e1.xlarge"

          verify_ssl: no
        register: cpu_class_list
        failed_when: cpu_class_list == ''

输出:

ok: [localhost] => {
    "nodes_class_label": [
        {
            "instanceType": "e1.xlarge,
            "nodeType": "cpu",
            "node_name": "hostA"
        },
        {
            "instanceType": "e1.xlarge,
            "nodeType": "cpu",
            "node_name": "hostB"
        }
    ]
}


我想使用通配符提取与任何名称匹配的所有节点。

          label_selectors:
          - "beta.kubernetes.io/instance-type=e1.xlarge"
          - "beta.kubernetes.io/instance-type=f1.xlarge"
          - "beta.kubernetes.io/instance-type=g1.xlarge"

预期输出:

list all e1 label nodes output
list all f1 label nodes output
list all g1 label nodes output

我尝试的解决方案:


  - name: "Fetch all CPU nodes from clusters using K8s beta.kubernetes.io/instance-type"
    k8s_facts:
      kind: Node
      label_selectors:
      - "beta.kubernetes.io/instance-type=*.xlarge"

      verify_ssl: no
    register: cpu_class_list
    failed_when: cpu_class_list == ''


标签: ansibleansible-2.xansible-inventoryansible-facts

解决方案


不幸的是,这是不可能的。这是基于 Kubernetes API 实现的限制,与 Ansible 或 k8s_facts 模块无关。

有几种解决方法,但最终我认为使用基于集合的选择器是您的最佳选择。这看起来类似于:

- k8s_facts:
    kind: Node
    label_selectors:
      - "beta.kubernetes.io/instance-type in (e1.xlarge, f1.xlarge, g1.xlarge)"

出于代码可读性和维护目的,您还应该能够将实例类型提取到变量中。

另一种选择是只循环k8s_facts每个实例类型的任务,我猜你已经考虑过:"beta.kubernetes.io/instance-type={{ item }}".

最后,您在问题中的一个示例将不起作用

label_selectors:
  - "beta.kubernetes.io/instance-type=e1.xlarge"
  - "beta.kubernetes.io/instance-type=f1.xlarge"
  - "beta.kubernetes.io/instance-type=g1.xlarge"

这是在寻找满足所有这些条件(即e1.xlarge && f1.xlarge && g1.xlarge)的节点,这些条件总是没有的。


推荐阅读