CD工具awx之公司生产环境的操作与部署说明
作为入口程序,它比较简单,通过roles指定了运行脚本roles/k8s_control/main.yaml。变量get_md5和cat_md5是否相等,如果不同,则报错"MD5 file is different"。在docker images查询镜像的时候,过滤得到镜像ID,然后赋值给变量“image_id”。凭证有很多种,包括gitlab等中间件的用户名密码、k8s api的令牌、机器的用户
·
一、模板
- 模板名称,见名知义
- 项目:ansible脚本所在的位置,可以是本地,也可以是远程分布式配置,比如gitlab。(详见下文)
- PLAYBOOK:ansible运行的入口
- 凭证
- 作业标签:任务的细分,可能是start,可能是stop,也可能是restart
额外变量
定义ansible脚本运行的参数。
二、项目
创建新项目
手动类型
awx机器的本地目录:
对应/var/lib/awx/projects/docker_control
git类型
填写git仓库的地址、分支和凭证。
三、 凭证
凭证有很多种,包括gitlab等中间件的用户名密码、k8s api的令牌、机器的用户名密码等等。
1、源控制
输入gitlab的用户名和密码。
2、OpenShift 或 Kubernetes API 持有者令牌
填写k8s的api地址及令牌
3、机器
输入ssh远程机器的用户名和密码。
四、ansible脚本
目录结构:
- k8s_control.yaml
- ecs_control.yaml
- globals.yaml
- roles
-
- k8s_control
-
- tasks
-
- main.yaml
-
- scripts
-
- xxx.yaml
-
- xxx.yaml
-
- tasks
-
- ecs_control
-
- tasks
-
- main.yaml
-
- scripts
-
- xxx.yaml
-
- xxx.yaml
-
- tasks
1、入口地址k8s_control.yaml
作为入口程序,它比较简单,通过roles指定了运行脚本roles/k8s_control/main.yaml。
2、globals.yaml
3、main.yaml
基本格式:
- name: make service image
include: scripts/make_image.yaml
tags: ["make_image", "update"]
- include:嵌套运行另外一个yaml脚本,文件在相对路径scripts/make_image.yaml
- tags:标签数组,既然是多个,它们之间的关系是OR或。也就是说,无论是make_image还是update,都会触发该ansible脚本-- scripts/make_image.yaml。
3、常用的任务脚本
- 复制文件
- name: Copy {{ APPNAME }} zip package
copy: src={{ web_app_dir }}/{{ APPNAME }}/{{ APPNAME }}.zip dest={{ directory }}/{{ APPNAME }}/{{ APPNAME }}/packages/ owner=devuser group=devuser mode=755
connection: local
- 执行shell命令
- name: Tag and push {{ APPNAME }}:{{ VERSION }} image
shell: docker tag {{ image_id }} {{ aly_image_storage }}{{ APPNAME }}:{{ VERSION }} && docker push {{ aly_image_storage }}{{ APPNAME }}:{{ VERSION }}
- 切换目录
- name: Make {{ APPNAME }} docker image
shell:
chdir: "{{ directory }}/{{ APPNAME }}"
cmd: "docker build -t {{ APPNAME }}:{{ VERSION }} ./"
- 条件判断
- name: Verify the {{ APPNAME }} version is consistent
fail:
msg: "MD5 file is different"
when: get_md5.stdout != cat_md5.stdout
connection: local
变量get_md5和cat_md5是否相等,如果不同,则报错"MD5 file is different"。
那么这两个变量的值又是从何而来呢?就需要下文的语法register
- 变量赋值register
- name: Get {{ APPNAME }} package md5
shell: /usr/bin/md5sum {{ web_app_dir }}/{{ APPNAME }}/{{ APPNAME }}.zip | awk -F ' ' '{print $1}'
register: get_md5
connection: local
- name: Cat {{ APPNAME }} package md5
shell: /usr/bin/cat {{ web_app_dir }}/{{ APPNAME }}/{{ APPNAME }}.zip.md5
register: cat_md5
connection: local
另外一种赋值的写法,见下:
- set_fact
在docker images查询镜像的时候,过滤得到镜像ID,然后赋值给变量“image_id”。
- name: Get {{ APPNAME }}:{{ VERSION }} image id
shell: docker images {{ APPNAME }}:{{ VERSION }} | awk '/{{ APPNAME }}/{print $3}'
register: IMAGE_ID
- set_fact:
image_id: "{{ IMAGE_ID.stdout }}"
connection: local
再举一个例子:
给变量OPTION赋值为update_from_yaml。
- set_fact:
OPTION: "update_from_yaml"
connection: local
- 忽略错误 ignore_errors
- name: Comparison {{ APPNAME }} package version
shell: check_version.sh {{ VERSION }} {{ current_version }}
register: version_status
when: (DEBUG is undefined) and (scheduling_type == "deployment")
ignore_errors: yes
- 创建目录
- name: Create {{ APPNAME }} directory
file: state=directory path={{ directory }}/{{ APPNAME }}/{{ APPNAME }}/{{ item }} owner=devuser group=devuser mode=755
with_items:
- "packages"
connection: local
- 创建文件
- name: Create {{ APPNAME }} dockerfile
template: src={{ item }} dest={{ directory }}/{{ APPNAME }}/ owner=devuser group=devuser mode=755
with_items:
- "Dockerfile"
connection: local
- 更新文件template
- name: Update {{ APPNAME }} k8s yaml_template
template: src=config.yaml dest={{ directory }}/{{ APPNAME }}/yamls/ owner=duser group=devuser mode=755
connection: local
- 循环遍历
使用语法with_items和template,使得在一个任务中循环执行,而不用创建两个任务。
# 生成新的 deployment.yaml 和 service.yaml 文件
- name: Create {{ APPNAME }} k8s yaml
template: src={{ directory }}/{{ APPNAME }}/yamls/{{ item }}_template.yaml dest={{ directory }}/{{ APPNAME }}/yamls/{{ item }}.yaml owner=devuser group=devuser mode=755
with_items:
- "deployment"
- "service"
connection: local
更多推荐
已为社区贡献23条内容
所有评论(0)