# 可复用:按顺序对多个 label selector 执行 kubectl wait pod --for=condition=ready。 # 必填:verify_kubectl_wait_items(列表元素含 selector、timeout_s) # 可选:verify_kubectl_wait_namespace(默认 default)、k3s_kubeconfig - name: Assert verify_kubectl_wait_items for kubectl-wait-pods-ready ansible.builtin.assert: that: - verify_kubectl_wait_items is defined - verify_kubectl_wait_items | length > 0 fail_msg: "verify_common kubectl-wait-pods-ready:需设置非空 verify_kubectl_wait_items" - name: kubectl wait pods ready (verify_common) ansible.builtin.shell: | set -euo pipefail KCFG="{{ k3s_kubeconfig | default('/etc/rancher/k3s/k3s.yaml') }}" ns="{{ verify_kubectl_wait_namespace | default('default') }}" {% for item in verify_kubectl_wait_items %} echo "[OC-ASSERT] assertion=kubectl_wait_pod_ready selector={{ item.selector | quote }} namespace=${ns} timeout={{ item.timeout_s | int }}s" ok=0 for attempt in 1 2 3 4 5 6 7 8; do set +e out=$(KUBECONFIG="$KCFG" kubectl wait --for=condition=ready pod \ -l "{{ item.selector }}" -n "$ns" --timeout={{ item.timeout_s | int }}s 2>&1) rc=$? set -e if [ "$rc" -eq 0 ]; then ok=1; break; fi if echo "$out" | grep -qE 'NotFound|not found'; then echo "[OC-ASSERT] assertion=kubectl_wait_pod_ready selector={{ item.selector | quote }} retry=${attempt} reason=pod_churn_notfound" sleep 3 continue fi echo "$out" >&2 exit "$rc" done if [ "$ok" != "1" ]; then echo "[OC-ASSERT] assertion=kubectl_wait_pod_ready selector={{ item.selector | quote }} result=fail reason=exhausted_retries" exit 1 fi {% endfor %} args: executable: /bin/bash changed_when: false