一、Ansible概述
1.1 什么是Ansible
Ansible 是一个开源的自动化工具,用于配置管理、应用程序部署和任务自动化。它让你可以通过编写简单的 YAML 文件(剧本,Playbooks),轻松管理和配置多个服务器。Ansible 的特点是无代理架构,它通过 SSH 连接到远程主机,不需要在目标服务器上安装任何软件。
除了 Ansible,常用的 IT 自动化和配置管理工具还有很多,如Chef、Puppet、SaltStack
1.2 Ansible 的特性
-
批量管理与部署Ansible 能够轻松管理数以千计的主机。管理员不再需要逐一登录每个主机执行操作,而只需在控制节点上执行命令,Ansible 会自动将这些命令应用于所有目标主机。这极大提高了运维效率,尤其在处理大规模基础设施时。
-
模块化架构
Ansible 采用基于模块的工作机制。Ansible 本身并不执行任务,而是通过调用各种模块来完成具体操作。例如:
每个模块都是功能独立的,可以针对不同的任务进行调用,使得 Ansible 的功能非常强大和灵活。
- copy 模块用于将文件从控制节点复制到远程主机。
- service 模块用于管理服务的启动、停止和重启。
-
**无代理特性(Agentless)**Ansible 的一大亮点是其无代理的架构。用户只需在控制节点上安装 Ansible,而不需要在被管理的每个主机上安装任何额外的服务或代理。Ansible 通过 SSH 连接到远程主机,执行命令并返回结果。这使得 Ansible 的部署和使用变得异常简单。
-
**幂等性(Idempotence)**Ansible 的许多模块具有幂等性,这意味着多次执行同一操作不会改变系统的最终状态。例如,如果一个服务已经在运行,执行启动服务的命令不会产生任何副作用。这使得 Ansible 在自动化管理时更加安全可靠。
1.3 Ansible 的工作流程
- 解析 Playbook:Ansible 首先解析 Playbook 文件,读取其中的 hosts、tasks、variables 等信息。
- 选择目标主机:根据 Inventory 文件选择符合条件的目标主机。
- 建立 SSH 连接:通过 SSH 与目标主机建立连接,使用提供的用户凭证(如密钥或密码)
- 执行任务:Ansible 按照 Playbook 中的顺序执行任务,每个任务会在目标主机上执行相应的模块(如 apt、yum、copy 等)。
- 处理结果:每个任务执行完后,Ansible 会收集返回的结果并进行处理,包括成功、失败或改变的状态。
1.4 Ansible 特点
-
简单部署
Ansible 的部署过程非常简单,只需在控制节点上安装 Ansible,远程主机无需做任何操作。
-
基于 SSH 的管理
默认情况下,Ansible 使用 SSH 协议连接和管理远程设备,这种方式安全可靠。
-
集中化管理
Ansible 提供主从架构,用户可以集中管理多个节点,降低了运维复杂性。
-
功能强大与扩展性
Ansible 的配置简单,同时功能强大,支持用户自定义模块和插件,能够满足各种复杂的自动化需求。
-
通过 API 和自定义模块扩展
用户可以通过 API 和 Python 自定义模块轻松扩展 Ansible 的功能,以适应特定的业务需求。
-
使用 Playbooks
Playbooks 允许用户定制复杂的配置和状态管理,支持更灵活的自动化方案。
-
支持云计算和大数据环境
Ansible 对云计算平台(如 AWS、Azure 等)和大数据框架(如 Hadoop、Spark 等)有很好的支持,能够有效管理云基础设施。
二、Ansible
在进行 Ansible 的使用之前,我们需要在管理端安装 Ansible。假设我们的管理端 IP 为 192.168.10.23
,被管理端 IP 分别为 192.168.10.14
和 192.168.10.15
。
2.1 管理端安装 Ansible
首先,安装 EPEL(Extra Packages for Enterprise Linux)源,然后安装 Ansible:
# 安装 EPEL 源
yum install -y epel-release
# 安装 Ansible
yum install -y ansible
2.2 Ansible 目录结构
安装完成后,Ansible 的主要目录结构如下:
2.3 配置主机清单
在 /etc/ansible
目录中配置主机清单 hosts
,定义需要管理的主机:
cd /etc/ansible
vim hosts
# 配置组名和被管理主机
[webservers]
192.168.10.14
[dbservers]
192.168.10.15
2.4 配置密钥对验证
为了实现免密登录,我们需要生成 SSH 密钥对并将公钥复制到被管理的主机上:
# 生成 SSH 密钥对
ssh-keygen -t rsa # 一路回车
# 将公钥复制到被管理主机
sshpass -p 'your_password' ssh-copy-id root@192.168.10.14
sshpass -p 'your_password' ssh-copy-id root@192.168.10.15
三、Ansible 命令行模块
Ansible 的命令行格式如下:
ansible <组名> -m <模块> -a <参数列表>
1. 使用 ansible-doc
可以使用 ansible-doc
命令列出所有已安装的模块:
ansible-doc -l # 列出所有模块
2. command 模块
command
模块用于在远程主机执行命令,不支持管道和重定向等 shell 特性。
# 查看 command 模块的描述
ansible-doc -s command
# 在指定 IP 执行命令
ansible 192.168.10.14 -m command -a 'date'
ansible webservers -m command -a 'date'
常用参数:
-
chdir
:在远程主机上运行命令前切换到指定目录。 -
creates
:判断指定文件是否存在,如果存在,则不执行后续操作。 -
removes
:判断指定文件是否存在,如果存在,则执行后续操作。ansible all -m command -a "chdir=/home ls ./"
3. shell 模块
shell
模块用于在远程主机执行命令,支持管道等 shell 特性。
# 查看 shell 模块的描述
ansible-doc -s shell
# 使用 shell 模块执行命令
ansible dbservers -m shell -a 'echo 123456 | passwd --stdin test'
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print $2}")'
4. cron 模块
cron
模块用于在远程主机定义任务计划。
# 查看 cron 模块的描述
ansible-doc -s cron
# 添加计划任务
ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="jqg crontab"'
# 列出计划任务
ansible webservers -a 'crontab -l'
# 移除计划任务
ansible webservers -m cron -a 'name="jqg crontab" state=absent'