在现代 IT 管理和运维中,自动化变得越来越重要。Ansible 作为一种简单且高效的自动化工具,从业务运维到云端部署都发挥着重要作用。
于 2012 年由 Michael DeHaan 创建,后被 Red Hat 收购。
Ansible 的诞生源于对于配置管理和自动化工具的渴望。相比于其他复杂笨重的解决方案,Ansible 的设计理念是“简单即可强大”。其基于 Python 开发,采用轻量级的 Agentless 架构,不需要在被控节点上安装任何代理程序或软件。
Ansible 旨在简化基础架构的自动化、配置管理和应用部署。能够轻松应对多种任务,包括但不限于系统配置、应用程序部署、网络设备配置和云端资源管理。
Ansible 通过 Playbook 和模块化的任务,将复杂的自动化工作转化为简单易懂的代码。
在自动化领域,Ansible 已成为业界瞩目的工具之一。简单易用、高度可扩展以及强大的社区支持,被广泛应用于各种规模和类型的基础设施管理中。从开发到运维,Ansible 提供一套全面的解决方案,使得自动化变得更加容易且高效。
Ansible 的崛起标志着自动化工具的一次革命。不仅改变了 IT 管理的方式,还推动了自动化在企业中的广泛应用,成为了现代 IT 管理的必备利器。
在 Ansible 中,有两个重要的概念:控制节点(Control Node)和被控节点(Managed Node)。控制节点是运行 Ansible 的主机,可以是开发机器或者专门用于管理的服务器。被控节点是需要被管理和控制的目标主机或服务器。
模块(Module):
Ansible 通过模块来执行任务。模块是 Ansible 的基本组成单元,每个模块用于完成特定的任务,比如管理文件、安装软件包、配置服务等。Ansible 模块是幂等的,即无论执行多少次,结果都是一致的。
Playbook(剧本):
Playbook 是用 YAML 格式编写的文本文件,包含一系列任务(tasks)。每个任务都是一个模块调用,定义了要在被控节点上执行的操作。Playbook 允许定义主机配置、任务顺序和并行执行的方式。
任务(Tasks):
任务是 Playbook 中的基本单元,代表着在被控节点上执行的操作。每个任务通常包含了一个模块调用,以及模块需要的参数。
运行流程:
Ansible 工作流程:控制节点通过 SSH 连接到被控节点,并在被控节点上执行模块。Ansible 不需要在被控节点上安装任何额外的代理或软件,这是因为 Ansible 使用 SSH 协议来远程管理主机。
工作方式:
当运行一个 Playbook 时,Ansible 会读取控制节点上的配置文件和任务列表,然后连接到被控节点执行任务。执行结果将会反馈给控制节点,用户可以在控制节点上查看任务执行的结果和状态。
在被控节点上创建目录:
** Playbook 示例:**
---
- name: # 创建目录示例
hosts: hosts # 指定被控节点的名称或分组
become: yes # 如果需要以管理员身份运行,请使用 become
tasks:
- name: # 创建目录
file:
path: /path/directory # 指定要创建的目录路径
state: directory # 指定目录的状态,这里是要创建一个目录
- name: # 打印信息
debug:
msg: "目录已创建" # 运行成功后输出的信息
解释说明:
hosts
:指定被控节点的名称或分组,可以是单个主机也可以是主机组。become: yes
:以管理员身份运行。tasks
:定义执行的任务列表。file
模块:用于文件和目录操作,这里用来创建目录。path
:指定要创建的目录路径。state
:定义状态,directory
表示要创建的是目录。debug
模块:用于输出调试信息。msg
:运行后输出的信息。运行 Playbook
ansible-playbook create_directory.yml
Ansible 角色是组织 Playbook 的方法,使得代码重用和管理变得更加模块化和结构化。角色可以包含特定任务、处理、模板和变量,可以使得 Playbook 更清晰、易读、易维护。
变量是 Ansible 中的关键概念。允许将数据存储在单个位置,并在多个 Playbook 或任务中重复使用。Ansible 提供多种方式来管理变量,包括主机变量、组变量、Playbook 变量、角色变量以及外部变量文件等。
变量管理在 Ansible 中非常重要,允许将数据存储在单个位置并在多个 Playbook 或任务中重复使用。
变量管理是指在 Ansible 中管理数据、配置和参数的过程。这些变量可以是各种类型的数据,包括字符串、数字、列表、字典等。通过合理管理变量,可以提高 Ansible Playbook 的灵活性和可维护性。
主机变量(Host Variables):
组变量(Group Variables):
Playbook 变量(Playbook Variables):
角色变量(Role Variables):
Ansible Playbook 中定义和使用主机名称变量:
Inventory 文件(hosts.ini):
[web_servers]
server1 ansible_host=192.168.1.101
server2 ansible_host=192.168.1.102
[db_servers]
db1 ansible_host=192.168.1.201
db2 ansible_host=192.168.1.202
Playbook 文件
---
- name: # 使用变量示例
hosts: web_servers
vars:
http_port: 80
app_name: my_app
tasks:
- name: # 安装 Apache
yum:
name: httpd
state: present
- name: # 创建 Web 应用目录
file:
path: "/var/www/{{ app_name }}"
state: directory
- name: # 设置防火墙规则
firewalld:
port: "{{ http_port }}"
state: enabled
定义http_port
和 app_name
两个变量,分别用于指定 HTTP 端口和应用名称。
Ansible Vault 是用于加密敏感数据的工具,如密码、证书等。保护 Playbook 和变量文件中的敏感信息,并确保只有授权的用户可以访问和解密这些数据。
使用 ansible-vault
命令,创建一个新的库文件并使用 Vault 加密:
ansible-vault create secret_vars.yml
输入密码加密文件。输入密码后,编辑器打开空文件。在文件中添加信息(如密码、密钥等)保存。每次编辑此文件时,都需要输入 Vault 密码。
编辑现有的加密文件:
ansible-vault edit secret_vars.yml
输入 Vault 密码,然后打开编辑文件。
ansible-vault view
命令查看加密文件的内容,但不会对文件进行解密:
ansible-vault view secret_vars.yml
输入 Vault 密码才能查看文件内容。
解密文件编辑或查看其内容:
ansible-vault decrypt secret_vars.yml
输入 Vault 密码并将文件解密。
编辑或查看文件后,使用 ansible-vault encrypt
命令重新加密文件:
ansible-vault encrypt secret_vars.yml
文件进行重新加密并要求输入新的 Vault 密码。
在 Playbook 中使用加密文件:
在 Playbook 中使用加密的变量文件。 vars_files
指定要包含的加密文件:
---
- name: 使用加密文件示例
hosts: hosts
vars_files:
- /path/encrypted_file.yml
Ansible Galaxy 是 Ansible 社区的中心,可以在这里找到大量的角色、Playbook 和剧本。通过 Ansible Galaxy,可以快速获取开源的、可重复使用的自动化内容,加快自动化过程。
ansible-galaxy
命令可以从 Ansible Galaxy 安装角色或 Playbook。
安装 httpd
的角色:
ansible-galaxy install httpd
下载并安装指定角色到默认的 Ansible 角色路径(默认 /etc/ansible/roles
或 ~/.ansible/roles
)。
可以在 Ansible Galaxy 网站(Galaxy)上搜索需要的角色或 Playbook,包括名称和作者等信息。
您可以使用 ansible-galaxy
命令行工具来搜索 Ansible Galaxy 上的角色。以下是一个示例:
ansible-galaxy search keyword
Apache 相关角色:
ansible-galaxy search apache
ansible-galaxy install geerlingguy.apache
Ansible 从 Ansible Galaxy 下载角色,安装到默认的角色路径中。
ansible-galaxy collection install community.general
安装名为 community.general
的集合。集合是 Ansible Galaxy 中的另一种资源类型,包含模块、插件、剧本等。
还可以通过指定版本号来安装特定版本的角色或集合。
ansible-galaxy install geerlingguy.apache,1.0.0
安装 geerlingguy.apache
的 1.0.0 版本。
使用 --roles-path
参数将角色安装到自定义路径:
ansible-galaxy install geerlingguy.apache --roles-path /custom/roles/path
这些命令从 Ansible Galaxy 上下载并安装指定的角色或集合。
创建角色分享社区,将角色上传到 Ansible Galaxy。登录 Ansible Galaxy 社区账户后,上传角色:
ansible-galaxy login
ansible-galaxy publish username.role_name
发布到 Ansible Galaxy 后,其他用户下载和使用。
可以创建本地自定义的 Ansible 角色库,优势以及用途:
定制性强:可以根据特定需求创建自定义角色,以满足项目或组织的特定要求。
灵活性:可以根据需要修改和扩展角色,满足特定环境的配置需求。
无需网络:本地角色库允许在没有网络连接的情况下使用角色,适用于隔离网络或无法连接外部资源的环境。
保密性:对于包含敏感信息的角色,本地库可以确保数据不会传输到外部。
版本管理:使用版本控制工具(如 Git)来管理本地角色库,便于跟踪和控制角色的版本和变更。
可回溯性:可以根据需要回退到特定版本的角色,确保系统在更新后不会出现问题。
加速部署:在本地快速部署特定版本的角色,无需等待下载或更新远程角色。
离线部署:针对多台服务器进行快速、一致的离线部署,提高效率和一致性。
Ansible 支持多种 Inventory 类型,包括静态 Inventory 和动态 Inventory。动态 Inventory 允许 Ansible 动态地获取管理主机清单,在云环境或动态部署情况下非常有用。
部署 Web 应用,包含前端和后端服务。应用部署到多台服务器上,并确保系统配置的一致性。
Inventory 文件(hosts.ini):
[web_servers]
server1 ansible_host=192.168.1.101
server2 ansible_host=192.168.1.102
[db_servers]
db1 ansible_host=192.168.1.201
db2 ansible_host=192.168.1.202
Playbook 文件(deploy_app.yml):
---
- name: # 自动化部署示例
hosts: web_servers
become: yes
tasks:
- name: # 安装 Web --Nginx
yum:
name: nginx
state: present
- name: # 部署前端应用
copy:
src: /local/path/to/frontend_files
dest: /var/www/html
remote_src: yes
- name: # 部署后端应用
hosts: db_servers
become: yes
tasks:
- name: # 安装数据库服务 MySQL
yum:
name: mysql
state: present
- name: # 配置数据库
mysql_db:
name: my_app_db
state: present
定义两个任务,分别用于部署前端和后端服务。前端部署在 web_servers
组的服务器上,后端部署在 db_servers
组的服务器上。将不同组的任务分开,并应用到不同的主机组上。
运行 Playbook:
ansible-playbook -i hosts.ini deploy_app.yml
配置多台服务器 Nginx 服务。
Inventory 文件(hosts.ini)
[web_servers]
server1 ansible_host=192.168.1.101
server2 ansible_host=192.168.1.102
Playbook 文件(configure_nginx.yml):
---
- name: # 配置管理示例 - Nginx
hosts: web_servers
become: yes
tasks:
- name: 安装 Nginx
yum:
name: nginx
state: present
- name: # 拷贝 Nginx 配置文件
template:
src: /local/path/to/nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify:
- restart nginx
handlers:
- name: # 重新启动 Nginx
service:
name: nginx
state: restarted
使用 nginx.conf.j2
模板文件,生成 Nginx 配置文件。将文件拷贝到远程服务器 /etc/nginx/nginx.conf
。
模板文件(nginx.conf.j2):
# Nginx 配置模板
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
运行 Playbook:
ansible-playbook -i hosts.ini configure_nginx.yml
使用相同的配置文件,在 web_servers
主机组服务器上安装并配置 Nginx。
基础设施编排
使用 Jenkins 进行持续集成和持续部署,代码提交后自动执行测试、构建和部署到服务器。
Jenkins Pipeline(Jenkinsfile):
pipeline {
agent any
stages {
stage('Checkout') {
steps {
// 检出代码库
git 'https://github.com/repo.git'
}
}
stage('Test') {
steps {
// 执行测试(例如:单元测试)
sh 'ansible-playbook -i inventory/test test.yml'
}
}
stage('Build') {
steps {
// 构建应用程序(如果需要)
sh 'ansible-playbook -i inventory/dev build.yml'
}
}
stage('Deploy') {
steps {
// 部署到生产服务器
sh 'ansible-playbook -i inventory/prod deploy.yml'
}
}
}
}
** Ansible Playbooks(test.yml, build.yml, deploy.yml)**
编写不同的 Ansible Playbooks 来执行测试、构建和部署任务。Playbooks 可以针对不同的环境进行配置。
例如,test.yml
执行单元测试,build.yml
构建应用程序, deploy.yml
将应用程序部署到生产服务器上。
Inventory 文件(inventory/test, inventory/dev, inventory/prod)
针对不同的环境编写对应的 Inventory 文件,定义不同环境的主机信息。
test.yml
。build.yml
。deploy.yml
。Ansible 可以在不同的阶段实现自动化,确保代码变更的快速部署和持续交付。
在 Ansible 中,模块化和角色化是促进可重用性和可维护性的关键概念。将任务模块化,角色化进行组织管理和编排,提高复用和管理效率。
Playbook 模块
---
- name: # 模块示例
hosts: hosts
become: yes
tasks:
- name: # 安装指定软件包
yum:
name: httpd
state: present
- name: # 创建文件夹
file:
path: /path/folder
state: directory
yum
和 file
是 Ansible 提供的两个模块。使用不同的模块执行任务:安装软件包、创建文件夹。
创建角色结构:
ansible-galaxy init roles/httpd
在roles文件夹下创建名为 httpd
的 Ansible 角色模板,包含默认的目录结构和文件。
**Playbook **
---
- name: # 角色示例
hosts: hosts
become: yes
roles:
- role
role
角色在 hosts
主机组上执行。
模块化:通过使用模块,将任务细分为重复使用的功能块,提高任务的灵活性和复用性。
角色化:角色是对任务和变量进行组织,更好地管理复杂配置。通过角色,在不同的环境中使用相同的任务结构,提高代码的可维护性和复用性。
Ansible 有几个显著的优势使其成为自动化和配置管理的首选工具之一。
总结:
简单易用
自动化能力
高度灵活
可扩展性和一致性
安全性和可靠性
Ansible 作为一种功能强大且易于使用的自动化工具,能够满足不同规模和需求的环境。其简单的语法和丰富的功能使其成为自动化和配置管理的首选工具。
喜欢的话,请收藏 | 关注!
万一有趣的事还在后头呢!