一、模板
- 模板名称,见名知义
- 项目: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 imageinclude: scripts/make_image.yamltags: ["make_image", "update"]
- include:嵌套运行另外一个yaml脚本,文件在相对路径scripts/make_image.yaml
- tags:标签数组,既然是多个,它们之间的关系是OR或。也就是说,无论是make_image还是update,都会触发该ansible脚本-- scripts/make_image.yaml。
3、常用的任务脚本
- 复制文件
- name: Copy {{ APPNAME }} zip packagecopy: src={{ web_app_dir }}/{{ APPNAME }}/{{ APPNAME }}.zip dest={{ directory }}/{{ APPNAME }}/{{ APPNAME }}/packages/ owner=devuser group=devuser mode=755connection: local
- 执行shell命令
- name: Tag and push {{ APPNAME }}:{{ VERSION }} imageshell: docker tag {{ image_id }} {{ aly_image_storage }}{{ APPNAME }}:{{ VERSION }} && docker push {{ aly_image_storage }}{{ APPNAME }}:{{ VERSION }}
- 切换目录
- name: Make {{ APPNAME }} docker imageshell: chdir: "{{ directory }}/{{ APPNAME }}"cmd: "docker build -t {{ APPNAME }}:{{ VERSION }} ./"
- 条件判断
- name: Verify the {{ APPNAME }} version is consistentfail:msg: "MD5 file is different"when: get_md5.stdout != cat_md5.stdoutconnection: local
变量get_md5和cat_md5是否相等,如果不同,则报错"MD5 file is different"。
那么这两个变量的值又是从何而来呢?就需要下文的语法register
- 变量赋值register
- name: Get {{ APPNAME }} package md5shell: /usr/bin/md5sum {{ web_app_dir }}/{{ APPNAME }}/{{ APPNAME }}.zip | awk -F ' ' '{print $1}'register: get_md5connection: local- name: Cat {{ APPNAME }} package md5shell: /usr/bin/cat {{ web_app_dir }}/{{ APPNAME }}/{{ APPNAME }}.zip.md5register: cat_md5connection: local
另外一种赋值的写法,见下:
- set_fact
在docker images查询镜像的时候,过滤得到镜像ID,然后赋值给变量“image_id”。
- name: Get {{ APPNAME }}:{{ VERSION }} image idshell: 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 versionshell: check_version.sh {{ VERSION }} {{ current_version }}register: version_statuswhen: (DEBUG is undefined) and (scheduling_type == "deployment")ignore_errors: yes
- 创建目录
- name: Create {{ APPNAME }} directoryfile: state=directory path={{ directory }}/{{ APPNAME }}/{{ APPNAME }}/{{ item }} owner=devuser group=devuser mode=755with_items:- "packages"connection: local
- 创建文件
- name: Create {{ APPNAME }} dockerfiletemplate: src={{ item }} dest={{ directory }}/{{ APPNAME }}/ owner=devuser group=devuser mode=755with_items:- "Dockerfile"connection: local
- 更新文件template
- name: Update {{ APPNAME }} k8s yaml_templatetemplate: src=config.yaml dest={{ directory }}/{{ APPNAME }}/yamls/ owner=duser group=devuser mode=755connection: local
- 循环遍历
使用语法with_items和template,使得在一个任务中循环执行,而不用创建两个任务。
# 生成新的 deployment.yaml 和 service.yaml 文件
- name: Create {{ APPNAME }} k8s yamltemplate: src={{ directory }}/{{ APPNAME }}/yamls/{{ item }}_template.yaml dest={{ directory }}/{{ APPNAME }}/yamls/{{ item }}.yaml owner=devuser group=devuser mode=755with_items:- "deployment"- "service"connection: local