playbook中tasks使用变量

avatar 2022年4月13日18:11:45 评论 715 次浏览

以前利用ansible中的playbook做发布时,在tasks中执行命令时,命令写固定了,如果jenkins多job同时执行就会出现执行任务错误,这种错误是在多个job同时执行才会有的,为了解决这个问题我们需要把固定的文件名称以变量的方式传递进去,以前想的是使用时间,因为时间是不固定的,后来想想如果两个job同时执行时间一致也会出现这种问题,后来放下一段时间,最近没事就想看看结构,在模版文件中有很多唯一值,例如服务名称,这里使用服务名称来代替固定文件名,看一下我的原文件内容。

---
# tasks file for deploy.k8s
- template:
    src: deploy.j2
    dest: /tmp/wulaoer.yaml
    owner: root
    group: root
    mode: 0644
    force: true

- name: "deploy service to kubernetes"
  shell: "kubectl apply -f /tmp/wulaoer.yaml"

#- file:
#    path: /tmp/deploy.yaml
#    state: absent

这里固定的文件名是wulaoer.yaml,jenkins把变量传递到deploy.j2文件中生成wu lao er.yaml的pod文件,但是如果两个服务同时运行就会被替换掉,这是不可行的,但是在deploy.j2文件中有很多通过jenkins传递过来的变量,如果这里也是用服务名作为变量生成各自的服务就不会出现覆盖问题.

---
# tasks file for deploy.k8s
- template:
    src: deploy.j2
    dest: /tmp/{{ SVC_NAME }}.yaml
    owner: root
    group: root
    mode: 0644
    force: true

- name: "deploy service to kubernetes"
  shell: "kubectl apply -f /tmp/{{ SVC_NAME }}.yaml"

#- file:
#    path: /tmp/deploy.yaml
#    state: absent

这样在同一个环境中使用的所有服务名都是不一样的,如果服务名相同,在kubernetes中就会覆盖,如果多个环境生成的tasks文件就会在不同的环境中生成,这样相互之间不受影响,之间不会出现覆盖,多job同时执行就没有问题了。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: