什么是 Ansible?
Ansible 是一款开源的自动化工具,由 Red Hat 公司推出。它基于 Python 编写,旨在简化系统配置、部署和管理。Ansible 的核心思想是使用简单易懂的 YAML 格式的 Playbooks 来描述自动化任务。与其他自动化工具相比,Ansible 的优势在于其简单性和灵活性。您可以使用 Ansible 来自动化服务器配置、软件部署、应用程序生命周期管理等任务,而无需编写复杂的脚本或代码。
Ansible 的优势
1. 简单易用
Ansible 的语法简洁明了,使用 YAML 格式的 Playbooks,几乎没有学习曲线。即使是新手也可以很快上手。
2. 无客户端
与其他自动化工具不同,Ansible 无需在远程主机上安装客户端。它通过 SSH 或其他远程连接协议来管理远程系统,这样不仅减少了维护成本,也提高了安全性。
3. 模块化
Ansible 的模块化设计使得它能够管理各种不同类型的系统和服务。Ansible 提供了大量的内置模块,涵盖了操作系统配置、软件安装、文件管理、网络设备配置等各个方面。
4. 基于剧本(Playbooks)
使用 Ansible 的 Playbooks,您可以将一系列任务组织成一个逻辑单元,并在多台主机上同时执行。这使得对整个基础架构进行统一管理和配置成为可能。
Ansible 的使用场景
1. 自动化部署
使用 Ansible,您可以自动化部署应用程序、中间件和基础设施。通过定义简单的 Playbooks,您可以快速地在多台主机上部署同样的配置和应用程序,确保一致性和可重复性。
2. 系统配置管理
通过 Ansible,您可以轻松管理和配置服务器和网络设备。无论是更新软件包、配置文件、还是执行系统维护任务,Ansible 都可以帮助您自动化这些过程。
3. 持续集成/持续部署(CI/CD)
Ansible 可以集成到 CI/CD 流程中,实现自动化的构建、测试和部署。通过与工具如 Jenkins、GitLab 等集成,可以构建强大的自动化 CI/CD 管道。
4. 云基础设施管理
对于云环境,Ansible 提供了丰富的模块来管理云服务提供商的资源,包括 AWS、Azure、Google Cloud 等。您可以使用 Ansible 来自动创建、配置和管理云资源。
Ansible模块
Ansible 提供了丰富的模块来管理各种不同类型的系统和服务。这些模块包括了操作系统配置、软件包管理、文件管理、服务管理、网络设备配置等等。以下是一些常用的 Ansible 模块以及它们的简要介绍:
1. apt
/ yum
/ dnf
模块
-
apt
模块:用于在 Debian/Ubuntu 系统上安装、升级、删除软件包。 -
yum
模块:用于在 CentOS/Red Hat 系统上安装、升级、删除软件包。 -
dnf
模块:用于在最新版本的 Fedora 系统上安装、升级、删除软件包。
2. copy
/ fetch
模块
-
copy
模块:用于在远程主机上复制文件到目标路径。 -
fetch
模块:用于从远程主机上拉取文件到控制节点。
3. file
模块
file
模块:用于管理文件系统,比如创建目录、更改文件权限等。
4. service
模块
service
模块:用于启动、停止、重新启动服务。
5. shell
/ command
模块
-
shell
模块:用于在远程主机上执行 Shell 命令,适用于需要交互性的命令。 -
command
模块:用于在远程主机上执行单条命令,通常用于非交互性的命令。
6. lineinfile
模块
lineinfile
模块:用于在文件中添加、修改或删除指定行。
7. template
模块
template
模块:用于使用 Jinja2 模板引擎生成文件,可以将变量和逻辑嵌入到文件中。
8. user
/ group
模块
-
user
模块:用于管理用户账户,比如创建、删除用户等。 -
group
模块:用于管理用户组,比如创建、删除用户组等。
9. mysql_user
/ mysql_db
模块
-
mysql_user
模块:用于管理 MySQL 用户,比如创建、删除用户等。 -
mysql_db
模块:用于管理 MySQL 数据库,比如创建、删除数据库等。
10. lineinfile
模块
lineinfile
模块:用于在文件中添加、修改或删除指定行。
11. git
模块
git
模块:用于从 Git 仓库中检出代码到远程主机。
12. debug
模块
debug
模块:用于打印调试信息,通常用于调试 Playbooks。
Playbook
Playbook 是 Ansible 的核心概念之一,是一种用于描述自动化任务的 YAML 文件。它定义了一系列任务(tasks),指定了如何在远程主机上执行这些任务。通过 Playbook,您可以实现对基础设施和应用程序的自动化管理和配置。下面是一个简单的 Playbook 示例及其介绍:
---
- name: Example Playbook
hosts: web_servers
become: yes
vars:
http_port: 80
website_root: /var/www/html
tasks:
- name: Ensure Apache is installed
package:
name: apache2
state: present
become: yes
- name: Ensure Apache is running and enabled
service:
name: apache2
state: started
enabled: yes
become: yes
- name: Deploy website files
copy:
src: /path/to/website_files
dest: "{{ website_root }}"
become: yes
- name: Ensure default Apache configuration
template:
src: default.conf.j2
dest: /etc/apache2/sites-available/default.conf
become: yes
notify:
- restart apache
handlers:
- name: restart apache
service:
name: apache2
state: restarted
become: yes
Playbook 结构说明:
name
: Playbook 的名称,用于描述这个 Playbook 的作用。hosts
: 指定了 Playbook 将在哪些主机上执行。web_servers
是一个在 Ansible inventory 中定义的主机组。become
: 表示在执行任务时是否切换到管理员权限(通常是root
)。这是一个全局设置,可以在任务级别覆盖。vars
: 定义了一些变量,可以在 Playbook 中多个任务中使用。例如,http_port
和website_root
是一些通用的变量。tasks
: 这是一个任务列表,描述了要在目标主机上执行的操作。- 每个任务包含了一个
name
属性,用于描述这个任务的作用。 - 每个任务使用不同的模块来执行特定的操作,比如
package
模块用于安装软件包,service
模块用于管理服务状态,copy
模块用于复制文件,template
模块用于根据模板生成文件等等。
- 每个任务包含了一个
handlers
: 这是一个处理程序列表,通常用于在任务中触发的通知(notify)事件。每个处理程序也有一个name
属性和一个或多个任务,用于定义要在事件触发时执行的操作。
Playbook 是用来描述自动化任务的 YAML 文件。它包含了一系列任务和处理程序(handlers),定义了如何在远程主机上执行这些任务以及如何处理事件。通过编写和运行 Playbook,您可以实现对基础设施和应用程序的自动化管理,确保系统的一致性和可重复性。
Ansible 的应用举例
利用ansible部署lnmp架构
打开 inventory.ini
文件并添加远程主机的 IP 地址范围:
[remote_servers]
192.168.1.101
192.168.1.102
192.168.1.103
#指定远程主机
192.168.1.[104:1110]
#指定连续的远程主机
编写 playbook.yml
文件:
---
# 这是一个 YAML 文件的开头,用于指定这是一个 Ansible Playbook 文件。
- name: Deploy LNMP Stack
# 这是一个 Play 的定义,它包含了一系列的任务。
# "Deploy LNMP Stack" 是这个 Play 的名称,用于描述这个 Play 所做的工作。
hosts: remote_servers
# 这个 Play 会运行在名为 "remote_servers" 的 Ansible inventory 中列出的所有主机上。
# 在您的 `inventory.ini` 文件中列出了这些主机。
become: yes
# 这个 Play 会使用 sudo 权限(即 root 权限)来执行任务。
# 这是因为安装软件、操作系统配置等操作通常需要管理员权限。
vars:
mysql_root_password: "your_mysql_root_password"
php_version: "php7.4"
# 这里定义了一些变量,以便在 Playbook 中多次使用。
# 您可以在后续任务中使用 `mysql_root_password` 和 `php_version` 这两个变量。
tasks:
# 更新 yum 缓存
- name: Update yum cache
yum:
name: '*'
state: latest
# 第一个任务是更新 yum 缓存,确保系统中的软件包信息是最新的。
# 使用了 Ansible 的 `yum` 模块来执行这个任务。
# `name: '*'` 表示更新所有可用的软件包。
# 安装 Nginx、MySQL、PHP 和其他必需包
- name: Install Nginx, MySQL, PHP, and other required packages
yum:
name: "{{ item }}"
state: present
loop:
- nginx
- mysql-server
- mysql-client
- php-fpm
- php-mysql
- php-cli
- php-common
- php-curl
- php-gd
- php-mbstring
- php-xml
- unzip
# 下一个任务是安装一些软件包,包括 Nginx、MySQL、PHP 等。
# 使用了 Ansible 的 `yum` 模块来执行这个任务。
# `loop` 循环将会依次安装列表中的软件包。
# 启动并启用 Nginx 和 PHP-FPM 服务
- name: Start and enable Nginx and PHP-FPM services
service:
name: "{{ item }}"
state: started
enabled: yes
loop:
- nginx
- php-fpm-{{ php_version }}
# 接下来的任务是启动并设置 Nginx 和 PHP-FPM 服务开机自启动。
# 使用了 Ansible 的 `service` 模块,并使用 `loop` 循环来对多个服务进行操作。
# `php-fpm-{{ php_version }}` 将会根据 `php_version` 变量来确定具体的 PHP-FPM 版本。
# 安全设置 MySQL
- name: Secure MySQL installation
mysql_user:
login_user: root
login_password: ""
name: root
password: "{{ mysql_root_password }}"
host: localhost
state: present
update_password: always
# 在这个任务中,使用了 Ansible 的 `mysql_user` 模块来设置 MySQL 的 root 用户的密码。
# `update_password: always` 选项表示每次运行都会更新密码,即使密码已经存在。
# 创建一个简单的 PHP 信息页面
- name: Create a simple PHP info page
template:
src: info.php.j2
dest: /var/www/html/info.php
# 下一个任务是创建一个简单的 PHP 信息页面,用于显示 PHP 的配置信息。
# 这里使用了 Ansible 的 `template` 模块,它会根据一个模板文件生成目标文件。
# 重启 Nginx 和 PHP-FPM 以应用更改
- name: Restart Nginx and PHP-FPM to apply changes
service:
name: "{{ item }}"
state: restarted
loop:
- nginx
- php-fpm-{{ php_version }}
# 最后一个任务是重新启动 Nginx 和 PHP-FPM 服务以应用上述更改。
# 这里同样使用了 Ansible 的 `service` 模块,并使用 `loop` 循环来对多个服务进行操作。
# `php-fpm-{{ php_version }}` 将会根据 `php_version` 变量来确定具体的 PHP-FPM 版本。