Ansible实现自动化运维
使用Ansible实现自动化运维:集中化管理服务器的完整指南
- 前言
- 一、 Ansible概述和运行机制
- 1.1 Ansible概述
- 1.2 Ansible工作机制
- 1.3 Ansible角色(Role)
- 二、 Ansible环境安装部署
- 环境示例
- 管理端安装Ansible
- 目录结构
- 配置主机清单
- 配置免密SSH登录
- 三、 Ansible基础命令及模块操作
- 命令格式
- 常用模块示例
- 3.1 command模块
- 3.2 shell模块
- 3.3 cron模块
- 3.4 user模块
- 3.5 group模块
- 3.6 copy模块
- 3.7 file模块
- 3.8 hostname模块
- 3.9 ping模块
- 3.10 yum模块
- 3.11 service/systemd模块
- 3.12 script模块
- 3.13 setup模块
- 四、 Inventory主机清单与变量配置
- 4.1 Inventory支持对主机进行分组
- 4.2 常用Inventory变
- 基本示例
- (1) 主机变量
- (2) 组变量
- (3) 组嵌套
- 结语
前言
在当今快速发展的IT环境中,自动化运维已经成为提高效率、减少人为错误和确保系统一致性的关键手段。随着服务器数量的增加和配置的复杂化,手动管理变得越来越不可行。Ansible作为一款强大的自动化运维工具,因其简单易用、无需客户端代理、基于SSH通信等特点,成为了众多运维工程师的首选。
本文将详细介绍Ansible的基本概念、运行机制、安装部署以及基础命令和模块操作,帮助您快速上手并掌握如何使用Ansible进行集中化的服务器管理。无论您是初学者还是有经验的运维人员,本文都将为您提供有价值的指导和参考。
一、 Ansible概述和运行机制
1.1 Ansible概述
Ansible是一款面向类Unix系统的自由开源配置和自动化工具,由Python编写。与SaltStack、Puppet、Chef等工具相似,Ansible在自动化运维领域中具有独特的优势:
- 无需在被管理节点安装客户端:Ansible是轻量级的,管理端安装即可,被控端无需任何操作。
- 通过SSH协议与节点通信:默认使用SSH协议管理设备,确保通信的安全性。
- 使用YAML和Jinja2模板语言:通过YAML和Jinja2模板语言进行配置和自动化任务编排,易于理解和维护。
官方网站:https://www.ansible.com/
行业事件: - 2015年10月,红帽(Red Hat)以约1-1.5亿美元收购了Ansible,进一步推动了其在企业级自动化运维中的应用。
Ansible特点:
- 部署简单:管理端安装即可,被控端无需操作。
- 默认使用SSH协议管理设备:确保通信安全。
- 集中化管理,支持主从模式:便于统一管理和控制。
- 配置简洁、功能强大、扩展性高:易于上手且功能丰富。
- 支持API和自定义模块:可通过Python扩展,满足个性化需求。
- Playbook可实现复杂任务配置和状态管理:通过编写Playbook实现自动化流程。
- 对云计算和大数据平台支持良好:适应现代IT环境的需求。
1.2 Ansible工作机制
Ansible通过SSH将模块推送到被管理节点执行,执行完后自动删除。这种机制不仅简化了管理流程,还确保了系统的安全性。Ansible可以结合SVN等工具管理自定义模块及任务编排,进一步提升管理效率和灵活性。
Ansible核心组成:
- Ansible:核心引擎,负责整体的自动化流程控制。
- Modules:内置核心模块和自定义模块,用于执行具体的任务。
- Plugins:补充模块功能,如连接插件、邮件插件等,增强Ansible的功能。
- Playbooks:剧本,定义多任务操作,通过YAML语法编写,实现复杂的自动化流程。
- Inventory:主机清单,定义被管理的主机和组,便于分类和管理。
1.3 Ansible角色(Role)
随着数据中心环境的复杂化,Playbook会变得庞大且难以维护。为了解决这一问题,Ansible引入了角色的概念。角色提供了对复杂任务的模块化管理,具有以下优点:
- 模块化管理:将任务组织为独立、可复用的剧本和文件。
- 外部加载机制:提供从外部加载任务、处理程序、变量的机制。
- 关联静态文件和模板:可关联静态文件和模板,便于管理和复用。
- 满足通用需求,可重复使用:适用于多种场景,提高效率。
- 严格的目录结构要求:确保角色的一致性和可维护性。
二、 Ansible环境安装部署
环境示例
类型 | IP |
---|---|
管理端 | 192.168.10.10 |
被管理端 | 192.168.10.30 |
被管理端 | 192.168.10.40 |
管理端安装Ansible
- 安装EPEL源:
yum install -y epel-release
EPEL(Extra Packages for Enterprise Linux)源提供了许多额外的软件包,包括Ansible。
- 安装Ansible:
yum install -y ansible
通过YUM包管理器安装Ansible,简单快捷。
目录结构
- 配置文件:
/etc/ansible/ansible.cfg
- 一般无需修改,包含Ansible的默认配置。
- 主机清单:
/etc/ansible/hosts
- 定义被管理的主机和组,便于分类和管理。
- 公共角色目录:
/etc/ansible/roles
- 用于存放Ansible角色,支持模块化管理。
配置主机清单
编辑/etc/ansible/hosts
文件,配置主机组和主机信息:
[webservers]
192.168.10.30
[dbservers]
192.168.10.40
- 组名和主机IP:通过组名(如
webservers
、dbservers
)管理不同类型的主机,便于分类和批量操作。
配置免密SSH登录
为了实现无需手动输入密码的自动化管理,配置管理端到被管理端的免密SSH登录:
- 生成密钥:
ssh-keygen -t rsa
按提示生成RSA密钥对,默认保存在~/.ssh/
目录下。
2. 复制密钥到被管理节点:
sshpass -p '登陆密码' ssh-copy-id root@192.168.10.30
sshpass -p '登录密码' ssh-copy-id root@192.168.10.40
使用sshpass
工具自动输入密码,将公钥复制到被管理节点。注意:在生产环境中,建议使用更安全的方式来管理密码和密钥。
三、 Ansible基础命令及模块操作
Ansible通过简单的命令格式和丰富的模块,实现对被管理节点的自动化操作。以下是常用的命令格式和模块示例。
命令格式
ansible <组名> -m <模块> -a <参数>
- <组名>:定义在主机清单中的组,如
webservers
、dbservers
。 - -m <模块>:指定要使用的模块,如
command
、shell
、yum
等。 - -a <参数>:传递给模块的参数,具体取决于所使用的模块。
常用模块示例
3.1 command模块
功能:远程执行命令,不支持管道/重定向。
示例:
ansible-doc -s command # 列出command模块的描述信息和操作动作
ansible webservers -m command -a 'date' # 在webservers组的所有主机上执行date命令
ansible all -m command -a 'ls /' # 在所有主机上执行ls /命令
常用参数:
- chdir:在远程主机上运行命令前进入指定目录。
- creates:判断指定文件是否存在,如果存在,不执行后面的操作。
- removes:判断指定文件是否存在,如果存在,执行后面的操作。
示例:
ansible all -m command -a "chdir=/home ls ./"
3.2 shell模块
功能:支持管道和shell特性,相当于调用远程主机的shell进程。
示例:
ansible-doc -s shell # 查看shell模块的描述信息
ansible dbservers -m shell -a 'echo 123456 | passwd --stdin test' # 设置用户test的密码
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2{print $2}") | cut -d" " -f2'
说明:Shell模块功能强大,但需谨慎使用,避免安全风险。
3.3 cron模块
功能:管理计划任务,支持添加和移除任务。
示例:
ansible-doc -s cron # 查看cron模块的描述信息
ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"' # 添加每分钟执行一次的cron任务
ansible webservers -a 'crontab -l' # 查看当前用户的cron任务
ansible webservers -m cron -a 'name="test crontab" state=absent' # 移除名为test crontab的cron任务
常用参数:
- minute/hour/day/month/weekday:定义计划任务的时间。
- job:任务计划要执行的命令。
- name:任务计划的名称。
- state:任务状态,
present
表示添加(可省略),absent
表示移除。
3.4 user模块
功能:管理用户账户。
示例:
ansible-doc -s user # 查看user模块的描述信息
ansible dbservers -m user -a 'name="test01"' # 创建用户test01
ansible dbservers -m command -a 'tail /etc/passwd' # 查看用户列表
ansible dbservers -m user -a 'name="test01" state=absent' # 删除用户test01
常用参数:
- name:用户名,必选参数。
- state:
present
表示创建,absent
表示删除。 - system:是否为系统账号。
- uid:用户UID。
- group:用户基本组。
- shell:默认使用的shell。
- move_home:如果设置的家目录已经存在,是否将已经存在的家目录进行移动。
- password:用户的密码,建议使用加密后的字符串。
- comment:用户的注释信息。
- remove:当state=absent时,是否删除用户的家目录。
3.5 group模块
功能:管理用户组。
示例:
ansible-doc -s group # 查看group模块的描述信息
ansible dbservers -m group -a 'name=mysql gid=306 system=yes' # 创建mysql组
ansible dbservers -a 'tail /etc/group' # 查看组列表
ansible dbservers -m user -a 'name=test01 uid=306 system=yes group=mysql' # 将test01用户添加到mysql组中
ansible dbservers -a 'tail /etc/passwd'
ansible dbservers -a 'id test01'
常用参数:
- name:组名,必选参数。
- gid:组GID。
- system:是否为系统组。
3.6 copy模块
功能:复制文件或内容到远程主机。
示例:
ansible-doc -s copy # 查看copy模块的描述信息
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640' # 复制/etc/fstab到远程主机的/opt/fstab.bak
ansible dbservers -a 'ls -l /opt/' # 查看/opt目录下的文件
ansible dbservers -a 'cat /opt/fstab.bak' # 查看复制的文件内容
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt' # 将helloworld写入/opt/hello.txt文件中
ansible dbservers -a 'cat /opt/hello.txt'
常用参数:
- dest:目标路径,使用绝对路径。
- src:源文件路径。
- mode:目标文件的权限。
- owner:目标文件的属主。
- group:目标文件的属组。
- content:直接指定复制到目标主机上的内容,不能与src一起使用。
3.7 file模块
功能:管理文件属性和链接。
示例:
ansible-doc -s file # 查看file模块的描述信息
ansible dbservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/fstab.bak' # 修改文件的属主、属组和权限
ansible dbservers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link' # 创建符号链接
ansible dbservers -m file -a 'path=/opt/abc.txt state=touch' # 创建一个空文件
ansible dbservers -m file -a 'path=/opt/abc.txt state=absent' # 删除一个文件
常用参数:
- path:文件或目录的路径。
- owner:属主。
- group:属组。
- mode:权限。
- state:状态,如
link
、touch
、absent
等。
3.8 hostname模块
功能:修改远程主机的主机名。
示例:
ansible dbservers -m hostname -a 'name=mysq101' # 将dbservers组的主机名修改为mysq101
说明:修改主机名后,可能需要重启系统或相关服务以使更改生效。
3.9 ping模块
功能:检测主机的连通性。
示例:
ansible all -m ping # 检测所有主机的连通性
说明:Ping模块用于快速检查Ansible管理的主机是否在线和可访问。
3.10 yum模块
功能:管理软件包的安装与卸载。
示例:
ansible-doc -s yum # 查看yum模块的描述信息
ansible webservers -m yum -a 'name=httpd' # 在webservers组的主机上安装httpd服务
ansible webservers -m yum -a 'name=httpd state=absent' # 卸载httpd服务
常用参数:
- name:软件包名称。
- state:状态,
present
表示安装,absent
表示卸载。
3.11 service/systemd模块
功能:管理服务的运行状态。
示例:
ansible-doc -s service # 查看service模块的描述信息
ansible webservers -a 'systemctl status httpd' # 查看httpd服务的运行状态
ansible webservers -m service -a 'enabled=true name=httpd state=started' # 启动httpd服务并设置开机自启
常用参数:
- name:服务名称。
- state:动作,如
started
、stopped
、restarted
。 - enabled:是否设置开机自启。
- runlevel:定义在哪些运行级别下自启动。
3.12 script模块
功能:在远程主机上执行本地脚本。
示例:
ansible-doc -s script # 查看script模块的描述信息
vim test.sh # 创建一个简单的脚本
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
chmod +x test.sh # 赋予执行权限
ansible webservers -m script -a 'test.sh' # 在webservers组的主机上执行test.sh脚本
ansible webservers -a 'cat /opt/script.txt' # 查看脚本执行结果
说明:Script模块用于批量执行本地的Shell脚本,简化了脚本的分发和执行过程。
3.13 setup模块
功能:收集被管理节点的系统信息(Facts)。
示例:
ansible-doc -s setup # 查看setup模块的描述信息
ansible webservers -m setup # 获取webservers组主机的所有Facts信息
ansible dbservers -m setup -a 'filter=*ipv4' # 使用filter筛选特定的Facts信息,如IPv4地址
说明:Setup模块用于获取被管理节点的详细系统信息,便于后续的配置和管理。
四、 Inventory主机清单与变量配置
4.1 Inventory支持对主机进行分组
Inventory文件(通常为/etc/ansible/hosts
)用于定义被管理的主机和组,支持灵活的分组和变量配置。
示例:
[webservers]
192.168.10.14:2222 # 冒号后定义远程连接端口,默认是SSH的22端口
192.168.10.1[2:5] # 支持主机范围,如192.168.10.12到192.168.10.15[dbservers]
db-[a:f].example.org # 支持主机名匹配,如db-a.example.org到db-f.example.org
4.2 常用Inventory变
变量名 | 含义 |
---|---|
ansible_host | 节点IP |
ansible_port | SSH端口,默认22 |
ansible_user | SSH用户 |
ansible_password | SSH密码(未使用密钥时) |
ansible_ssh_private_key_file | 私钥文件 |
ansible_become | 提升权限(如sudo) |
ansible_become_method | 提升方式(sudo/su/runas) |
ansible_become_user | 提升为指定用户 |
ansible_become_password | 提升密码 |
基本示例
(1) 主机变量
为特定主机定义变量,覆盖全局或组变量。
[webservers]
192.168.10.14 ansible_port=2222 ansible_user=root ansible_password=abc1234
(2) 组变量
为整个组定义变量,适用于组内的所有主机。
[webservers:vars]
ansible_user=root
ansible_password=abc1234
[all:vars]
ansible_port=22
(3) 组嵌套
通过组嵌套,将多个组组合成一个更大的组,便于统一管理。
[nginx]
192.168.10.20
192.168.10.21
192.168.10.22
[apache]
192.168.10.30
192.168.10.31
192.168.10.32
192.168.10.33
[webs:children]
nginx
apache
说明:通过组嵌套,可以将nginx
和apache
组组合成webs
组,便于统一管理所有Web服务器。
结语
通过本文的介绍,您应该对Ansible有了一个全面的了解,包括其基本概念、运行机制、安装部署以及基础命令和模块操作。Ansible以其简单易用、功能强大和高度可扩展性,成为自动化运维领域的重要工具。无论是管理少量服务器还是大规模的基础设施,Ansible都能帮助您提高效率、降低复杂性,并确保系统的一致性和可靠性。
在实际应用中,建议结合具体的业务需求,深入学习和使用Ansible的高级功能,如Playbook、角色(Roles)、模板(Templates)和变量(Variables)等,以实现更复杂和自动化的运维流程。同时,持续关注Ansible社区和官方文档,获取最新的功能更新和最佳实践,不断提升您的自动化运维能力。
希望本文能为您的Ansible之旅提供有价值的指导和帮助,祝您在自动化运维的道路上取得更大的成功!