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,我们可以提高自动化水平。我们还可以使工作流程更简单,并改善软件开发的工作方式。