Awx
Awx
作为运维人,对于ansible一定非常熟悉,也可能编写一些自己称手的roles等。 然而你是否有如下的问题:
- roles是通过scm管理的吗
- ansible一次执行就结束了吗,别人怎么使用
- ansible任务能够定时和API触发吗
- ansible任务谁都可以触发吗
- ansible任务的结果反馈了吗 如何跟踪错误成功
- ansible资产是怎么管理的?动态资产还是静态资产?
- 你的机密信息是否直接在代码里面?是否希望在分发的时候隐藏?
- 是否在进行一些重复的安装或者性能测试工作?而每次只是ip不同?
这个时候我想说,你需要了解下awx(ansible tower的开源版本)。
awx是一个ansible的管理平台,通过receptor和 ansible-runner 来下发自己的命令并且记录。web组件由django rest framework开发。
相关文档:
安装
由于没有提供standalone的安装方式,其实awx的安装并不会那么方便。这里我 只建议用awx-operator的方式安装。那么你首先需要安装minikube or k8s。这 里我忽略这部分的安装。
这里我简单介绍下阿里云kubernetes下的awx的安装。
helm安装和配置源
|
|
添加源和下载awx-operator helm的源码,后续需要修改
|
|
安装awx chart
首先修改kube-rbac-proxy的源,默认是gcr.io,,阿里云无法pull,直接默认 helm install会报错,镜像无法拉起,修改 awx-operator/templates/deployment-awx-operator-controller-manager.yaml 里面的image替换成quay.io/brancz/kube-rbac-proxy:v0.13.0,你也可以替换 当时的版本
|
|
注意./awx-operator对应你的github解压的目录,安装命令大概如下,注意先别 执行。
|
|
如果只是这样,k8s只会安装awx-operator-controoler, 需要云盘购买50Gi的盘,kubernetes控制台切到对应的namespace然后新建存储卷添加绑定,然后进行下一步
添加具体的应用的yaml请求
|
|
阿里云注意类型选择disk如果用的disk类型,默认大小是8Gi,我暂时没解决
|
|
这样就可以拉起postgresql和其他应用了,注意检查pvc的情况,一般是自动绑 定到新建的存储了。
|
|
剩下的就是找到对应服务,访问方式,放到nginx的后面
和获取admin密码
|
|
但是可能认证失败,看返回提示是csrf报错,这里需要在demo.yaml
最终解决办法是demo.yaml增加如下配置
|
|
然后
|
|
使用
使用前理一下思路
组件和组件关系
我们来看ansible的一次运行,分别是ansible ad-hoc方式和ansible-playbook 剧本方式。
|
|
发现由如下组件组成:
- 执行器EE(ansible excute enviroment)
在上面是ansible这个命令,其实这个也隐藏了ansible调用的roles和 collections。 一个执行器环境对应awx里面的执行环境。这个执行环境通常是一个容器, 比如quay.io/ansible/awx-ee:latest,也能是一个网络的 quay.io/ansible/network-ee, 或者等等,你也可以pull他们的镜像进行自己的 组装。
这里我们以https://github.com/ansible/awx-ee awx-ee来简单说说。 首先一个ee类的容器通过ansible-builder build出来的。可以按照里面的说明 自己build一下,方便理解ansible ee。在这里你可以放你的ansible.cfg,放你 的默认roles,放你的ansible collections,如果你是一个网络工程师,那你可 以基于network-ee放你想要的plugins等。
你会发现一个execution node是由系统是centos stream 9,包含ansible-runner 和receptor等软件来组成的。recetpor负责和controller通信,ansible-runner 负责实际的运行。
- 资产
\-i后面跟着的就是资产,ansible awx如何做资产管理?和我们CMDB类似,通过
一定的层级关系。
按照如下的关系 机构-清单-组-主机
a)机构表示最大的组织orgnization,比如某某公司
b)清单表示包含各个组各个主机的资产清单
c)组和ansible里面的分组一致
d)主机即ansible里面最小的执行单元
- 凭证
登陆机器,通常需要密码,或者私钥,这个时候你需要保存在凭证的地方。
- 模板
无论是一次执行Ad-Hoc方式还是Playbook剧本方式,都需要定义你要执行的内容。
这个在awx里面是通过定义模板的方式执行。在模板里面你可以定义是否需要选 择,定义你使用的资产,凭证,还有各种参数等等。
从问题出发介绍使用
最后带着这几个问题去了解ansible awx
- 支持LDAP登录
- 支持源码仓库管理
- 支持动态资产
- 能运行hello world
- 机密信息安全加密
- 能通过动态触发
LDAP认证
设置-LDAP里面进行设置即可,尤其注意LDAP 用户 DN 模板开始是cn=还是啥。
在测试登陆的时候可以通过kubectl logs查看对应的日志
|
|
创建机构,部门,团队等等
新建机构
新建团队
支持源码仓库管理
由于下一步的新建项目一般是从gitlab等源里面导入的,所以我们需要新建一个 源凭证。
新建源码项目
由于awx默认会找playbook yaml里面找roles,所以我个人建议的项目结构可以 这样,
|
|
个人也是比较建议通过review工具进行review,比如gerrit
项目目录结构大概建议如下:
- awx项目单独建一个目录,playbook xxx.yml可以迁移到awx-project/下面
- roles通过软链的方法进行链接,如果是项目相关的,则不用软链
- 动态资产可以放到scripts目录中
新建项目
awx里面的项目可以理解为你的ansible工程,每个项目对应一个源码仓库。
这个时候我们就新建好一个项目啦,后面我们的操作都是基于项目操作的。
这里需要注意:
建议勾选启动时更新修订
即每次启动关联这个项目的job都会先从gitlab或者
github进行拉取最新的资源。
另外建议缓存设置一定的超时时间,避免重复拉取~
新建完成以后就会自动去同步项目啦,
你也可以去左边的视图栏的作业里面查看类型为源控制更新的job,在awx里面 job的含义就是一次运行,比如你在ansible服务器上执行的
|
|
执行完一次就是这次的job,每个job是由资源里面的模板生成。
确认在job里面找到project同步成功以后就可以继续进行后面的动作了。
支持动态资产
何为清单?刚开始我也是很迷糊,其实这里你可以理解是去吃饭的时候对应的小 票或者清单,清单的含义就是包含多个资产多个组的列表,对应ansible里面的 执行对象。
左边选择资源下面的清单,添加清单
动态资产
创建完清单点击清单进入详情页面,选择源,添加
添加源,这里选择到我们自己的测试python脚本
|
|
注意脚本需要增加可执行权限,测试的时候可以用如下命令测试
|
|
这个时候进入清单里面的源选项,进行同步,如下是同步好对应的的job输出
这个时候之前动态的资产就导入了
这里关于资产你也可以导入类似aws等云平台的资产,你可以参考更多的关于awx的资产添加 文档。
个人觉得动态资产比较方便导入cmdb等信息,手动维护失去了自动化的味道。 当然你也可以手动维护在你的源码仓库里面,自动更新仓库。
新建机器凭证
机器导入了,再对他们执行任务之前,我们还需要配置用于登陆的私钥或者密码。
终于配置好了机器私钥,离hello world又近了一步。
能运行hello world
创建hello world模板
点击模板,新建模板
需要注意
- 选择刚刚创建的
清单
,包含两个机器, - 选择对应的
项目
- 选择对应的
机器凭证
- 执行环境刚开始建议不选,否则你可能会提示没有容量
这里有启动提示的选项,这个就是你点击运行的时候,是否让你选,如无必要可 以不选。
最终创建好了以后,如下界面
可以点击启动了。刚开始别急,会先同步项目文件,同步资产,具体你可以在左侧作业选项里面看到。
机密信息安全加密
playbook的yaml加密
|
|
总结下步骤
- ansible-vault encrypt 加密你的文件以后,会获得一个密码
- 在awx里面新建一个type为Vault的类型的credential
- 在你新建的job模板里面的credential里面添加你新建的vault类型的 credential
- 再次尝试运行
这样直接加密会影响可读性,其实我们只要把密码抽离到vars就好了。
ssh密码从hashicorp vault获取
目前我能找到用的到的地方是当你再次创建凭证的时候, 用户名和密码等可以点击选择外部的hashicorp vault
playbook里面引用lookup from vault or hashicorp vault
有的时候我们可能想在playbook里面引用hashicorp的vault信息
hashicorp这个目前还在了解中,可能不支持。
ansible vault其实可以通过加密vars.yml或者加密defaults/main.yml等方式来 控制。
通过var_files参数控制
|
|
|
|
我们只需要在指定的roles的vars/main.yml放置我们的加密信息
ansible一样可以识别出来的,具体不再演示。
能通过动态触发
既然你已经编辑好很多的模板了,但是你觉得每次都手点也是着实麻烦,或者和 其他系统接入的时候也方便。
那么请参考如下两个文档。
- YOUR_AWX_URL/api/v2
- https://docs.ansible.com/ansible-tower/latest/html/towerapi/api_ref.html
如何认证? 一个简单的方式是
|
|
触发一个ad-hoc命令
类似 anible -i test all -m shell -a "xxx"
我们可以很轻松的触发一个
command job运行。
|
|
这个时候我们可以获取对应的258的结果
|
|
那在很多填api的地方只能填header怎么办呢,
|
|
这样测试下就可以了
在awx的命令执行中,你可能希望执行一行命令的时候能够通过extra vars传过
来,默认是不可以在command里面嵌入jinja的,你需要在
xxx.com/#/settings/jobs/details的里面进行设置,把 额外变量何时可以包
含 Jinja 模板
选项设置为always。
也就是这样,我们技术廉价地实现了指令下发功能。
触发job template
如果嫌麻烦,可以直接打开你的awx网页,抓下动态的api就好了。 最终api是这个 http://xxx/api/v2/job_templates/NUMBER/launch/