金鱼哥RHCA回忆录:DO447使用Ansible与API通信--使用Ansible Tower API启动作业

举报
金鱼哥 发表于 2022/07/01 09:10:12 2022/07/01
【摘要】 第十一章 使用Ansible与API通信--使用Ansible Tower API启动作业

🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家
📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必须努力🔥

🎈支持我:可点赞👍、可收藏⭐️、可留言📝


官网:

https://docs.ansible.com/ansible-tower/3.8.1/html_zh/towerapi/index.html


11.1 使用Ansible Tower API启动作业

11.1.1 Ansible Tower API

Red Hat Ansible Tower提供了一个Representational State Transfer (REST) API。API提供了一种机制,允许管理员和开发人员在web Ul之外控制他们的Ansible Tower环境。自定义脚本或外部应用程序使用标准HTTP消息访问API。当Ansible Tower与其他程序集成时,REST API非常有用。

REST APl的好处之一是,任何支持HTTP协议的编程语言、框架或系统都可以使用该API。这为自动化重复任务和将其他企业IT系统与Ansible Tower集成提供了一种简单的方法。


使用REST API

如果您不熟悉REST API,其实它们的工作方式是相对简单的。客户端向位于统一资源标识符(Uniform Resource identifier, URI)的服务器元素发送请求,并使用标准HTTP方法(如GET、POST、PUT和DELETE)执行操作。REST体系结构提供了客户机和服务器之间的无状态通信通道。每个客户端请求独立于任何其他请求,并包含完成请求所需的所有信息。

下面的示例请求使用HTTP GET方法来检索API的主入口点的表示。可以使用图形化web浏览器或Linux命令行工具手动发出请求。下面的例子使用curl命令从命令行发出请求:

[user@demo ~]$ curl -X GET https://tower.lab.example.com/api/ -k
{"description":"AWX REST API","current_version":"/api/v2/","available_versions":
{"v1":"/api/v1/","v2":"/api/v2/"},"oauth2":"/api/
o/","custom_logo":"","custom_login_info":""}

API请求的输出是JSON格式的,它很容易被计算机程序解析,但是对人们来说阅读可能有点困难。

Red Hat Ansible Tower APl是可浏览的。例如,如果您的Ansible Tower服务器是tower.lab.example.com,可以通过访问https://tower.lab.example.com/api/。您可以单击该页面的/api/v2/链接来浏览特定于api版本2的信息。

下面的示例展示了如何使用curl命令实现这一点。json_pp命令是由perl-JSON-PP RPM包提供的,它可以“美化”API的JSON输出,以便于人们的阅读。

[user@demo ~]$ curl -X GET https://tower.lab.example.com/api/v2/ -k -s | json_pp
{
  "dashboard" : "/api/v2/dashboard/",
  "unified_jobs" : "/api/v2/unified_jobs/",
  "ping" : "/api/v2/ping/",
  "users" : "/api/v2/users/",
  "me" : "/api/v2/me/",
  "system_jobs" : "/api/v2/system_jobs/",
  "ad_hoc_commands" : "/api/v2/ad_hoc_commands/",
  "instance_groups" : "/api/v2/instance_groups/",
  "workflow_job_template_nodes" : "/api/v2/workflow_job_template_nodes/",
  "inventory_sources" : "/api/v2/inventory_sources/",
  "applications" : "/api/v2/applications/",
  "inventory" : "/api/v2/inventories/",
  "project_updates" : "/api/v2/project_updates/",
  "tokens" : "/api/v2/tokens/",
  "notifications" : "/api/v2/notifications/",
  "notification_templates" : "/api/v2/notification_templates/",
  "inventory_updates" : "/api/v2/inventory_updates/",
  "teams" : "/api/v2/teams/",
  "hosts" : "/api/v2/hosts/",
  "credentials" : "/api/v2/credentials/",
  "schedules" : "/api/v2/schedules/",
  "unified_job_templates" : "/api/v2/unified_job_templates/",
  "jobs" : "/api/v2/jobs/",
  "instances" : "/api/v2/instances/",
  "config" : "/api/v2/config/",
  "roles" : "/api/v2/roles/",
  "organizations" : "/api/v2/organizations/",
  "system_job_templates" : "/api/v2/system_job_templates/",
  "credential_types" : "/api/v2/credential_types/",
  "inventory_scripts" : "/api/v2/inventory_scripts/",
  "workflow_job_nodes" : "/api/v2/workflow_job_nodes/",
  "job_events" : "/api/v2/job_events/",
  "groups" : "/api/v2/groups/",
  "workflow_job_templates" : "/api/v2/workflow_job_templates/",
  "job_templates" : "/api/v2/job_templates/",
  "activity_stream" : "/api/v2/activity_stream/",
  "settings" : "/api/v2/settings/",
  "labels" : "/api/v2/labels/",
  "workflow_jobs" : "/api/v2/workflow_jobs/",
  "projects" : "/api/v2/projects/"
}

此入口点在API环境中提供了一组链接。正如您在示例中所看到的,有许多链接可供选择。

下面的示例演示了通过API可访问的信息。要检查在Ansible Tower服务器上执行了哪些操作,可以使用/api/v2/activity_stream/ URI。向该资源发出GET请求,以检索活动流列表:

[user@demo ~]$ curl -X GET \
> https://tower.lab.example.com/api/v2/activity_stream/ -k
{"detail":"Authentication credentials were not provided. To establish a login
session, visit /api/login/."}

正如您在上面的输出中所看到的,并非所有由APl生成的信息都是公开可用的。您需要登录才能访问该资源。

下面的例子显示了当提供了正确的身份验证信息时,activity_stream资源的输出:

[user@demo ~]$ curl -X GET --user admin:redhat \
> https://tower.lab.example.com/api/v2/activity_stream/ -k -s | json_pp

在这里插入图片描述

重要:APl的输出可以分页,如前面的示例所示。出于性能原因,Ansible Tower只返回特定请求的有限数量的记录。下一个值是结果的下一页的URI。如果该值为null,则表示在最后一个页面上。类似地,previous的值是结果的前一页的URI,如果值为null,则位于第一页。

APl的输出是JSON格式的,如果不通过解析器(如json_pp)运行它,可能很难读取JSON格式。您还可以通过图形web浏览器访问可浏览的REST API,以更可读的格式获取相同的信息。下面的例子使用Firefox浏览器访问相同的APl:

在这里插入图片描述

您可以单击API中的各种链接来探索相关资源。

在这里插入图片描述

点击 ? 图标,以获取有关该端点的访问方法的文档。文档还提供了在使用这些方法时返回什么数据的信息。

重要:文档可通过?当你试图理解如何使用Ansible Tower API时,图标是非常有用的。好好利用这个资源。

在这里插入图片描述

还可以通过在图形界面中提供JSON格式的文本或文件,在特定的API页面上使用PUT或POST方法。

在这里插入图片描述


11.1.2 使用API启动作业模板

该API的一个常见用途是启动现有的作业模板。这个示例使用curl命令快速列出如何使用API查找和启动Ansible Tower中已经配置的作业模板。

从Red Hat Ansible Tower 3.2开始,您可以在APl中按名称引用作业模板。

例如,可以使用GET方法获取关于作业模板的信息。下面以Demo作业模板“Demo Job Template”为例说明该方法的使用方法。因为作业模板的名称包含空格,所以必须使用双引号或URL percent encoding (每个空格字符%20)转义它们。

curl -X GET --user admin:redhat \
> https://tower.lab.example.com/api/v2/job_templates/"Demo Job Template"/ -k -s \
> | json_pp

从APl启动作业模板分为两个步骤。首先,使用GET方法访问它,以获得关于启动作业所需的任何参数或数据的信息。然后,使用POST方法访问它以启动作业。

下面的示例使用GET方法获取通过API启动Demo Job Template Job Template所需的参数。输出通过管道传输到json_pp以获得更好的可读性。

[user@demo ~]$ curl -X GET --user admin:redhat \
> https://tower.lab.example.com/api/v2/job_templates/"Demo Job Template"/launch/ -
k -s | json_pp

在这里插入图片描述
在这里插入图片描述

这些信息在Ansible Tower API指南中关于启动作业模板的章节中有更详细的讨论。注意,列出了作业的Inventory和机器Credential的id和名称,启动作业不需要额外的信息。

因为不需要额外的信息,所以可以通过使用POST方法访问URI来启动作业。返回任务的相关信息。特别要注意,作业id(72)返回一个挂起状态,因为它已经启动,但还没有完成。

[user@demo ~]$ curl -X POST --user admin:redhat \
> https://tower.lab.example.com/api/v2/job_templates/"Demo Job Template"/launch/ -
k -s | json_pp

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个示例的JSON格式输出显示该作业的id是72。您可以使用作业id检索更新后的状态信息,例如作业是否已完成。对于作业72,使用URI /api/v2/iobs/72/,如前面输出的url字段所示。

[user@demo ~]$ curl -X GET --user admin:redhat \
> https://tower.lab.example.com/api/v2/jobs/72/ -k -s | json_pp 

它报告作业状态(成功或失败)、作业完成的时间、Ansible Playbook的result_stdout(使用了哪个Playbook),以及关于清单、凭证和作业模板中的项目的其他信息,等等


11.1.3 从Ansible剧本中使用API启动作业

你可以使用Ansible Playbook通过使用uri模块来访问Ansible Tower API来启动作业模板。也可以从Ansible Tower中的一个工作模板运行该剧本,并使用它启动另一个工作模板作为其任务之一。

在剧本中,使用ID或命名URL为作业模板指定正确的URL。您还必须向Ansible Tower提供足够的凭据,以便作为具有启动作业权限的用户进行身份验证。

下面的Ansible Playbook可以使用Ansible Tower API从Ansible Tower服务器的现有作业模板中启动一个新的作业

在这里插入图片描述

  • 要访问API, Ansible需要允许从作业模板启动作业的用户的登录凭据。在本例中,有两个变量用于存储相关信息: tower_user和tower_pass。

  • 剧本还要求Ansible必须连接到的实际APl的URL。本例使用演示作业模板的指定URL。注意作业模板名称中的空格是使用%20代码指定的。你也可以使用urlencode过滤器:tower-job: "{{‘Demo Job Template’ | urlencode})"

  • Ansible可以通过使用uri模块从Ansible Tower服务器访问Ansible Tower API


这个例子的问题是,它在剧本中嵌入了Ansible Tower服务器的身份验证用户名和密码。为了保护这些数据,您应该使用Ansible Vault加密剧本,或者将秘密转移到一个可变文件中,并使用Ansible Vault加密该文件。您应该在将包含这些秘密的文件提交到源代码控制存储库之前完成此操作。

[user@demo ~]$ ansible-vault encrypt api_demo.yml
New Vault password: your_password
Confirm New Vault password: your_password

加密凭证

为了让Ansible Tower使用加密文件(如剧本或包含秘密的可变文件),你必须在Ansible Tower中设置一个能够解密这些文件的Vault Credential。除了任何机器凭据或项目需要的其他凭据之外,您还必须将使用项目的任何作业模板配置为存储凭据。

首先,创建一个Vault Credential,用于存储这些文件的Vault密码。这个凭证被加密并存储在Ansible Tower服务器的数据库中,就像机器凭证一样。以下步骤描述如何创建这种类型的凭据:

  1. 以具有适当角色分配的用户身份登录。如果创建私有凭证,则没有特定的角色要求。如果创建组织证书,需要以组织的Admin角色用户登录。

  2. 单击左侧导航栏中的Credentials,打开Credentials管理界面。

  3. 在CREDENTIAL屏幕上,单击+以创建一个新的CREDENTIAL。

  4. 在NEW CREDENTIAL屏幕上,输入新CREDENTIAL所需的信息。

    输入新凭证的名称,然后从TYPE列表中选择Vault用户具有“组织管理员”权限,可设置该组织将该证书分配给某个组织。如果用户没有管理员权限,则组织字段不存在,只能创建私有凭证

  5. 对于Vault凭据,TYPE DETAILS部分将显示其他字段,如下面的插图所示
    在这里插入图片描述

  6. 两个字段包含解密受Vault保护的Playbooks所需的信息。

    VAULT PASSWORD是用来加密剧本的密码。

    VAULT IDENTIFIER是可选的VAULT ID,只有在使用多个密码加密剧本时才需要。

  7. 击SAVE保存新的保险库凭证。

在准备好Vault Credential之后,您可以创建一个新的作业模板,该作业模板将使用它来解密已加密的一个或多个项目文件。此作业模板必须包含用于将项目文件作为其凭证之一进行解密的保险库凭证。

在这里插入图片描述

完成后,可以使用新的作业模板启动作业。当你启动工作模板时,Ansible Tower使用Vault Credential解密加密的剧本。当它运行剧本时,将执行访问API以启动另一个作业模板的任务。这会在Ansible Tower服务器上启动一个新的作业,使用剧本任务引用的作业模板。

注意:在最新版本的Ansible中,您可以使用不同的Ansible Vault密码对不同的文件进行加密。Ansible Tower可以在同一个作业模板中使用多个Vault凭证,以确保它可以解密项目中使用Ansible Vault加密的所有文件。


基于令牌的身份验证

从Red Hat Ansible Tower 3.3开始,API使用OAuth 2来提供基于令牌的身份验证。任何在请求头中带有有效令牌的API调用都将被验证。有两种令牌: Application Tokens应用令牌和Personal Access Tokens个人访问令牌。

应用令牌是为之前在Tower中创建的应用程序请求的,它代表一个客户端应用程序,该应用程序将频繁地与多个用户访问API。个人访问令牌(PAT)是一种更简单的机制,为单个用户提供对API的访问。

这个例子展示了对个人访问令牌的请求,以及如何使用发出的令牌来启动作业模板。
在这里插入图片描述
在这里插入图片描述

  • 我们使用常规身份验证机制。

  • 保存结果以供以后使用。

  • 使用响应变量中的令牌来提供身份验证。


11.1.4 课本练习

[student@workstation ~]$ lab api-tower start

1. 练习的第一部分,直接使用Ansible Tower提供的REST API。

1.1 在Firefox浏览器中,访问https://tower.lab.example.com/api/。你应该看到你的Ansible Tower服务器的可浏览API。如果没有登录,请以admin用户登录,密码为redhat。

在这里插入图片描述

1.2 单击“/api/v2/”链接,可访问通过APl可访问的所有可用资源的可浏览列表。

在这里插入图片描述

1.3 从列表中,单击/api/v2/ping/链接来访问该URI。会看到最近的心跳时间戳。外部程序可以使用这个URI来验证Ansible Tower服务器是否在运行。
在这里插入图片描述


2. 在Firefox中,使用API从现有的Demo Job Template作业模板启动作业。

2.1 单击页面顶部的Version 2链接,返回到/api/v2/ URI。

2.2 点击/api/v2/job templates/链接,可访问可用的job模板列表。

2.3 从结果列表中,找到包含“name”:“Demo Job Template”的作业模板。找到它的url资源并单击链接来访问模板。链接应该是/api/v2/job_templates/5/或类似的

2.4 请注意,Job Template有一个相关的named _url资源,它提供了一个带有Job Template名称的链接,您可以在调用APl时使用它,而不是使用Job Template的ID在结果页面中,查找Job Template的相关资源launch。

单击与该资源相关联的链接。链接应该是/api/v2/ job_templates/5/launch/或类似的。此链接向该作业模板的启动资源发送GET请求,提供关于从该模板启动作业需要哪些信息的详细信息。

在这里插入图片描述
在这里插入图片描述

2.5 要监视你即将启动的任务的执行,打开另一个Firefox标签,以admin用户登录Ansible Tower web Ul,使用redhat作为Dassword。单击导航栏中的“job”。

2.6 回到https://tower.lab.example.com/api/v2/job_templates/5/launch/标签。向下滚动到此页面的底部,并单击绿色的POST按钮来启动作业。该页面立即使用有关启动作业的JSON信息刷新,包括作业的id号。
在这里插入图片描述

2.7 在Ansible Tower web中快速切换到显示JOBS页面的标签Ul启动的作业应该在已经运行的作业列表的顶部。您可以通过将其ID与另一个选项卡上作业的JSON输出中的ID匹配来确认它就是您启动的作业。


3. curl命令还可以使用API从现有作业模板启动作业。

使用curl从现有的演示作业模板中启动作业。

[student@workstation ~]$ sudo yum install perl-JSON-PP

使用带有名称过滤器的API来搜索Demo Job Template作业模板。确定作业模板的ID。这个ID应该与您在本练习前面使用Firefox时看到的ID相同。为了方便,您可以从~/DO447/labs/api-tower/curl_commands文件中复制并粘贴以下命令。

[student@workstation ~]$ curl -X GET --user admin:redhat \
 https://tower.lab.example.com/api/v2/job_templates/?name="Demo Job Template" \
 -k -s | json_pp

或者

curl -X GET --user admin:redhat \
 https://tower.lab.example.com/api/v2/job_templates/?name="Demo Job Template" \
 -k -s | python3 -m json.tool    # 可以使用python 带的工具来转换

对于这个命令,-k(–insecure)选项指示curl操作,即使它不能验证SSL证书。使用 -s(–silent)选项,curl只显示返回的数据,而不显示进度状态或错误消息。

已经确认了演示作业模板的ID,使用该编号和作业模板的启动资源来获取关于如何启动作业的信息。

[student@workstation ~]$ curl -X GET --user admin:redhat \
https://tower.lab.example.com/api/v2/job_templates/5/launch/ -k -s \
| json_pp

同样,因为可以在不需要用户输入的情况下启动该作业,所以可以向相同的URL发出POST请求,而不需要任何其他数据来启动作业。

[student@workstation ~]$ curl -X POST --user admin:redhat \
https://tower.lab.example.com/api/v2/job_templates/5/launch/ -k -s \
| json_pp

返回到Ansible Tower web Ul标签,显示JOBS页面。curl命令启动的作业现在应该位于已运行作业列表的顶部。同样,通过比较web Ul中的ID和curl的JSON输出中的ID,您可以确认这就是刚刚启动的工作。

在这里插入图片描述


4. 在本练习的第二部分中,您将配置和使用提供的tower_api.yml剧本。

这个剧本使用Ansible Tower API来远程启动一个基于存在的作业模板的新作业。因为访问API的登录名和密码存储在这个playbook中,所以使用ansible-vault命令对其进行加密,密码为redhat。

4.1 拉取最新代码

[student@workstation git-repos]$ cd my_webservers_DEV/
[student@workstation my_webservers_DEV]$ git pull
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 2 (delta 0)
Unpacking objects: 100% (3/3), done.
From http://git.lab.example.com:8081/git/my_webservers_DEV
   0332c83..a6b1b0e  master     -> origin/master
Updating 0332c83..a6b1b0e
Fast-forward
 tower_api.yml | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)
 create mode 100644 tower_api.yml
[student@workstation my_webservers_DEV]$ cat tower_api.yml 
$ANSIBLE_VAULT;1.1;AES256
38373162626337666162356239343939353334326532316165663439646263366433623737393830

[student@workstation my_webservers_DEV]$ ansible-vault view tower_api.yml 
Vault password: redhat
# tower_api.yml - Triggers remotely a new Job from an existing Job Template using Tower's API
# Artur Glogowski <aglogows@redhat.com>
---
- name: Test Tower API
  hosts: localhost

  become: false
  vars:
    tower_user: admin
    tower_pass: redhat
    tower_host: tower.lab.example.com
  tasks:

    - name: Launch Job
      uri:
        url: https://{{ tower_host }}/api/v2/job_templates/DEV%20ftpservers%20setup/launch/
        method: POST
        validate_certs: no
        return_content: yes
        user: "{{ tower_user }}"
        password: "{{ tower_pass }}"
        force_basic_auth: yes
        status_code: 201
      register: this

    - name: Print Output
      debug:
        var: this

4.2 在Ansible Tower实例中,创建了名为vault的新凭据,以提供用于解密新剧本的正确vault密码。将新的凭据与新的API使用作业模板关联。在左侧导航栏单击“模板”

4.3 单击API usage作业模板编辑设置。

4.4 单击CREDENTIAL下面的放大镜按钮。

4.5 在凭据窗口中。单击CREDENTIAL TYPE列表以访问可用凭据类型的列表。

4.6 从列表中选择Vault凭据类型。在下面的窗格中,选择vault凭据名称,并单击select将这个新凭据添加到API使用Job Template中。在作业模板中使用这个新的凭据,Ansible Tower将解密提供的和加密的tower_api.yml剧本访问自己的API开始一个新的工作。

4.7 单击API使用窗口底部的SAVE。

在这里插入图片描述


5. 根据修改后的API使用job Template启动一个新作业。


6. 完成练习。

[student@workstation ~]$ lab api-tower finish

💡总结

RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。

以上就是【金鱼哥】对 第十一章 使用Ansible与API通信–使用Ansible Tower API启动作业 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

💾红帽认证专栏系列:
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章收录在RHCA专栏:RHCA 回忆录

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。

如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。