跳转至

Ansible

Ansible 是一个开源的自动化工具,主要用于配置管理、应用部署、任务自动化和多节点管理。它的核心优势是简洁、易于使用且具有强大的功能。Ansible 使用 Playbooks 来描述系统配置和自动化任务,并通过 SSH 协议无代理地在多个服务器上执行命令。

Ansible 的基本概念和特点

  1. 无代理(Agentless)
  2. Ansible 不需要在被管理的节点上安装任何代理程序,它通过 SSHWinRM 连接远程服务器进行管理,避免了在每个节点上安装和维护额外的代理软件。
  3. 声明性语法
  4. Ansible 使用声明性语法,即用户描述他们期望的系统状态,Ansible 会自动执行任务来达到所需的状态。这使得 Ansible 非常易于理解和使用。
  5. 模块化
  6. Ansible 提供了大量的 模块,这些模块是执行具体任务的单元(例如,管理包、服务、文件、用户等)。你可以通过调用这些模块来执行特定的任务,模块支持多种操作系统和应用平台。
  7. Playbooks 和 Roles
  8. Playbook 是 Ansible 的核心配置文件,采用 YAML 格式。Playbook 定义了执行任务的顺序和条件。通过 Playbook,用户可以在多个主机上执行一系列自动化任务。
  9. Roles 是 Playbook 的结构化单元,它帮助你将 Playbook 划分为多个功能模块,从而提高可重用性和维护性。
  10. Inventory
  11. Inventory 是 Ansible 管理的目标主机列表。你可以在一个简单的文本文件或动态脚本中定义主机的 IP 地址、主机名以及组名。Ansible 会根据这个清单来执行任务。
  12. Idempotent(幂等性):
  13. Ansible 的任务是幂等的,即无论你运行多少次,任务的结果都不会发生变化,除非目标的系统状态有所变化。这确保了即使自动化任务执行多次,也不会重复改变目标系统。

Ansible 的工作原理

Ansible 通过以下几个步骤进行工作:

  1. 连接到目标主机
  2. Ansible 通过 SSH(Linux/Unix)或 WinRM(Windows)连接到目标主机。默认情况下,它会使用 SSH 密钥认证进行连接,但也可以使用用户名和密码。
  3. 执行任务
  4. 一旦连接到目标主机,Ansible 就会根据 Playbook 中的定义执行相应的任务。它会从远程主机上收集状态信息,并根据需求执行模块。
  5. 推送配置
  6. Ansible 会根据 Playbook 中定义的任务推送配置更改到目标主机上。例如,安装软件包、配置文件、启动服务等。
  7. 返回执行结果
  8. 执行完任务后,Ansible 会将执行结果返回给用户,显示每个主机的执行状态(成功、失败或忽略)。

Ansible 的核心组件

  1. Playbooks

  2. Ansible 的 Playbook 是执行任务的核心文件,采用 YAML 格式,包含一系列的 plays,每个 play 定义了要在一组主机上执行的任务。

Playbook 示例

---
- name: Install Apache and start service
  hosts: webservers
  become: yes
  tasks:
    - name: Install Apache
      apt:
        name: apache2
        state: present
    - name: Start Apache service
      service:
        name: apache2
        state: started

这个 Playbook 会在所有标记为 webservers 的主机上安装并启动 Apache 服务。

  1. Roles

  2. Roles 是一种组织 Playbooks 的方式,它将一个 Playbook 中的任务、变量、文件、模板等内容分开,提供更好的模块化和重用性。

Role 结构示例

roles/
├── webserver/
│   ├── tasks/
│   ├── handlers/
│   ├── files/
│   ├── templates/
│   ├── vars/
│   └── defaults/

通过使用 roles,可以轻松地将任务组织成逻辑单元,并且这些单元可以在不同的 Playbooks 中重复使用。

  1. Inventory

  2. Inventory 文件用于定义目标主机,通常是一个简单的 INI 格式的文件,列出主机和主机组。

Inventory 示例

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com
db2.example.com
  1. Modules

  2. Ansible 提供了丰富的模块来执行各种任务,如软件包管理(aptyum)、文件操作(copytemplate)、服务管理(service)、用户管理(user)等。

模块示例

- name: Install a package
  apt:
    name: nginx
    state: present
  1. Handlers

  2. Handlers 是用于响应某些事件的特殊任务,通常与服务重启、通知等操作相关。它们只有在某些任务发生变化时才会执行。

Handler 示例

- name: Restart nginx
  service:
    name: nginx
    state: restarted

Ansible 的使用场景

  • 配置管理:自动化配置和部署服务器(如安装软件、配置网络、管理服务等)。
  • 应用部署:自动化部署和管理应用程序的生命周期。
  • 基础设施自动化:通过 Ansible 编排基础设施的创建和管理,适用于云环境或数据中心的资源管理。
  • 多主机管理:同时管理多个服务器,执行相同或不同的任务。
  • 安全合规性:自动化实现安全策略和合规检查,确保系统符合规定的安全标准。

要使用 Ansible 在目标机器上通过 YUM 安装 HTTP 服务(例如 Apache 或 Nginx),你可以使用 Ansible 的 yum 模块来完成这个任务。假设你要安装 Apache HTTP 服务(httpd),以下是相应的 Ansible Playbook 示例:

示例:使用 Ansible 安装 Apache HTTP 服务(httpd)

1. 编写 Playbook:install-httpd.yml

---
- name: Install and start HTTP service (Apache)
  hosts: target_machines  # 目标机器组,可以是主机名或 IP 地址
  become: yes             # 使用 sudo 权限执行
  tasks:
    - name: Install Apache HTTP service
      yum:
        name: httpd       # 包名
        state: present     # 确保包已安装,若未安装会安装
    - name: Start Apache HTTP service
      service:
        name: httpd       # 服务名
        state: started     # 启动服务
        enabled: yes       # 设置为开机启动

2. 解释 Playbook 内容

  • hosts: target_machines:指定目标机器组(可以在 inventory 文件中定义,或者直接使用 IP 地址)。

  • become: yes:指定使用 sudo 权限执行任务(需要目标机器配置了 sudo 权限)。

tasks:列出了要执行的任务:

  • 安装 Apache HTTP 服务:通过 yum 模块安装 httpd 包(Apache HTTP 服务)。
  • 启动并启用 Apache 服务:通过 service 模块启动 Apache 服务,并确保它在系统启动时自动启动。

3. 运行 Playbook

假设你的目标主机已经在 inventory 文件中列出,运行以下命令来执行 Playbook:

ansible-playbook -i inventory.ini install-httpd.yml

inventory.ini : 包含目标主机的 inventory 文件,格式类似:

[target_machines]
server1.example.com
server2.example.com

4. 测试服务是否成功安装

安装完成后,你可以通过浏览器访问目标机器的 IP 地址,检查 Apache HTTP 服务是否正常工作。默认情况下,Apache 安装后会在 80 端口提供服务,访问 http://<目标IP> 应该能看到 Apache 的欢迎页面。

5. 附加任务(可选)

如果你需要配置防火墙(例如 firewalld)以允许 HTTP 流量,可以在 Playbook 中添加以下任务:

通过 firewalld 允许 HTTP 流量:

- name: Allow HTTP service through firewalld
  firewalld:
    service: http
    permanent: yes
    state: enabled