Ansible Tower 的 API 入门
欢迎来到入门系列的另一篇文章。API(应用程序编程接口),或者我更喜欢称之为自动化信息的神奇之地,可以以多种方式使用。在这篇入门文章中,我们将讨论 Red Hat Ansible Tower 的 API,以及如何使用它提取信息以用于您的剧本和其他工具。
这篇文章的想法来自 David Federlein 在开发一个新的 Ansible Tower 演示和演示时产生的。我将在文章中参考该代码库,您可以在整个过程中遵循该代码库。请注意,此演示使用 Vagrant 和 VirtualBox,因此如果您想自行创建演示,则需要安装这些应用程序。
Ansible Tower 的 API
Ansible Tower 的 API 是完全可浏览的。您可以在浏览器中键入以下内容以导航到实例的 REST API: http://<Tower server name>/api/v2
。到达那里后,您可以单击任何列出的链接,查看在 Ansible Tower 中加载的特定属性的当前对象。您在 Ansible Tower 的 UI 中可以执行的所有操作都可以在 API 中执行;您还可以使用它查看从凭据到用户的各种内容。 正如我们将在下一节中介绍的,您可以手动发布到 API,或者通过剧本进行调用。
发布到 API
您可以通过多种不同的方式调用 API,但今天我们将重点介绍两种最基本的方式
- 从 Ansible Tower 的 REST API 接口手动操作
- 从剧本
我这里所说的“基本”是指这些方法仅通过 Ansible Tower 完成。如大多数人所知,您可以使用 Ansible Tower 中的信息与其他应用程序一起完成一些非常棒的事情。
我们不仅能够通过这些方法配置和修改 Ansible Tower,而且还能演示您可以通过 API 调用启动作业。这将允许您与企业基础设施的其他方面更紧密地集成,并在围绕这些资源和作业模板配置的基于角色的访问控制下运行 Red Hat Ansible Engine 工作负载的能力。
手动发布
首先,从 API 接口发布到 API 的最简单(尽管不是最快或最自动)的方法是。您可以在此处选择要发布到的对象。每个对象在页面底部都有一个模板,该模板显示发布中可能包含的字段。
例如,假设您想通过 API 将一个项目添加到您的 Ansible Tower 实例中。您只需导航到 Ansible Tower 的 API 屏幕 (https://<towerip>/api/v2)
,选择项目 URL (/api/v2/projects/)
,然后向下滚动到底部。在那里显示的内容将类似于以下内容
{
"name": "",
"description": "",
"local_path": "",
"scm_type": "",
"scm_url": "",
"scm_branch": "",
"scm_clean": false,
"scm_delete_on_update": false,
"credential": null,
"timeout": 0,
"organization": null,
"scm_update_on_launch": false,
"scm_update_cache_timeout": 0
}
获得该内容后,使用来自环境的相关信息填充引号。将它粘贴到您的字段中后,点击 POST。如果发布成功,您可以在 Ansible Tower UI 和 API 中查看该项目。
如果失败,您将收到有关错误请求的通知。修复错误的方法将在其下方引号中显示。 例如,如果您正在创建用户,但没有为该用户输入密码,则它将失败并返回以下错误
{
"password": [
"This field may not be blank."
]
}
如果您在发布到 API 时遇到任何问题(例如上面的错误),可以在 UI 右上角的 GET 旁边的 OPTIONS 按钮为您提供很大帮助。OPTIONS 按钮描述了您希望发布到的特定对象或端点支持的 POST、PUT 和 PATCH 的可接受值。
修复了内容字段中发现的错误后,再次点击“发布”,并注意该对象现在已成功添加到 Ansible Tower 中。
通过剧本发布
发布到 Ansible Tower 的 API 的另一种方法是通过剧本。我在这篇文章开头链接的 GitHub 库在整个安装后剧本中都这样做了。在安装完成后,几乎所有操作都是通过 API 完成的。
为了查看它在实际中的运行方式,让我们同步您刚刚添加到实例中的那个项目。这需要您对 Ansible 剧本的构造有所了解。如果您需要帮助或想复习您的剧本知识,您可以访问我们的文档。
启动作业同步的剧本利用了 Ansible 中的URI 模块。此模块用于与 Web 服务交互,例如 Ansible Tower API。此确切的剧本可以在我上面链接的代码库中找到,位于 /roles/tower/main.yml
中。
- name: kick off project sync
uri:
url: https://127.0.0.1/api/v1/projects/7/update/
method: POST
user: admin
password: "{{ towerpass }}"
validate_certs: False
status_code:
- 200
- 201
- 202
when: response.status == 201
在本剧本任务中,我们告诉 Ansible 导航到您项目的 API URL。在本例中,它是 https://127.0.0.1/api/v2/projects/7/update/
。请注意,项目在更新之前有一个数字。项目在 Ansible Tower 中根据它们进入 Ansible Tower 的时间被分配一个数字。此数字只能通过导航到项目的 API 接口来找到 https://<your_ip_here>/api/v2/projects/
。到达那里后,您需要找到您想要同步的项目,然后向该项目编号的更新端点发出 POST 请求。此示例对项目编号 7 进行更新。
找到要更新的正确项目后,您需要向更新端点发出 POST 请求。在本例中,由于我们正在更新项目 7,因此端点为 https://127.0.0.1/api/v1/projects/7/update/
。
为了使此 POST 请求与 URI 模块一起成功工作,您还需要将您用来登录 Tower 的 API 用户凭据传递给 API。在本例中,我们使用默认的管理员用户。您可以使用任何具有足够权限进行此类 POST 请求的用户。
启动作业
现在,标题可能看起来有点含糊。“杰克,在 Ansible Tower 中启动作业并不难。” 这是正确的,但是对于此示例,我们将从一个剧本任务中在 Ansible Tower 中启动一个作业,这又是您可以通过调用 API 来完成的另一件事。我将要提到的具体示例可以在 vagrant-common 角色(/roles/vagrant-common/main.yml
)中找到。
现在,当你戴上眼镜后,我正在缩小的任务可以在下面的示例中找到。
name: kick off the provisioning job template
shell: "curl -f -H 'Content-Type: application/json' -XPOST --user
admin:{{ towerpass }}
https://172.16.2.42/api/v2/job_templates/8/launch/ --insecure"
when: inventory_hostname == 'demovm4'
乍一看,您会看到正在使用的 shell 模块,它正在运行一个 curl 命令到一个特定的 https 端点。碰巧的是,这个 https 端点是用于启动特定作业模板的 API 端点。
该特定作业模板在 Ansible Tower 中被分配了一个编号。为了不必通过 API 挖掘以找到您的特定作业模板端点,一个快速简便的方法是导航到您想要通过 API 启动的作业模板。到达那里后,查看 URL,分配给它的数字将出现在那里。
找到正确的作业模板后,https 端点将类似于 api/v2/job_templates/8/launch/
。使用 -XPOST
在 curl 命令中命中该端点,您应该就可以运行了。