前言
自动化运维是指利用自动化工具和技术来简化、自动化和优化IT基础设施的管理和运维过程,从而提高效率、降低成本,并减少人为错误。在当今复杂的IT环境中,自动化运维已经成为许多组织和企业提高生产力和保证系统稳定性的重要手段。Ansible作为一种自动化运维工具,在这样的背景下应运而生,它通过简单、灵活的方式实现了IT基础设施的自动化管理。
目录
一、Ansible 简介
1. 自动化运维工具
有许多自动化工具可供选择,每个都有其自身的特点和适用场景。一些常见的自动化工具包括:
① Puppet(已淘汰)
- Puppet 是一个用于自动化配置管理的工具,基于 C/S 架构,使用基于 Ruby 的 DSL(领域特定语言)来描述系统配置,并通过 http 协议代理客户端来管理节点。
② Chef (已淘汰)
- Chef 是一个用于自动化基础架构配置的开源工具。使用基于 Ruby 的 DSL(领域特定语言)来描述系统配置,并通过客户端-服务器(C/S)架构来管理系统。
③ SaltStack(市场占有率低)
- SaltStack 是一个基础设施自动化平台,具有高度可扩展性和灵活性。它使用基于 Python 的 DSL 来描述系统配置,通过 ssh 协议传输并使用分布式架构来管理节点。
④ Ansible(市场占有率高)
- Ansible 是一个基于 Python 开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet 和Saltstack 能实现的功能,Ansible 基本上都可以实现。
2. ansible 概述
Ansible是一款开源的自动化工具,通过简洁的DSL(领域特定语言)描述系统配置和任务;在管理节点将 ansible 模块通过 ssh 协议推送到被管理节点执行,执行完自动删除模块或命令。
3. 组成
- INVENTORY:Ansible 管理主机的清单 /etc/anaible/hosts 需要管理的服务清单
- MODULES:Ansible 执行命令的功能模块,多数为内置核心模块,也可自定义
- PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
- API:供第三方程序调用的应用程序编程接口
4. 特点
① 部署简单,只需在主控端部署 Ansible 环境, 被控端无需做任何操作
② 默认使用 SSH 协议设备进行管理;
③ 主从集中化管理
④ 配置简单、功能强大、扩张性强;
⑤ 支持 API 及自定义模块,可以通过 Pyhton 轻松扩展
⑥ 通过 playbooks 来定制强大的配置、状态管理
⑦ 对云计算平台、大数据都有很好的支持
5. 工作机制原理
Ansible 基于模块化工作,本身没有批量部署的能力,真正具有批量部署的是Ansible所运行的模块(Modules)。Ansible 只是提供了一种框架,在 Ansible 管理体系中,存在着管理节点(Control Node)和被管理节点(Managed Node)两种角色。被管理节点通常称之为资产,会放在主机清单(Inventory)文件中,Inventory 其实就是由 Ansible 所管理的主机形成的。在管理节点上,Ansible 将 Ad-Hoc(批量执行单条命令,即单模块)或者 Playbook(任务剧本)转化为 Python 脚本,最终通过 ssh 网络协议将这些 Python 脚本传递到被管理节点,在被管理服务器上依次执行,并且会实时将结果返回给管理节点,执行完后进行清理模块或命令。返回结果顺序根据网络、被管理服务器本身性能等因素有关。
① 管理节点(Control Node)
- 在控制节点上安装 Ansible,并使用 Ansible 的命令行工具或者其他接口来编写和执行自动化任务;
② 主机清单(Inventory)
- 控制节点上维护一个主机清单文件,列出了需要管理的目标主机的信息,包括IP地址、主机名等;
③ 任务剧本(Playbook)
- Playbook 通常是 josn 格式的 YAML 文件,定义了一系列任务和配置信息,用于描述自动化任务的执行流程。Playbook 编排定义 Ansible 任务集的配置文件,由 Ansible 顺序依次执行,相当于多个 Ad-Hoc 的配置文件 ;
④ 单模块(AD-Hoc)
- 指的是在不使用 Playbook 的情况下,直接使用 ansible 命令行工具执行临时命令。这些命令通常是一次性的、针对特定任务的,而不需要编写长期维护的 Playbook。通过 AD-Hoc 命令,可以快速地在远程主机上执行特定的任务,比如文件操作、软件安装、服务管理等;
⑤ 执行任务模块(Modules)
- Ansible 提供了丰富的模块,用于执行各种管理任务,比如文件操作、软件包管理、服务管理等;
⑥ Connection Plugins
- 在 Ansible 中,默认情况下,Ansible 会利用目标主机上已安装的 Python 解释器来执行远程命令。Ansible 的核心引擎和大部分模块都是基于 Python 编写的,因此要求目标主机上必须安装有Python(通常是2.6版本或以上)才能正常运行 Ansible 管理任务;
⑦ SSH 连接
- Ansible 使用 SSH 协议来连接目标主机,并在目标主机上执行任务;
⑧ 被管理节点(Managed Node)
- 是指由 Ansible 进行配置、管理和自动化操作的远程主机或设备。这些被管理节点是 Ansible 控制节点所管理的目标系统,可以是服务器、虚拟机、网络设备或其他类型的计算设备。
二、安装部署
1. 环境准备
节点名称 | IP | 是否安装Ansible |
control 管理节点 | 192.168.190.103 | 是 |
managed1 被管理节点 | 192.168.190.104 | 否 |
managed2 被管理节点 | 192.168.190.105 | 否 |
systemctl stop firewalld.service
setenforce 0
vim /etc/hosts
192.168.190.103 control
192.168.190.104 managed1
192.168.190.105 managed2
2. 管理节点安装 ansible
[root@control ~]# yum install -y epel-release # 先安装epel源
[root@control ~]# yum install -y ansible
[root@control ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
3. 查看相关文件
[root@control ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── hosts
└── roles
[root@control ~]# ll /etc/ansible/
总用量 24
-rw-r--r--. 1 root root 19985 1月 16 2022 ansible.cfg
-rw-r--r--. 1 root root 1016 1月 16 2022 hosts
drwxr-xr-x. 2 root root 6 1月 16 2022 roles
# ansible.cfg: 这是Ansible的配置文件。包含了一些全局配置选项,比如默认的模块路径、远程用户等;
# hosts: 这是Ansible的主机清单文件,也称为inventory文件。在这个文件中列出了Ansible将要管理的主机或主机组。通过编辑这个文件,可以添加、删除或修改要管理的主机信息;
# roles: 这是Ansible角色的存放目录。角色是一种组织和重用Playbooks的方式,它将相关的任务、变量和处理逻辑组织成一个可复用的单元。在这个目录中,你可以存放自己编写或从其他地方获取的角色,以便在Playbooks中使用。
4. 配置主机清单
[root@control ~]# cd /etc/ansible
[root@control ansible]# ls
ansible.cfg hosts roles
[root@control ansible]# vim hosts
[webs] # 配置组名
192.168.190.104 # 组里包含的被管理的主机IP地址或主机名(主机名需要先修改/etc/hosts文件)
[dbs]
192.168.190.105
5. 免密管理 ssh-keygen
用于生成SSH密钥对的命令行工具。它通常用于创建公钥和私钥,以便进行安全的SSH通信。
生成 SSH 密钥对:
[root@control ~]# ssh-keygen -t rsa # 一直回车
# rsa表示生成RSA密钥对,RSA是一种非对称加密算法
[root@control ~]# ls .ssh/
id_rsa id_rsa.pub # id_rsa 是私钥文件;id_rsa.pub 是公钥文件
将本地主机上的SSH公钥复制到远程主机:
[root@control ~]# ssh root@192.168.190.104
[root@control ~]# ssh root@192.168.190.105
[root@control ~]# sshpass -p '123' ssh-copy-id root@192.168.190.104
[root@control ~]# sshpass -p '123' ssh-copy-id root@192.168.190.105
[root@control ~]# ls .ssh/
id_rsa id_rsa.pub known_hosts
5.1 测试连通性
① 测试本机
[root@control ~]# ansible localhost -m ping
localhost | SUCCESS => { # 绿色字体
"changed": false,
"ping": "pong"
}
② 分别测试 managed1 和 mansged2,观察返回信息
[root@control ~]# ansible webs -m ping
192.168.190.104 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@control ~]# ansible dbs -m ping
192.168.190.105 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
} # 绿色字体
5.2 简洁输出
[root@control ~]# ansible 192.168.190.104 -m ping -o
192.168.190.104 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
三、命令行模块
指的是在不使用 Playbook 的情况下,直接使用 ansible 命令行工具执行临时命令。这些命令通常是一次性的、针对特定任务的,而不需要编写长期维护的 Playbook。通过 AD-Hoc 命令,可以快速地在远程主机上执行特定的任务,比如文件操作、软件安装、服务管理等。
命令格式:
ansible <组名> -m <模块> -a <参数列表> # 默认模块为command,可省略
ansible-doc -l # 列出所有已安装的模块,按q退出
1. command 模块
command 模块允许用户在目标主机上执行特定的命令,主要功能是在远程主机执行命令,此为默认模块,可忽略 -m 选项;此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现 ;注意此模块不具有幂等性 (幂等性是指在对系统进行操作时,无论执行多少次,系统的状态都保持一致的特性)。以下是 command 模块的一般用法:
ansible <host-pattern> [-m command] -a "<command>"
#<host-pattern> 是要操作的目标主机或主机组。
#-m command 指定要使用的模块是 "command"。
#-a "<command>" 传递给模块的参数,即要在目标主机上执行的命令。
[root@control ~]# ansible-doc -s command # -s 列出指定模块的描述信息和操作动作
示例:
指定主机执行 date 命令
所有主机执行 date 命令
常用的参数:
chdir:在远程主机上运行命令前提前进入目录
creates:判断指定文件是否存在,如果存在,不执行后面的操作
removes:判断指定文件是否存在,如果存在,执行后面的操作
示例:
2. shell 模块
在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能);和command相似,用shell执行命令支持各种符号,比如:*,$, >,此模块不具有幂等性。
示例:
修改用户密码
查看主机 IP 地址
3. cron 模块
用于管理 cron 作业(定时任务),支持时间:minute,hour,day,month,weekday。在远程主机定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除。
常用的参数:
minute/hour/day/month/weekday:分/时/日/月/周
job:任务计划要执行的命令
name:任务计划的名称
示例:
创建计划任务每分钟打印一次内容、查看计划任务、删除计划任务
4. user 模块
管理系统用户的模块。它允许用户创建、删除和修改系统用户以及相关属性。
常用的参数:
name:用户名,必选参数
state=present|absent:创建账号或者删除账号,present表示创建,absent表示删除
system=yes|no:是否为系统账号
uid:用户uid
group:用户基本组
shell:默认使用的shell
move_home=yse|no:如果设置的家目录已经存在,是否将已经存在的家目录进行移动
password:用户的密码,建议使用加密后的字符串
comment:用户的注释信息
remove=yes|no:当state=absent时,是否删除用户的家目录
示例:
创建用户zs、查看用户信息、删除用户
5. group 模块
管理系统用户组的模块。它允许用户创建、删除和修改系统用户组以及相关属性。
示例:
创建 mysql 组,将用户 lisi 加入到 mysql 组
6. copy 模块
从 ansible 服务器主控端复制文件到远程主机,src=file 如果是没指明路径,则为当前目录或当前目录下的 files 目录下的 file 文件。常用参数如下:
dest:指出复制文件的目标及位置,使用绝对路径,如果是源目录,指目标也要是目录,如果目标文件已经存在会覆盖原有的内容
src:指出源文件的路径,可以使用相对路径或绝对路径,支持直接指定目录,如果源是目录则目标也要是目录
mode:指出复制时,目标文件的权限
owner:指出复制时,目标文件的属主
group:指出复制时,目标文件的属组
content:指出复制到目标主机上的内容,不能与 src 一起使用
示例:
复制文件并设置属主、授权
7. file 模块
设置文件属性,创建软链接等,关键字选项如下:
path #指定文件路径
state #文件状态 有:新建(touch) 删除(absent) 文件夹(directory) 连接文件(link)等
src #源文件
mode #权限
owner #属主
group #属组
recurse #递归,修改属性时有效
示例:
修改文件的属主属组权限
设置/opt/fstab.link为/opt/fstab.bak的链接文件
创建、删除一个文件
8. hostname 模块
用于管理远程主机上的主机名,一般不使用此模块,主机名会一致。
示例:
9. ping 模块
检测远程主机的连通性
示例:
10. yum 模块
yum 管理软件包,只支持 RHEL,CentOS,fedora,不支持 Ubuntu 其它版本;在远程主机上安装与卸载软件包。
示例:
安装、卸载 tree
[root@control ~]# ansible webs -m yum -a 'name=tree'
[root@control ~]# ansible webs -m yum -a 'name=tree state=absent'
11. service/systemd 模块
它可以启动、停止、重新启动和重新加载系统服务;用于管理远程主机上的管理服务的运行状态;常用的参数:
name:被管理的服务名称
state=started|stopped|restarted:动作包含启动关闭或者重启
enabled=yes|no:表示是否设置该服务开机自启
runlevel:如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动
示例:
查看 dbs 服务器 httpd 运行状态、启动或停止 httpd 服务
12. script 模块
在远程主机上运行 ansible 服务器上的脚本(无需执行权限,本身不执行),此模块不具有幂等性。
示例:
[root@control ~]# vim cs.sh
#!/bin/bash
echo "hello" > /opt/script.txt
[root@control ~]# chmod +x cs.sh
13. setup 模块
收集有关远程主机的各种系统信息。这些信息包括操作系统类型、IP 地址、内存和 CPU 使用情况、磁盘空间以及许多其他有用的系统级信息。这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度。可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息。
常用参数:
gather_subset: #指定要收集的子集信息,例如all, network, hardware, virtual等。
gather_timeout:#设置收集信息的超时时间,以秒为单位。
filter: #用于过滤输出信息,可以根据需要选择性地显示特定信息。
fact_path: #指定一个目录,将收集到的信息保存为 JSON 文件。
retries: #在发生连接问题时尝试重新连接的次数。
示例:
查看主机信息并过滤有关 ipv4 的信息