Ansible - перебирать элементы и выполнять задачу, если значение не существует - PullRequest
3 голосов
/ 15 января 2020

Я хочу перебрать элементы, проверить, существует ли значение fluxcd в каком-либо из элементов, и, если fluxcd не существует, я хочу выполнить задачу, используя условие when. До сих пор я писал это:

- name: Check flux status
  k8s_facts: 
    api_version: v1
    kind: Namespace
    kubeconfig: "{{ kubeconfig if kubeconfig_exists else omit }}"
  register: namespace_result
- name: Delete flux 
  k8s: 
    state: absent
    definition: "{{ lookup('template', 'flux-deletion.yaml') }}"
    kubeconfig: "{{ kubeconfig if kubeconfig_exists else omit }}"
    wait: True
  when: item.metadata.name != "fluxcd"
  with_items: "{{ namespace_result.resources }}"    
  ignore_errors: yes

Вывод (отладочный код предоставлен: Zeitounator):

- debug:
    msg: "{{ item.metadata.name }} meets the condition"
  with_items: "{{ namespace_result.resources }}"
  when: item.metadata.name != "fluxcd"
ok: [localhost] => (item={'metadata': {'name': 'default', 'selfLink': '/api/v1/namespaces/default', 'uid': '9cf3a983-df77-4905-8650-4bd43f1d2e8e', 'resourceVersion': '149', 'creationTimestamp': '2020-01-09T15:48:21Z'}, 'spec': {'finalizers': ['kubernetes']}, 'status': {'phase': 'Active'}, 'apiVersion': 'v1', 'kind': 'Namespace'}) => {
    "msg": "default meets the condition"
}
skipping: [localhost] => (item={'metadata': {'name': 'fluxcd', 'selfLink': '/api/v1/namespaces/fluxcd', 'uid': '83b159be-8aeb-45ef-b5b5-5f0b6c8a098e', 'resourceVersion': '1433997', 'creationTimestamp': '2020-01-15T08:18:43Z'}, 'spec': {'finalizers': ['kubernetes']}, 'status': {'phase': 'Active'}, 'apiVersion': 'v1', 'kind': 'Namespace'}) 
ok: [localhost] => (item={'metadata': {'name': 'kube-node-lease', 'selfLink': '/api/v1/namespaces/kube-node-lease', 'uid': '04199d99-5527-4455-a22f-d42abedf87eb', 'resourceVersion': '35', 'creationTimestamp': '2020-01-09T15:48:18Z'}, 'spec': {'finalizers': ['kubernetes']}, 'status': {'phase': 'Active'}, 'apiVersion': 'v1', 'kind': 'Namespace'}) => {
    "msg": "kube-node-lease meets the condition"
}
ok: [localhost] => (item={'metadata': {'name': 'kube-public', 'selfLink': '/api/v1/namespaces/kube-public', 'uid': 'e84d01de-d053-4c28-af8b-fd5b55de4c41', 'resourceVersion': '29', 'creationTimestamp': '2020-01-09T15:48:18Z'}, 'spec': {'finalizers': ['kubernetes']}, 'status': {'phase': 'Active'}, 'apiVersion': 'v1', 'kind': 'Namespace'}) => {
    "msg": "kube-public meets the condition"
}
ok: [localhost] => (item={'metadata': {'name': 'kube-system', 'selfLink': '/api/v1/namespaces/kube-system', 'uid': '6b6a50ee-a2f3-4bc7-9342-553a2acd79d2', 'resourceVersion': '16', 'creationTimestamp': '2020-01-09T15:48:18Z'}, 'spec': {'finalizers': ['kubernetes']}, 'status': {'phase': 'Active'}, 'apiVersion': 'v1', 'kind': 'Namespace'}) => {
    "msg": "kube-system meets the condition"
}
ok: [localhost] => (item={'metadata': {'name': 'tiller', 'selfLink': '/api/v1/namespaces/tiller', 'uid': 'eb889937-3012-41e8-86d5-f2d4679d23ac', 'resourceVersion': '1467903', 'creationTimestamp': '2020-01-15T11:17:18Z'}, 'spec': {'finalizers': ['kubernetes']}, 'status': {'phase': 'Active'}, 'apiVersion': 'v1', 'kind': 'Namespace'}) => {
    "msg": "tiller meets the condition"
}




Но когда я запускаю это, мне кажется, как он проверит первое поле в списке, где значение по умолчанию, и он автоматически выполнит задачу. У меня нет опыта работы с ansible, любая помощь будет оценена. Спасибо.

1 Ответ

1 голос
/ 15 января 2020

Если вы перенесете свое условие в задачу debug, вы увидите, что оно пропускается, если условие не выполняется:

- debug:
    msg: "{{ item.metadata.name }} meets the condition"
  with_items: "{{ namespace_result.resources }}"
  when: item.metadata.name != "fluxcd"

Это позволит проверить, как ваша задача зацикливается и проверяет ваше состояние. Затем вы можете заменить модуль debug на k8s, и он будет пропущен точно так же.

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