[英]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.