簡體   English   中英

Ansible 比較注冊變量和設置事實

[英]Ansible Compare registered variables and set fact

我對 ansible 和 podman 比較陌生,對 python 還不是很了解。因此,我對如何在系統上收集容器映像列表並刪除它們有一些障礙。 但是,只有在沒有正在運行的容器正在使用該圖像時才刪除該圖像。

我的初始任務確實有效,如下所示:

- name: Gather facts about all container images
  containers.podman.podman_image_info:
  register: image_info

- name: remove images no longer used
  containers.podman.podman_image:
    name: "{{ item.Id }}"
    state: absent
  loop: "{{ image_info.images }}"
  loop_control:
    label: "{{ item.Id }}"
  ignore_errors: true

然而,這並不完美,因為一旦任務到達正在使用的圖像就會失敗,這就是設置ignore_errors: true的原因。 我也不希望它在失敗時提供大塊錯誤 output(大約 200 多行)。 總體而言,這符合我的預期。

我在這個代碼“進化”中的下一步是如何在不使用no_log: true或任何類似的情況下刪除大錯誤 output,如果可能的話。 我的想法是將我准備好收集的圖像 ID 列表與正在運行的容器圖像的列表進行比較。 我更新了代碼以收集有關系統容器的信息。

- name: Gather facts about all container images
  containers.podman.podman_image_info:
  register: image_info

- name: gather container info
  containers.podman.podman_container_info:
  register: container_info

- name: remove images no longer used
  containers.podman.podman_image:
    name: "{{ item.Id }}"
    state: absent
  loop: "{{ image_info.images }}"
  loop_control:
    label: "{{ item.Id }}"
  ignore_errors: true

然后調試container_info變量的 output 我確實看到了圖像 ID,它最終像container_info.containers[0].Image作為我可以使用的變量。 我現在的想法是,我可以使用它從我擁有的圖像列表中刪除正在使用的圖像 ID。

這是我的障礙,我不確定如何使用我擁有的信息創建這個新圖像列表。 我知道我必須為此使用set_facts ,但是是否可以在一個任務中循環遍歷兩個不同的列表? 還是我想得太多了,還有一種我不知道的更簡單的方法。 我真正想做的就是避免在我的代碼中使用ignore_errors

更新:我已經把事實記下來了。 在我的劇本中看起來像以下內容:

- name: Setting facts for image IDs
  set_fact:
    image_id: "{{ image_info.images | json_query('[].Id') }}"

- name: Setting fact for Container image ID
  set_fact:
    container_id: "{{ container_info.containers | json_query('[].Image') }}"

這最終在調試時為我提供了以下信息。

TASK [docker-host : debug image_id] ***********************************************************************************************************************************************************************
ok: [dtest05] =>
  image_id:
  - 4bc0467496b6c7a60543069c570ef0e1be4565d25cb2bc7d524600a5fe0d3b8f
  - c223664c734cbbc7213a4312af596b37a5bf5e55f93526bcb34e527efc9c4d5b
  - dbcefaa52e7009f5d9b6179a256e70890d29148add0f77741ca4550ba2e2ffa6
  - e911c149c0ca46a11a8b6eb604439e972685ec25abfde07eb1cdb272a9c0d1a9
  - eb40451959b6c5f4aebb2b687a589a58370faab9b15faa43c0aea8d711155b9e

TASK [docker-host : debug container_id] *******************************************************************************************************************************************************************
ok: [dtest05] =>
  container_id:
  - dbcefaa52e7009f5d9b6179a256e70890d29148add0f77741ca4550ba2e2ffa6

我想我只需要設置另一個可以刪除重復項的事實。

Update2 :創建了另一個事實來“合並”另外兩個事實。 完整的劇本如下所示:

- name: Gather facts about all container images
  containers.podman.podman_image_info:
  register: image_info

- name: gather container info
  containers.podman.podman_container_info:
  register: container_info

- name: Setting Facts for Image IDs
  set_fact:
    image_id: "{{ image_info.images | json_query('[].Id') }}"
    container_id: "{{ container_info.containers | json_query('[].Image') }}"

- name: Merging facts
  set_fact:
    merged_ids: "{{ image_id }} + {{ container_id }}"

然后merged_id變量輸出以下內容:

  merged_ids:
  - 4bc0467496b6c7a60543069c570ef0e1be4565d25cb2bc7d524600a5fe0d3b8f
  - c223664c734cbbc7213a4312af596b37a5bf5e55f93526bcb34e527efc9c4d5b
  - dbcefaa52e7009f5d9b6179a256e70890d29148add0f77741ca4550ba2e2ffa6
  - e911c149c0ca46a11a8b6eb604439e972685ec25abfde07eb1cdb272a9c0d1a9
  - eb40451959b6c5f4aebb2b687a589a58370faab9b15faa43c0aea8d711155b9e
  - dbcefaa52e7009f5d9b6179a256e70890d29148add0f77741ca4550ba2e2ffa6

我可以在列表中看到重復的 ID。 如何從merged_ids變量列表中刪除重復的 ID?

您的“合並事實”任務存在問題。 您不是在創建合並的值列表; 您實際上是在連接兩個字符串。 你要:

- name: Merging facts
  set_fact:
    merged_ids: "{{ image_id + container_id }}"

您可以使用一個unique過濾器來唯一化列表:

- name: Merging facts
  set_fact:
    merged_ids: "{{ image_id + container_id | unique }}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM