DevOps - Ansible
Ansible 是一个强大的工具,可以帮助我们自动化任务。它使配置管理和应用程序部署更加容易。因此,它是 DevOps 的关键资源。
在本章中,我们将研究 Ansible 的结构。我们将讨论清单和剧本等关键思想。我们还将学习如何设置它以用于良好的 DevOps。我们将讨论如何编写好的剧本以及如何使用 Ansible 进行持续集成和部署。
了解 Ansible 架构
我们知道 Ansible 是一个免费的自动化工具。它使用客户端-服务器设置,主要无需主服务器即可工作。它的设置有一些重要部分:
- 控制节点 −这是我们安装 Ansible 的机器。我们从这里开始任务。它运行剧本并与托管节点对话。
- 托管节点 − 这些是 Ansible 工作所在的机器。它们可以是真实服务器、虚拟机或云实例。我们不需要在这些节点上安装任何代理。Ansible 使用 SSH 进行通信。
- 库存 − 库存文件显示所有托管节点。它可以是静态的,如 INI 或 YAML 格式。如果我们从云提供商或其他地方提取它,它也可以是动态的。
- 模块 − Ansible 有许多执行特定任务的模块。他们可以安装包、复制文件或管理服务。我们也可以创建自己的模块。
- 剧本 − 这些是 YAML 文件。它们告诉我们我们希望托管节点是什么样的。它们列出了要执行的任务以及执行顺序。
- 插件 − Ansible 可以通过插件进行扩展。这些插件可以改变其工作方式或添加新功能。例如,我们有连接、操作或过滤器插件。
通过使用此设置,Ansible 很简单,并且可以轻松扩展。这使其成为 DevOps 实践的绝佳选择。
Ansible 清单
我们在 Ansible 中使用清单来显示我们将运行任务的主机和主机组。清单可以是静态的,如简单的文本文件,也可以是动态的,由脚本创建。
静态清单示例
静态清单通常位于文件中,如 hosts.ini −
[webservers] web1.example.com web2.example.com [databases] db1.example.com
动态清单
我们可以从云提供商或其他来源获取动态清单。例如,当我们使用 AWS−
ansible-cmd -i aws_ec2.py all -m ping
Ansible Playbooks
我们将 Ansible Playbooks 用作 YAML 文件。它们帮助我们定义一组想要在主机上运行的任务。Playbooks 对于自动化任务非常重要。它们帮助我们以可重复和有组织的方式完成任务。每个 Playbook 都有一个或多个"plays"。这些 play 将我们的主机与我们想要执行的任务联系起来。
Playbook 的结构
---
- name: Playbook Example
hosts: webservers
tasks:
- name: Install Apache
yum:
name: httpd
state: present
- name: Start Apache
service:
name: httpd
state: started
关键组件
- Hosts − 这些是我们在清单中定义的目标机器。
- Tasks − 这些是我们需要执行的操作。我们为此使用模块。
- Modules − 这些是内置或自定义脚本。例如,yum 和 service 是我们用来运行任务的模块。
剧本对于管理复杂的工作流程非常重要。它们帮助我们在不同环境中保持配置一致。
Ansible 角色
角色帮助我们更好地组织 Ansible 代码。角色可以有任务、处理程序、变量和模板。这使得在不同的剧本中使用相同的角色变得容易。
角色目录结构
my_role/
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
├── vars/
│ └── main.yml
└── templates/
└── config.j2
这些想法清单、剧本和角色构成了 Ansible 配置管理和自动化的主要部分。
为 DevOps 设置 Ansible
我们可以按照一些简单的步骤为 DevOps 设置 Ansible。这将帮助我们进行配置管理和部署。
以下是先决条件 −
- Ansible 在 Linux 上运行效果最佳。我们需要确保我们有一个兼容的操作系统。
- Ansible 需要 Python 才能运行。我们可以使用我们的包管理器(如 apt 或 yum)安装它。
使用包管理器安装(例如 Ubuntu)−
sudo apt update sudo apt install ansible
使用 pip(Python 包管理器)安装−
pip install ansible
使用以下命令验证安装−
ansible --version
配置
库存文件 − 我们需要在 /etc/ansible/hosts 或自定义文件中定义我们的主机 −
[webservers] web1.example.com web2.example.com
Ansible.cfg:我们可以在 ansible.cfg 中更改一些设置 −
[defaults] inventory = ./inventory remote_user = your_user
SSH 访问
我们必须确保无需密码即可访问托管节点 −
ssh-keygen -t rsa ssh-copy-id user@node
此设置可帮助我们使用 Ansible 轻松地在许多服务器上自动执行任务。
编写有效的剧本
我们知道 Ansible 剧本是 YAML 文件。它们定义了我们想要在托管节点上运行的自动化任务。当我们编写有效的剧本时,我们会使其更易于阅读、重用和维护。
以下是一些重要提示:
- 为您的剧本选择清晰的描述性名称。这有助于我们了解每个剧本的作用。
- 组织好剧本。我们可以使用角色来分组任务。这使一切都变得整洁。
- 在单独的变量中定义变量如果您有敏感信息,请使用 Ansible Vault。这是一个例子−
vars: app_version: "1.0.0"
确保剧本可以多次运行。如果不需要,它们不应该改变系统状态。使用幂等的 Ansible 模块。
使用处理程序来管理服务。它们仅在发生变化时通知。以下是一个例子 −
handlers:
- name: restart web server
service:
name: httpd
state: restarted
添加注释来解释复杂的任务或逻辑。例如 −
# 安装最新版本的 nginx
- name: Install nginx
yum:
name: nginx
state: latest
通过遵循这些技巧,我们可以制作高效且易于管理的 Ansible 剧本。这将有助于我们的 DevOps 工作。
使用 Ansible 进行持续集成和部署
我们可以使用 Ansible 使持续集成 (CI) 和持续部署 (CD) 更容易。Ansible 帮助我们设置和管理环境、部署应用程序并自动运行测试。以下是我们如何将 Ansible 放入我们的 CI/CD 管道中。
使用 Ansible,我们可以多次运行剧本,而不会在第一次运行后更改结果。这使我们的部署更加可预测。
Ansible 不需要目标机器上的代理。这有助于我们保持简单。
工作流程示例
环境设置 − 我们可以使用 Ansible 自动设置和配置环境 −
- hosts: all
tasks:
- name: Install Docker
apt:
name: docker.io
state: present
代码部署 − 我们可以使用剧本部署我们的应用程序代码 −
- hosts: webservers
tasks:
- name: Deploy application
copy:
src: /local/path/to/app
dest: /var/www/app
测试 − 我们可以在部署后自动运行测试 −
- hosts: testservers
tasks:
- name: Run tests
command: /path/to/test_script.sh
与 CI/CD 工具集成
- Jenkins − 我们可以使用 Ansible 插件将剧本作为构建步骤运行。
- GitLab CI − 我们可以从 .gitlab-ci.yml 调用 Ansible 来自动化部署。
通过在 CI/CD 中使用 Ansible,我们可以更快、更可靠地交付软件。它还帮助我们减少手动工作的需求。
结论
在本章中,我们了解了 Ansible 的基础知识。我们讨论了它的结构和重要思想,如清单、剧本和角色。我们还展示了如何为 DevOps 环境进行设置。
编写好的剧本和管理好配置非常重要。Ansible 帮助我们进行持续集成和部署。借助 Ansible,我们可以提高自动化水平。我们还可以使工作流程更简单,并改善软件开发的工作方式。

