金鱼哥RHCA回忆录:DO447使用Ansible与API通信--使用Ansible剧本与Api交互

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

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


📜11.2.1 与API交互

Red Hat Ansible Engine可以与服务提供的任何HTTP API交互,包括RESTful API。由于各种原因,可能需要这种交互。例如,该服务可能位于运行Ansible托管系统的网络的外部,可能没有特定的Ansible模块来与该服务交互,或者Ansible模块可能没有公开所需的功能。

为了访问这些api, Ansible提供了uri模块。该模块连接到一个给定的URL,控制连接的参数并对响应进行操作。唯一需要的参数是url,表示要连接的HTTP或HTTPS完整url。

这是一个使用uri模块的非常简单的示例任务:

- name: Check that the page is reachable and returns a status 200 using GET
  uri:
    url: http://www.example.com 

但是,通常必须为Ansible模块指定method参数,该参数用于指定用于连接到服务器的HTTP方法。method参数最method的选项是:

📑GET

方法从由请求的URL标识的服务获取实体。这是默认值。


📑POST

请求服务将请求体中包含的实体存储在URL所标识的资源下。


📑PUT

请求服务将在请求体中发送的实体存储为URL标识的资源,如果存在则修改它。


📑DELETE

删除由请求的URL标识的服务中的实体。


📑PATCH

用正文中的值修改由请求URL标识的实体。只有修改后的值必须在主体中。

控制如何连接到服务的下一个选项使用headers参数。此参数是一个字典,可以将自定义HTTP头添加到请求中。例如:

headers:
  Cookie: type=Test

下面是一个更高级的示例,使用到目前为止介绍的参数:

- name: Get an entity and set a Cookie
  uri:
    url: https://example.com/entity/1
    method: GET
    headers:
      Cookie: type=TEST

📜11.2.2 将信息发送到API

既然知道了如何调用API,就可以开始向任何API发送信息了。发送此信息有两个互斥的参数:src和body。

src选项指向一个包含您想要发出的HTTP请求主体的文件。或者,您可以使用body选项,它用YAML语法在剧本中定义HTTP请求的正文。

根据接收服务期望的格式,您可能需要使用参数body_format。该参数的选项有:raw、json和form-urlencoded。对于REST api,使用json, 对于传统的基于表单的页面,使用form-urlencoded。

例如,登录到一个服务可以通过以下方法实现:

- name: Login to a form-based webpage
  uri:
    url: https://example.com/login.php
    method: POST
    body_format: form-urlencoded
    body:
      name: your_username
      password: your_password
      enter: Sign in

📜11.2.3 处理API的响应

任何HTTP服务返回的第一种信息是响应的状态代码。使用status _code选项告诉uri模块您期望成功时的状态代码。如果响应中的状态码不同,任务将失败。

其次,您必须处理响应本身。

如果您想将响应保存为一个文件,请使用dest参数指定该文件。

要在剧本中使用响应,请使用return_content选项来指示应该将响应体添加到结果字典中。使用register将其保存在一个变量中。

这里你可以看到一个如何使用请求响应的例子:

- name: Check the contents of the response
  uri:
    url: http://www.example.com
  return_content: yes
  register: response
  failed_when: "'SUCCESS' not in response.content"

下面是另一个实际示例,它将GitLab APlv4调用返回的数据解析为Ansible中的变量。变量my_private_ token是在GitLab接口中设置的个人访问令牌,可能是从Ansible Vault保护的文件加载到剧本中。API调用返回的JSON是一个字典列表,其中每个字典包含一个用户的信息:关键用户名包含用户的用户名。
在这里插入图片描述


📜11.2.4 HTTP安全性设置

uri模块还支持Digest,、Basic或WSSE身份验证,可以通过使用url_username和url_password参数来控制。如果远程服务支持基本身份验证,但此模块身份验证失败,则使用force_basic_auth参数尝试强制基本身份验证。

一个更安全的选项是使用私钥建立到服务器的安全连接。使用client_cert参数参考PEM证书链文件。如果证书链文件不包含密钥,则使用client_key参数将模块指向存储密钥的文件。

最后,如果必须避免TLS证书验证,则将validate_certs参数设置为false。此设置会降低连接的安全性。


📜11.2.5 使用过滤器准备和解析数据

在前面的章节中,您已经看到了如何使用过滤器来转换数据。在处理HTTP和REST api时,有几个过滤器非常有用。

url支持US-ASCIl字符集的一个有限子集。要确保URL被正确编码,请使用urlencode过滤器。
在这里插入图片描述

to_json和from_json过滤器在封送数据到API和从API封送数据时也很有用。

xml模块还可以与过滤器一起用于处理来自某些API的数据。


📜11.2.6 课本练习

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

📑1. 按要求拉取实验代码。

[student@workstation ~]$ cd git-repos/
[student@workstation git-repos]$ git clone http://git.lab.example.com:8081/git/api-interaction.git
[student@workstation git-repos]$ cd api-interaction

📑2. 查看对应的清单文件

[student@workstation api-interaction]$ cat inventory.yml 
tower:                      # 主机组
  hosts:
    tower.lab.example.com:
  vars:
    template_name: DEV ftpservers setup              # 已存在模板的名称
    copy_template_name: Exact copy of DEV ftpservers setup     # 要创建的模板的名称
    tower_fqdn: tower.lab.example.com                    # API URL
    tower_user: admin
    tower_password: redhat

📑3. 修改tower_copy_template.yml 剧本。

添加任务以复制和启动作业模板。为了方便,可以在~/DO447/solutions/api-interaction/目录下找到已经编辑过的文件。

[student@workstation api-interaction]$ cp -iv ~/DO447/solutions/api-interaction/tower_copy_template.yml  .
[student@workstation api-interaction]$ ansible-playbook tower_copy_template.yml --syntax-check

playbook: tower_copy_template.yml

[student@workstation api-interaction]$ ansible-playbook tower_copy_template.yml

注意:

tower_copy_template.yml 的剧本不是幂等的。如果出现错误,模板被错误地创建了,请在再次运行修正后的剧本之前删除模板。


📑4. 修改tower_add_survey.yml剧本将一个调查添加到作业模板并激活它。

为了方便,可以在~/DO447/solutions/api-interaction/ 目录下找到已经编辑过的文件。

[student@workstation api-interaction]$ cp -iv ~/DO447/solutions/api-interaction/tower_add_survey.yml  .
cp: overwrite './tower_add_survey.yml'? y
'/home/student/DO447/solutions/api-interaction/tower_add_survey.yml' -> './tower_add_survey.yml'

[student@workstation api-interaction]$ ansible-playbook tower_add_survey.yml --syntax-check

playbook: tower_add_survey.yml
[student@workstation api-interaction]$ ansible-playbook tower_add_survey.yml
PLAY [Using the uri module to add a survey] **************************************************

TASK [Add a survey to the existing Job Template using the uri module] *************************
ok: [tower.lab.example.com]

TASK [Enable the survey] ***************************************************************
ok: [tower.lab.example.com]

PLAY RECAP *****************************************************************************
tower.lab.example.com      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[student@workstation api-interaction]$ ansible-playbook tower_add_survey.yml --tags with_variable

在这里插入图片描述


📑5. 修改tower_template_cleanup.yml剧本删除复制的模板。

为了方便,可以在~/DO447/solutions/api-interaction/目录下找到已经编辑过的文件。

[student@workstation api-interaction]$ cp -iv ~/DO447/solutions/api-interaction/tower_template_cleanup.yml .
cp: overwrite './tower_template_cleanup.yml'? y
'/home/student/DO447/solutions/api-interaction/tower_template_cleanup.yml' -> './tower_template_cleanup.yml'
[student@workstation api-interaction]$ ansible-playbook tower_template_cleanup.yml --syntax-check

playbook: tower_template_cleanup.yml
[student@workstation api-interaction]$ ansible-playbook tower_template_cleanup.yml

📑6. 更新代码。

[student@workstation api-interaction]$ git add .
[student@workstation api-interaction]$ git commit -m "Tower API interaction"
[student@workstation api-interaction]$ git push

📑7. 清空实验

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

📜11.3 章节实验

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

📑1. 拉取实验代码。

[student@workstation ~]$ cd /home/student/git-repos
[student@workstation git-repos]$ git clone \
http://git.lab.example.com:8081/git/api-review.git
[student@workstation git-repos]$ cd api-review

📑2. 按要求,创建模板副本。

使用Ansible uri模块,使用Ansible Tower REST API创建一个现有的New模板Job模板的副本。要创建剧本,请使用本课程中的变量、过滤器和任何其他适用的Ansible最佳实践。

使用以下名称和位置来修改现有的剧本和清单。注意,名称是区分大小写的。

[student@workstation api-review]$ vim inventory.yml 
tower:
  hosts:
    tower.lab.example.com:
  vars:
    template_name: New template
    copy_template_name: Review template
    tower_fqdn: tower.lab.example.com
    tower_user: simon
    tower_password: redhat123
[student@workstation api-review]$ vim copy_template.yml
---
- name: Using the uri module to connect to tower
  hosts: tower
  gather_facts: false

  tasks:
    - name: Copy the existing New template using the uri module
      uri:
        url: "https://{{ tower_fqdn }}/api/v2/job_templates/{{ template_name | urlencode }}/copy/"
        validate_certs: no
        method: POST
        return_content: yes
        force_basic_auth: yes
        user: "{{ tower_user }}"
        password: "{{ tower_password }}"
        status_code: [201, 202]
        body:
          name: "{{ copy_template_name }}"
        body_format: json

📑3. 执行剧本。

[student@workstation api-review]$ ansible-playbook copy_template.yml

在这里插入图片描述


📑4. 修改提供的template_cleanup.yml的剧本删除原来的新模板模板。

使用DELETE方法。

[student@workstation api-review]$ vim template_cleanup.yml 
---
- name: Using the uri module to delete a Job Template
  hosts: tower
  gather_facts: false

  tasks:
    - name: Delete an existing Ansible Tower Job Template using the uri module
      uri:
        url: "https://{{ tower_fqdn }}/api/v2/job_templates/{{ template_name | urlencode }}/"
        validate_certs: no
        method: DELETE
        return_content: yes
        force_basic_auth: yes
        user: "{{ tower_user }}"
        password: "{{ tower_password }}"
        status_code: 204

📑5. 执行剧本。

[student@workstation api-review]$ ansible-playbook template_cleanup.yml

📑6. 上传代码。

[student@workstation data-review]$ git status
[student@workstation data-review]$ git add --all
[student@workstation data-review]$ git commit -m "Updated review playbooks"
[student@workstation data-review]$ git push

📑7. 评分与清楚实验。

[student@workstation ~]$ lab api-review grade
[student@workstation ~]$ lab api-review finish

💡总结

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

以上就是【金鱼哥】对 第十一章 使用Ansible与API通信--使用Ansible剧本与Api交互 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

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

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

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

目录
相关文章
|
2月前
|
前端开发 API UED
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
81 2
|
4月前
|
开发框架 JSON API
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
【7月更文挑战第22天】在Python Web开发中,设计高效的RESTful API涉及选择框架(如Flask或Django)、明确资源及使用HTTP方法(GET, POST, PUT, DELETE)来操作数据。响应格式通常是JSON,错误处理也很重要。示例展示了使用Flask创建图书管理API,包括版本控制、文档化、安全性和性能优化是最佳实践。这样的API使数据交互更顺畅。
94 2
|
3天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
11 1
|
1月前
|
前端开发 API 开发者
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
38 3
|
2月前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
74 1
|
3月前
|
Kubernetes 监控 API
在k8S中,各模块如何与API Server进行通信的?
在k8S中,各模块如何与API Server进行通信的?
|
4月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
【7月更文挑战第13天】在Web开发中,AJAX和Fetch API是实现页面无刷新数据交换的关键。在Flask博客系统中,通过创建获取评论的GET路由,我们可以展示使用AJAX和Fetch API的前端实现。AJAX通过XMLHttpRequest发送请求,处理响应并在成功时更新DOM。Fetch API则使用Promise简化异步操作,代码更现代。这两个工具都能实现不刷新页面查看评论,Fetch API的语法更简洁,错误处理更直观。掌握这些技巧能提升Python Web项目的用户体验和开发效率。
58 7
|
4月前
|
前端开发 API UED
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
【7月更文挑战第15天】Python后端(Django/Flask)与前端通过AJAX或Fetch API实现异步交互,提升Web应用体验。Python提供强大的后端支持,AJAX用于不刷新页面的数据交换,Fetch API作为现代标准,基于Promise简化HTTP请求。结合两者,构建高效、流畅的交互系统,优化响应速度和用户体验,开启Web开发新篇章。
80 5
|
4月前
|
消息中间件 API 数据库
在微服务架构中,每个服务通常都是一个独立运行、独立部署、独立扩展的组件,它们之间通过轻量级的通信机制(如HTTP/RESTful API、gRPC等)进行通信。
在微服务架构中,每个服务通常都是一个独立运行、独立部署、独立扩展的组件,它们之间通过轻量级的通信机制(如HTTP/RESTful API、gRPC等)进行通信。
|
4月前
|
前端开发 JavaScript API
惊天揭秘!AJAX与Fetch API如何让你的前后端交互秒变‘神级操作’!
【7月更文挑战第15天】在Web开发中,AJAX和Fetch API革新了前后端交互,告别了表单提交带来的页面刷新。AJAX利用XMLHttpRequest实现部分页面更新,开启无刷新时代;Fetch API作为现代替代,以其简洁和Promise支持简化异步操作。从AJAX的先驱地位到Fetch API的进化,两者提升了Web应用的性能和用户体验,成为现代开发的必备技能。
48 2