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 脚本相同的资源。