暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从零教你通过Ansible和AWX学会一键部署简单应用(下)

云计算Guide 2021-10-19
6655

写在前面:接上文,这篇文章主要用来说明AWX的安装、基本操作和REST API的调用。

4、AWX的安装配置及使用

4.1 快速认识AWX

AWX 是一个开源社区项目,提供用于管理 Ansible 项目的软件。AWX 托管在 GitHub 上,并提供基于 Web 的用户界面、REST API 和适用于 Ansible 的任务引擎。

Ansible 是一款开发运营工具,可自动执行预置、配置管理、应用程序部署、内部服务编排、持续交付和许多其他 IT 流程。直观的 AWX 控制面板让您能够安排和部署 Ansible Playbook,并提供集中的日志记录、审计和系统跟踪。AWX 可提供 Ansible Tower 的源代码,Ansible Tower 是 AWX 的商业版本。我们安装的是AWX的开源版本。
Git地址:https://github.com/ansible/awx

4.2 Mac下安装AWX

安装版本:17.1.0 (最新版本没有在本机安装成功,此版本安装没有问题)
参考文档:https://github.com/ansible/awx/blob/17.1.0/INSTALL.md

  1. 安装步骤:参考上述官方給的文档,运行AWX需要Ansible、Docker、docker Python module、Python等模块,安装这些参考官方文档所給链接即可,没有难度,这里就不在做安装说明了。

安装完上述模块之后,clone 或者直接下载压缩包进行解压安装。

git clone -b 17.1.0 https://github.com/ansible/awx.git

  1. 修改配置文件:进入 installer目录 修改配置文件inventory
# admin_password=password   改为

admin_password=password

  1. 安装:进入installer目录,执行安装命令如下:
ansible-playbook -i inventory install.yml 

  1. 安装完成,查看结果,运行命令   docker ps
dengzhaoping@MacdeMacBook-Pro ~ % docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED      STATUS       PORTS                    NAMES
ce4f1cc71631   ansible/awx:17.1.0   "/usr/bin/tini -- /u…"   5 days ago   Up 2 hours   8052/tcp                 awx_task
bc00a5d32f8d   ansible/awx:17.1.0   "/usr/bin/tini -- /b…"   5 days ago   Up 2 hours   0.0.0.0:8081->8052/tcp   awx_web
58bb2a1609f1   redis                "docker-entrypoint.s…"   5 days ago   Up 2 hours   6379/tcp                 awx_redis
c00154fe715e   postgres:12          "docker-entrypoint.s…"   5 days ago   Up 2 hours   5432/tcp                 awx_postgres

  1. 访问,浏览器输入地址http://localhost:8081/#/login
    ,说明安装完成。
  1. 最新版本安装可以参考文档:https://github.com/ansible/awx/blob/19.4.0/INSTALL.md

4.3 AWX Web端的使用

在使用之前,先了解下这几个概念,对后续操作十分重要:

上图中几个模块分别代表是
模板(Templates):将清单、项目和凭证关联起来的任务模板,一次创建,多次使用,可修改
凭证(Credentials):受控主机的用户名、密码(秘钥)以及权限控制
项目(Projects):一个完整可运行的 Ansible 项目
清单(Inventories):对应 Ansible 的 Inventory,即主机组和主机IP清单列表
作业(Jobs):模板每一次运行视为一次作业

下面我们通过AWX页面安装一个Nginx服务来说明一下。

  1. 创建 Inventories 登录AWX,左侧菜单选择 Inventories ,下拉选择 Add inventories,如下图

来到新增主页面,填上Name和Description,点击保存,如下图

在详情页进入Hosts菜单,选择Add下拉框,如下图

把我们要部署的主机IP給配置进去,然后保存。第一步配置完成。

往Inventories中添加hosts也能在左侧菜单栏中的Hosts中完成。

  1. 创建 Credentials 左侧菜单栏点击Credentials,在页面中选择Add按钮,来到新增页面,在页面中输入Name,选择 Organization,Credential Type 选择 Machine,然后配置我们的连接账号和密码,其他不是必填参数可以不用配置,先忽略即可。页面如下图

点击保存,Credentials 创建完成。

  1. 创建 Projects

左侧菜单栏选择Projects,点击Add来到新增主页面,这里用我的项目作为demo:如下图

git地址:https://github.com/ManDzp/awxdemo

点击保存,Projects配置完成。

  1. 创建 Templates,把我们前三步配置好的Inventories、Credentials、和Projects給关联起来,就完成了一个简单模板的配置,如下图:

点击保存,Templates配置完成。

  1. 启动 Templates

进入模板详情页,点击下方 Launch 进行运行。

  1. 查看运行结果,由于我已经在机器上装了nignx,所以看到的change=0,第一次安装change=2,failed=0 就表示安装成功
  1. 验证访问:访问地址 http://123.56.79.30:8080/
    ,结果如下图,通过AWX安装nginx完成。

4.4 AWX REST API的使用

在上一小节中,我们简单的学习了Web端的使用,这一小节中我们通过AWX的 REST API来完成一个nginx的安装,更加方便简单的进行操作部署应用。
ansible-tower(3.8.1) API官方文档:https://docs.ansible.com/ansible-tower/3.8.1/html_zh/towerapi/index.html#

本地查看接口API:浏览器访问地址 http://localhost:8081/api/
,如下图:

点击上图红框链接即可看见详细接口,或者直接访问 http://localhost:8081/api/v2/
也能看见接口列表。
接口详细说明文档参考 https://docs.ansible.com/ansible-tower/3.8.1/html_zh/towerapi/api_ref.html#/
,开源版本的接口没有商业付费版本的丰富,满足我们的学习需求没有问题。
通过REST API 安装nginx的流程和Web端操作基本一致,调用流程如下图所示:后面我将按照步骤来说明每个接口的调用。

  1. 权限认证,获取token:分为创建令牌和生成token生成两个步骤
    第一步是权限认证,调用AWX接口如果没有权限认证是无法访问的。获得token是我们调用接口的第一步。注意:此操作在浏览器访问AWX API接口,直接发起post请求
    参考官方教程:https://github.com/ansible/awx/blob/devel/docs/auth/oauth.md

    先创建令牌 请求API:/api/v2/applications/

    接口详细说明:https://docs.ansible.com/ansible-tower/3.8.1/html_zh/towerapi/api_ref.html#/Authentication/Authentication_applications_list_0

    我们浏览器直接访 http://localhost:8081/api/v2/applications/
    ,关键字段有 client_type(public)、authorization_grant_type(password)、organization(我们用系统默认组织)
    请求入参
{
    "name":"test-创建令牌",
    "description":"描述-创建令牌",
    "client_type":"public",
    "authorization_grant_type":"password",
    "skip_authorization":"true",
    "organization":1

}

点击发起post请求,如下图所示。

令牌创建完成,返回出参会返回一个id-2,这个就是下一步用来生成token的入参

生成token
请求API:/api/v2/tokens/

接口详细说明:https://docs.ansible.com/ansible-tower/3.8.1/html_zh/towerapi/api_ref.html#/Authentication/Authentication_tokens_create_0

我们浏览器直接访问http://localhost:8081/api/v2/tokens/
,关键字段 application(创建令牌返回的id)

{
    "description""My Access Token",
    "application"2,
    "scope""write"
}

这样接口就会返回一个token,这个token我们一定要保存好,后续调用API接口都需要这个token。如下图所示:

验证token是否有效:终端执行如下命令,可以看到控制台输出,说明token有效

curl -H "Authorization: Bearer 7aNUo5pnX2apA5BFMod5lrWmY7AFm4" http://localhost:8081/api/v2/credentials/

到此token认证完成,执行结果如下图所示

以下几个步骤我们通过Java代码通过http服务进行AWX API的调用,我们只需在发起http请求的时候把我们第一步的token值带上,这样就不会出现接口访问需要登录的情况。关键代码如下

        //设置请求token
        String authorization = "Bearer " + token;
        httpPost.setHeader("Authorization", authorization);

  1. 创建主机组 请求API:/api/v2/inventories/

    接口详细说明: https://docs.ansible.com/ansible-tower/3.8.1/html_zh/towerapi/api_ref.html#/Inventories/Inventories_inventories_create

    请求入参代码如下:
        JSONObject createInventory = new JSONObject();
        createInventory.put("name""Inventory" + (new Date()));
        createInventory.put("description""新增Inventory");
        createInventory.put("organization""1");

入参关键字段:organization
出参返回主机组ID

  1. 创建主机ip清单列表 请求API:/api/v2/hosts/

    接口详细说明: https://docs.ansible.com/ansible-tower/3.8.1/html_zh/towerapi/api_ref.html#/Hosts/Hosts_hosts_create

    请求入参代码如下:
        JSONObject createHost = new JSONObject();
        createHost.put("name", ipAddress);
        createHost.put("description", ipAddress + "阿里云centos主机");
        createHost.put("inventory", inventoryId);

入参关键字段:inventory 创建主机组返回的id

  1. 创建凭证 请求API:/api/v2/credentials/

    接口详细说明: https://docs.ansible.com/ansible-tower/3.8.1/html_zh/towerapi/api_ref.html#/Credentials/Credentials_credentials_create

    请求入参代码如下:
        JSONObject createCredential = new JSONObject();
        createCredential.put("name""阿里云主机凭证" + new Date());
        createCredential.put("description""阿里云主机凭证集合清单");
        createCredential.put("organization""1");
        //credential_type = 1--表示通过账号密码认证
        createCredential.put("credential_type"1);
        JSONObject inputs = new JSONObject();
        inputs.put("username", Constants.DEFUALUT_ROOT);
        inputs.put("password", Constants.DEFUALUT_PASSWORD);
        createCredential.put("inputs", inputs); 

入参关键字段:inputs 对象,用来存放主机的账号密码。
出参返回凭证ID

  1. 创建项目,创建项目的时候,由于要读取远程git配置,可能会需要些时间,暂时没有找到能够查询projects状态的接口,所以在创建完项目后,需要让程序睡上10s左右,这样才不会导致后续流程出现问题。请求API:/api/v2/projects/

    接口详细说明: https://docs.ansible.com/ansible-tower/3.8.1/html_zh/towerapi/api_ref.html#/Projects/Projects_projects_create

    请求入参代码如下:
        JSONObject createProject = new JSONObject();
        createProject.put("name""createproject-" + (new Date()));
        createProject.put("description""createproject");
        createProject.put("organization"1);
        createProject.put("scm_type""git");
        createProject.put("scm_url""https://github.com/ManDzp/awxdemo");

入参关键字段:scm_type、scm_url
出参返回项目ID

  1. 创建模板--这与Web端不一样,通过API创建模板不需要选择 credentials,而是在运行template时选择credential 请求API:/api/v2/job_templates/

    接口详细说明: https://docs.ansible.com/ansible-tower/3.8.1/html_zh/towerapi/api_ref.html#/Job_Templates/Job_Templates_job_templates_create

    请求入参代码如下:
        JSONObject createJobTemplate = new JSONObject();
        createJobTemplate.put("name""createJobTemplate" + new Date());
        createJobTemplate.put("description""03测试创建项目");
        createJobTemplate.put("job_type""run");
        createJobTemplate.put("inventory", inventoryId);
        createJobTemplate.put("project", projectId);
        createJobTemplate.put("playbook""install-nginx.yml");
        createJobTemplate.put("ask_credential_on_launch"true);

入参关键字段:inventory、project、playbook
出参返回模板ID

  1. 启动运行模板,启动后,我们可以前往Web控制台看任务的执行进度,暂时还没找到通过API查询任务执行结构的接口,只能在控制台查看效果。请求API:/api/v2/job_templates/{jobTemplateid}/launch/

    接口详细说明:请求入参代码如下:
        JSONObject runJobTemplate = new JSONObject();
        int[] credentials = {credentialid};
        //凭证id
        runJobTemplate.put("credentials", credentials);

入参关键字段:jobTemplateid、credentialid
出参返回ID

  1. 访问验证 访问地址:http://123.56.79.30/
    查看nginx已经安装完成:
  1. 待优化功能(todo List)
    最新版本安装
    通过API查询Project的状态,根据状态来运行job而不是让程序sleep
    通过API查看job的输出
    密码没做加密,如果需要部署在生产环境上,在代码中写死账号密码是不可取的,官方有教程

写到最后:经过有一周多的时间,完成了一个简单的自动化脚本配置,学习了Ansible和AWX相关的知识,了解到还是很肤浅,需要进一步加强。写了两篇总结文章来记录一下整个完整的自动化配置流程和我踩过的坑。


文章转载自云计算Guide,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论