0

定时任务模板

kind: CronJob
metadata:
  name: some-example
  namespace: some-example
spec:
  schedule: "* 12 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: some-example
            image: gcr.io/some-example/some-example
            imagePullPolicy: Always
            env:
             - name: REPO_URL
               value: https://example.com/12/some-example

我需要创建多个不同的REPO_URL100 多个 URL 的作业文件保存在一个文件中。我正在寻找一种解决方案,我可以在其中设置作业模板并从另一个文件中获取所需的键:值。

到目前为止,我已经尝试过https://kustomize.io/https://ballerina.io/https://github.com/mikefarah/yq。但我无法找到适合该场景的好例子。

4

1 回答 1

2

yq使用 shell 脚本,这将是非常微不足道的。假设你的模板在 中cronjob.yml,我们可以这样写:

let count=0
while read url; do
  yq -y '
    .metadata.name = "some-example-'"$count"'"|
    .spec.jobTemplate.spec.template.spec.containers[0].env[0].value = "'"$url"'"
  ' cronjob.yml
  echo '---'
  let count++
done < list_of_urls.txt | kubectl apply -f-

例如,如果我的list_of_urls.txt包含:

https://google.com
https://stackoverflow.com

上面的脚本将产生:

[...]
metadata:
  name: some-example-0
  namespace: some-example
spec:
  [...]
              env:
                - name: REPO_URL
                  value: https://google.com
---
[...]
metadata:
  name: some-example-1
  namespace: some-example
spec:
  [...]
              env:
                - name: REPO_URL
                  value: https://stackoverflow.com

| kubectl apply -f-如果您只想查看输出而不是实际创建资源,则可以删除。


或者对于更结构化的方法,我们可以使用 Ansible 的k8s 模块:

- hosts: localhost
  gather_facts: false
  tasks:
    - k8s:
        state: present
        definition:
          apiVersion: batch/v1beta1
          kind: CronJob
          metadata:
            name: "some-example-{{ count }}"
            namespace: some-example
          spec:
            schedule: "* 12 * * *"
            jobTemplate:
              spec:
                template:
                  spec:
                    containers:
                    - name: some-example
                      image: gcr.io/some-example/some-example
                      imagePullPolicy: Always
                      env:
                       - name: REPO_URL
                         value: "{{ item }}"
      loop:
        - https://google.com
        - https://stackoverflow.com
      loop_control:
        index_var: count

假设上面的内容存储在 中playbook.yml,运行它 ansible-playbook playbook.yml会创建与早期 shell 脚本相同的资源。

于 2021-02-18T14:23:37.593 回答