DO447利用推荐做法进行开发–实施建议实践
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章(第一章 利用推荐做法进行开发–实施建议实践 )收录在RHCA专栏:RHCA 回忆录
📜1. 描述ansible的有效使用
本课程假设您有一些使用Ansible自动化Linux系统管理任务的经验。Ansible是容易学习和容易开始使用。然而,当您使用更高级的特性和更大、更复杂的项目时,管理和维护Ansible剧本或有效地使用它们就变得更加困难。
本课程介绍了红帽Ansible自动化的一些先进功能。讨论了如何有效、高效地使用红帽Ansible自动化系统。有效地使用Ansible不仅仅是关于特性或工具。而是关于实践和组织。
以下三点总结了红帽Ansible自动化的有效利用;这些观点是基于Jeff Geerling的类似陈述:
-
让事情变得简单
-
保持组织
-
经常测试
📜2. 让事情变得简单
Ansible的优点之一是它的简单性。如果您的剧本保持简单,它们将更容易使用、修改和理解。
📑保持剧本的可读性
让你的剧本有良好的评论,易于阅读。尽量使用垂直的空白和注释。总是给play和任务起有意义的名字,以明确play或任务的作用。这些实践有助于记录剧本,并使对失败的剧本运行进行故障诊断变得更容易。
YAML不是一种编程语言。它擅长表达一系列的任务或项目。或者一组键值对。如果你正在努力在Ansible剧本中表达一些复杂的控制结构或条件,那么考虑用不同的方式来处理这个问题。您可以使用模板和Jinia2过滤器来处理变量中的数据,这可能是解决问题的更好方法。
使用本机YAML语法,而不是“折叠”语法。例如,下面的例子不是推荐格式:
下面的语法对大多数人来说更容易阅读:
📑使用现有的模块
当编写一个新的剧本时,从一个基本的剧本开始,如果可能的话,一个静态的清单。当你构建你的设计时,使用debug模块作为存根使用。一旦剧本按预期运行,就可以使用导入和包含将剧本分解成更小的逻辑组件。
如果可以的话,使用Ansible中包含的专用模块,而不是command、shell、raw或其他类似模块。虽然在某些情况下您需要使用这些通用模块,但如果您使用为特定任务设计的模块,那么使您的剧本幂等性和易于维护将会容易得多。
许多模块都有一个默认状态或其他变量来控制它们的功能。例如,yum模块当前假定您所命名的包在大多数情况下都应该存在,但是,您应该显式地指定您想要的状态。这样做可以更容易地阅读剧本,并保护你免受Ansible后续版本中模块默认行为的更改。
📑坚持标准风格
你应该考虑有一个标准的“风格”,以便你和你的同事在写一个可行的项目时遵循。缩进多少空格?你想如何使用垂直的空白?任务、play、角色和变量应该如何命名?应该评论什么,怎么评论?有不止一种合理的方法可以做到这一点。但是拥有一致的标准可以帮助提高可维护性和可读性。
📜3. 保持组织
组织您的Ansible项目以及您如何运行剧本可以在可维护性、故障排除和审计方面有所帮助。
📑遵循命名变量的约定
变量命名尤其重要,因为Ansible有一个相当平坦的名称空间。使用描述性的变量。如apache_tls_port而不是描述性较低的变量如在角色中,使用角色名作为角色变量的前缀是一个很好的做法。例如,如果你的角色名为myapp,那么你的变量名可以以myapp_ 开始,以帮助命名它们从其他角色和plavbook中的变量。
变量名应该澄清内容。像apache_max_keepalive这样的名称清楚地解释了关联值(或多个值)的含义。前缀角色和组变量的名称变量所属的角色或组。port_number比apache_port_number更容易出错。
📑规范项目结构
在文件系统中构建Ansible项目的文件时,使用一致的模式。有许多有用的模式,但下面是一个很好的例子:
剧本结构的好处之一是,您可以将您的大型剧本划分为更小的文件,使其更具可读性,而且那些较小的子剧本可以包含用于特定目的的剧本,您可以独立运行这些剧本。
📑使用动态清单
尽可能使用动态清单。动态清单允许从一个中央真相来源集中管理您的主机和组,并确保清单自动更新。动态清单与云供应商联合起来特别强大。容器和虚拟机管理系统。这些系统可能已经有了Ansible可以使用的清单信息。
如果您不能使用动态清单,那么其他工具可以帮助您动态地构造组或其他信息。例如,可以使用group_by模块根据事实动态生成组成员关系。这个小组的成员资格对剧本的其余部分是有效的。
📑利用群体优势
主机可以是多个组的成员。考虑根据不同的特征将主机划分为不同的类别:
地理上的:区分不同地区、国家、大洲或数据中心的主机。
环境:区分专用于软件生命周期不同阶段的主机,包括开发、阶段、测试或生产。
站点或服务:提供或链接到功能子集(如特定的web站点、应用程序)的主机组。或者特征的子集。
📑为可重用内容使用角色
角色帮助您保持剧本的简单,并允许您通过跨项目重用公共代码来保存工作。如果你正在编写你自己的角色,那么让它们专注于一个特定的目的或类似剧本的功能。通过变量使角色具有通用性和可配置性,这样当您将它们与不同的剧本集一起使用时,就不需要编辑它们。
使用ansible-galaxy命令初始化角色的目录层次结构,并提供初始模板文件。这也将使你更容易在Ansible Galaxy网站上分享你的角色,如果你选择这样做。
在Red Hat Enterprise Linux中,由redhat-system-roles包提供的角色得到了官方的支持(尽管有些角色可能在技术预览中出现),请查看提供的角色,以确定它们是否对您有用。
你也可以通过Ansible Galaxy查看社区提供的角色。要知道这些角色有不同的质量级别,所以要谨慎地选择您使用的角色。
将您的角色保存在项目的roles子目录中。使用ansible-galaxy命令从单独的Git存储库中自动获取角色,即使这些角色不是来自Ansible Galaxy,而是存储在你自己的存储库中。
📑运行剧本集中
为了控制对系统的访问和审计Ansible活动,可以考虑使用一个专用的控制节点,所有的Ansible剧本都是从这个节点运行的。
系统管理员应该在系统上仍然拥有自己的帐户和凭证。如果需要,连接到托管主机并升级特权。当系统管理员离开时,可以从托管主机的authorized_keys文件中删除他们的SSH密钥,并撤销他们的sudo命令特权。不影响其他管理员。
考虑使用红帽Ansible Tower作为这个中心主机。Red Hat Ansible Tower包含在一个新的Red Hat Ansible自动化订阅中,它提供了一些特性,可以更容易地控制对凭证的访问,控制playbook的执行,为那些不喜欢Linux命令行的用户简化自动化,以及审计和跟踪playbook的运行。在本课程的后面,您将了解如何使用红帽Ansible Tower。然而,即使你不使用红帽Ansible Tower,使用中央控制节点也是有益的。
📜4. 经常测试
在开发过程中,当任务运行时以及剧本使用时,经常测试剧本和任务。
📑测试任务的结果
如果需要确认任务成功,请验证任务的结果,而不是信任模块的返回代码。根据所涉及的模块,验证任务的方法不止一种。
📑使用Block/Rescue恢复或回滚
block指令在分组任务时很有用;当与Rescue指令一起使用时,它在从错误或失败中恢复时很有帮助。
📑用最新的Ansible版本开发剧本
即使你没有在生产中使用最新版本的Ansible,你也应该定期用最新版本的Ansible测试你的剧本。这个测试将帮助你避免Ansible模块和功能发展的问题。
如果剧本在运行时打印警告或弃用消息,那么您应该注意它们并进行调整。通常,如果Ansible中的某个特性正在被弃用或发生变化,在该特性被删除或更改之前,该项目会提供四个次要版本的弃用通知。
📑使用测试工具
有许多命令和工具可以帮助您测试剧本。使用ansible-playbook --syntax-check命令来检查你的playbook的语法,而不用运行它。
使用ansible-playbook --check命令以“check模式”对实际托管主机运行您的playbook,以查看playbook将进行哪些更改。这个检查并不能保证完美的准确性,因为在剧本中的后续任务正确工作之前,剧本可能需要实际运行一些任务。您可能有一些标有“检查模式:无指令”的任务。这些任务即使在检查模式下也会运行。
📜5. 课本练习(第8页)
[student@workstation ~]$ lab development-practices start
✏按要求修改角色定义的变量
[student@workstation ~]$ cd ~/DO447/labs/development-practices
[student@workstation development-practices]$ vim roles/haproxy/defaults/main.yml
# Log-level for HAProxy logs
haproxy_log_level: info
# Port exposed to clients
haproxy_port: 80
# Name for the default backend
haproxy_backend_name: app
# Port backend is exposed to
haproxy_backend_port: 80
…………
# The default is no defined backend servers.
haproxy_appservers: []
# Socket used to communicate with haproxy service. DO NOT CHANGE
haproxy_socket: /var/run/haproxy.sock
[student@workstation development-practices]$ vim roles/haproxy/templates/haproxy.cfg.j2
global
#Send events/messages to rsyslog server.
log 127.0.0.1:514 local0 {
{
haproxy_log_level }}
…………
# turn on stats unix socket
# required for the ansible haproxy module.
stats socket {
{
haproxy_socket }} level admin
………
frontend main
mode http
bind *:{
{
haproxy_port }}
default_backend {
{
haproxy_backend_name }}
………..
backend {
{
haproxy_backend_name }}
balance roundrobin
{
% for server in haproxy_appservers %}
server {
{
server.name }} {
{
server.ip }}:{
{
haproxy_backend_port }}
{
% endfor %}
✏设置并修改主机组变量
[student@workstation development-practices]$ mkdir group_vars
[student@workstation development-practices]$ cp -v appservers.yml group_vars/lb_servers.yml
'appservers.yml' -> 'group_vars/lb_servers.yml'
[student@workstation development-practices]$ vim group_vars/lb_servers.yml
haproxy_appservers:
- name: serverb.lab.example.com
ip: "172.25.250.11"
- name: serverc.lab.example.com
ip: "172.25.250.12"
✏添加主机组清单并创建其主机组变量
[student@workstation development-practices]$ cat inventory
[lb_servers]
servera.lab.example.com
[web_servers]
server[b:c].lab.example.com
[region_eu]
serverc.lab.example.com
[student@workstation development-practices]$ cat group_vars/region_eu.yml
webapp_message: "Hello from Europe. This is"
✏执行剧本并验证
[student@workstation development-practices]$ ansible-playbook site.yml
[student@workstation development-practices]$ curl http://servera
This is serverb. (version v1.0)
[student@workstation development-practices]$ curl http://servera
Hello from Europe. This is serverc. (version v1.0)
✏清除实验
[student@workstation development-practices]$ ansible-playbook clean.yml
[student@workstation development-practices]$ lab development-practices finish
💡总结
好好学,好好找工作,运维10K+只是起步,找不到10K+都别说是金鱼哥带出来的学生🤪。
以上就是【金鱼哥】对 第一章 利用推荐做法进行开发–实施建议实践 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!