Ansible + Kubernetes:如何等待作业完成

Kon*_*bov 12 ansible kubernetes

提前感谢您花时间阅读本文。

我正在使用 Kubernetes 并使用 Ansible 与我的集群进行任何交互。有一些成功部署应用程序的剧本。

我用于部署的主要ansible组件是k8s,它允许我应用我的 yaml 配置。

我可以成功地等到部署完成使用

k8s:
    state: present
    definition: config.yaml
    wait: yes
    wait_timeout: 10
Run Code Online (Sandbox Code Playgroud)

但是,不幸的是,默认情况下,同样的技巧不适用于 Kubernetes 作业。该模块只是立即退出,这在 ansible 模块中有明确描述,这是真的:

对于没有实现的资源类型,除非设置了wait_condition,否则wait 会立即返回。

为了涵盖这种情况,模块规范建议指定

wait_condition:
  reason: REASON
  type: TYPE
  status: STATUS
Run Code Online (Sandbox Code Playgroud)

该文档还说:

条件的可能类型特定于 Kubernetes 中的每种资源类型。请参阅给定资源的状态字段的 API 文档以查看可能的选择。

我检查了 API 规范,发现与以下答案中所述相同:

唯一的类型值是“完成”和“失败”,并且它们可能具有“真”或“假”状态

所以,我的问题很简单:有没有人知道如何正确使用这个wait_condition?您是否已经尝试过(至于现在,它是相对较新的功能)?

任何看哪里的想法也值得赞赏。

更新:

这是我现在使用的一种解决方法:

- name: Run Job
  k8s:
   state: present
   definition: job_definition.yml

- name: Wait Until Job Is Done
  k8s_facts:
    name: job_name
    kind: Job
  register: job_status
  until: job_status.resources[0].status.active != 1
  retries: 10
  delay: 10
  ignore_errors: yes

- name: Get Final Job Status
  k8s_facts:
    name: job_name
    kind: Job
  register: job_status

- fail:
    msg: "Job Has Been Failed!"
  when: job_status.resources[0].status.failed == 1
Run Code Online (Sandbox Code Playgroud)

但最好直接使用适当的模块功能。

Mar*_*ala 5

(其他答案非常接近,我会编辑它们,但它说编辑队列已满。)Job Condition 中的状态是一个字符串。在 YAML 中,一个True标签被解析为布尔类型,你需要引用它来获取字符串。就像在作业的 YAML 输出中一样:

$ kubectl -n demo get job jobname -o yaml
apiVersion: batch/v1
kind: Job
metadata: ...
spec: ...
status:
  completionTime: "2021-01-19T16:24:47Z"
  conditions:
  - lastProbeTime: "2021-01-19T16:24:47Z"
    lastTransitionTime: "2021-01-19T16:24:47Z"
    status: "True"
    type: Complete
  startTime: "2021-01-19T16:24:46Z"
  succeeded: 1
Run Code Online (Sandbox Code Playgroud)

因此,要完成,您需要引用wait_condition.

  k8s:
    wait: yes
    wait_condition:
      type: Complete
      status: "True"
Run Code Online (Sandbox Code Playgroud)

wait参数需要布尔值,在 YAML 中yes是一个字符串,但 Ansible 接受更多布尔参数值。)