企业级自动化运维工具Ansible
[TOC]
一、介绍
1、自动化运维发展历程
特点:
- 早期计算机时代:主要依赖运维人员手动管理服务器等。
- 集中管理和人工操作:系统更新、配置、监控、故障排查等任务全部手动完成。
- 局限性:效率低下、容易出现人为错误,且无法应对大规模环境。
典型场景:小型数据中心,几台服务器,运维人员使用SSH等手动登录服务器进行操作。
特点:
- 自动化初步萌芽:运维人员开始使用Shell、Python、Perl等脚本语言来实现部分重复性任务的自动化,如批量部署、日志收集、监控和报警等。
- 自定义脚本和工具:企业根据需求编写自定义脚本来简化日常运维工作,减少手动操作。
典型场景:通过Shell脚本实现批量管理、定时任务调度等,减轻重复性工作负担。
特点:
- 引入专用运维工具:随着IT基础设施的复杂化,运维工具逐渐普及。常见工具如Puppet、Ansible、SaltStack等开始出现,提供了标准化的自动化运维能力。
- 集中式管理:通过工具的集中式管理能力,运维人员可以统一管理多台服务器,实现大规模环境下的自动化部署、配置管理和系统更新。
典型应用:使用Puppet进行配置管理,Ansible进行批量操作,SaltStack进行大规模部署。
特点:
- 容器化:随着Docker和Kubernetes等技术的普及,运维自动化进入了容器化时代。基础设施以容器为单位进行管理,运维流程更加简化和标准化。
- 微服务架构:应用被拆解为独立的微服务,运维需要应对大量的分布式服务,自动化工具集成了容器编排、服务发现、动态伸缩等功能。
- 持续集成和持续交付(CI/CD):Jenkins、GitLab CI等工具与Kubernetes和Docker相结合,实现了自动化的应用交付和部署。
典型应用:Kubernetes用于容器编排,结合CI/CD流水线实现自动化应用发布和扩展。
2、自动化运维工具对比
- Puppet:基于 Ruby 开发,采用 C/S 架构,扩展性强,基于SSL,远程命令执行相对较弱;
- SaltStack:基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用YAML,使得配置脚本更简单.需要配置客户端以及服务器端。每台被控制节点需要安装agent;
- Ansible:基于Python开发,分布式,无需客户端,轻量级,配置语法使用YAML语言,更强的远程命令执行操作。
3、Ansible简介
ansible是自动化运维工具,基于Python开发、分布式、无需客户端、轻量级。实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
1 | Ansible特性 |

1 | connection plugins:连接插件,负责和被监控端实现通信,默认使用SSH连接。 |
二、ansible安装
1. 环境准备
- 初始化工作
1 | #>>> 本地解析 |
ansible-server生成SSH密钥对
1 | #>>> 生成密钥 |
ansible-server传递公钥
1 | #>>> 传递公钥 |
- 安装
1 | >>> 配置EPEL网络yum源 |

三、Ansible 文件介绍
1、主配置文件
文件位置:
1 | /etc/ansible/ansible.cfg |
常用文件内容介绍:
1 | #inventory = /etc/ansible/hosts |
#inventory = /etc/ansible/hosts
- 解释: Ansible 的默认
主机清单位置。主机清单列出了目标主机的 IP 地址或主机名。
#library = /usr/share/my_modules/
- 解释:指定 Ansible 自定义模块的库路径。默认情况下,Ansible 使用内置的模块,但通过设置
library,你可以将自己编写的自定义模块放在/usr/share/my_modules/目录中。
#remote_tmp = ~/.ansible/tmp
- 解释:指定 Ansible 在远程主机上存储临时文件的路径。默认情况下,Ansible 会在远程主机的
~/.ansible/tmp目录中创建临时文件和目录。
#local_tmp = ~/.ansible/tmp
- 解释:指定 Ansible 在本地主机上存储临时文件的路径。Ansible 会在执行任务时在本地生成临时文件,默认路径是
~/.ansible/tmp。
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
- 解释:过滤 Ansible 插件的配置文件路径。这个配置文件控制哪些插件可以加载和使用。
#forks = 5
- 解释:Ansible 并行处理的最大任务数量。
#poll_interval = 15
- 解释:Ansible 检查后台任务状态的轮询间隔,单位是秒。默认情况下,Ansible 每隔 15 秒检查一次后台运行的任务状态。
#sudo_user = root
- 解释:远程主机上执行命令时的默认 sudo 用户。这里配置的是
root用户,意味着 Ansible 在使用 sudo 提权时会尝试以 root 用户身份执行任务。
#ask_sudo_pass = True
- 解释:Ansible 将在运行任务时提示输入 sudo 密码。这在目标主机配置了需要输入 sudo 密码的情况下使用。
#ask_pass = True
- 解释:Ansible 将在运行任务时提示输入 SSH 密码。如果目标主机不使用密钥认证而是通过密码登录,可以启用此项。
#transport = smart
- 解释:Ansible 与目标主机通信时使用的传输方式。默认的
smart模式会自动选择最佳的传输方式(通常是基于 SSH)。
#remote_port = 22
- 解释:Ansible 连接到远程主机时使用的默认 SSH 端口。默认值为
22。
2、主机清单
文件位置:
1 | /etc/ansible/hosts |
官方文档: http://docs.ansible.com/ansible/intro_inventory.html#
Inventory文件通常用于定义要管理主机的认证信息,例如ssh登录用户名、密码以及key相关信息。
1 | >>> 查看配置文件 |
1 | >>>语法: |
Ansible Inventory 常见的内置参数:

1 | >>> 查看组内主机列表: |
3、测试
Ansible常用命令
1 | #>>> 列出所有模块 |
1 | 语法: |

1 | [root@ansible-server ~]# ansible all -m ping -o |

使用案例:
1 | >>> 指定单台机器: |
4、Ansible执行过程
Ansible 在执行命令之前会加载配置文件(通常位于
/etc/ansible/ansible.cfg)并读取主机清单文件。Ansible 根据配置文件或命令行参数决定如何连接远程主机。
Ansible 使用模块(module)在远程主机上执行具体任务。Ansible 会将模块发送到远程主机,并通过 Python 解释器或其他指定解释器执行这些模块。但需要注意的是:ansible会将模块或者命令生成对应的临时文件,并将文件通过ssh传输至远程主机的对应执行用户的
$HOME/.ansible/tmp/ansible-tmp-随机数字/随机字符串.py文件。并添加执行权限。模块执行完成后,Ansible 会收集结果并将其返回到控制节点。每个模块返回的数据为 JSON 格式,Ansible 会将这些数据解析为易读的输出,显示在控制台中。删除临时py文件。并退出。
1 | #>>> 测试 |

1 | [root@ansible-server ~]# grep rm test.log |

5、Ansible执行颜色分类
绿色:执行成功并且没有改变内容;黄色:执行成功并且对目标主机做的更改操作;红色:命令或模块没有执行成功。
6、Ansible中shell模块几乎可以做任何事情,那为什么要有别的那么多模块且写剧本的时候明明可以从头到尾使用shell模块,但是为什么还是要使用别的模块呢?
因为幂等性。在 Ansible 中,幂等性指的是运行相同的剧本或任务多次时,其结果应该是相同的,不会产生副作用或重复更改。也就是说,不论你执行剧本多少次,系统的最终状态都应保持一致,不会改变。
而如果我们从头到尾shell的话,是无法保证幂等性的,有的时候可能一些操作之前已经之前过了,如果使用shell的话他还会再给我们执行一次,回显颜色会为黄色。但是如果我们使用的是其对应功能的模块的话,那么他会检查我们之前是否做过这步操作,如果做过他就不会再执行。回显为绿色。
所以这会对运维人员有些许干扰,因为大部分情况我们会根据回显颜色来判断执行的结果。情况严重的话,有可能会产生一些副作用。
ansible中分模块来干不同的事情有点类似于微服务架构,采用分布式,降低了紧密型(解耦),增加了可维护性。
四、Ansible模块使用
1、command模块(默认)
ansible 的 command 模块是最常用的模块之一,它用于在远程主机上运行命令。与 shell 模块不同的是,command 模块执行命令时不会通过 shell 执行,因此不支持管道、重定向等 shell 特性。
1 | [root@ansible-server ~]# ansible webservers -m command -a "uptime" |

1 | [root@ansible-server ~]# ansible webservers -a "df -Th" |

1 | [root@ansible-server ~]# ansible webservers -a "ls " |

2、shell模块
Ansible 的 shell 模块用于在远程主机上通过 shell 执行命令。与 command 模块不同的是,shell 模块允许你使用所有的 shell 特性,例如管道、重定向、变量扩展等。
1 | [root@ansible-server ~]# ansible webservers -m shell -a "df -Th | grep root" |

3、USER模块
user 模块用于在远程主机上管理用户账户。它能够创建、删除、修改用户以及设置用户的权限、组和密码等。
1 | #>>> 创建用户 |

1 | #>>> 删除用户 |

1 | #>>> 创建用户并设置Shell和主目录 |

1 | #>>> 添加用户到指定组 |

4、yum模块
yum 模块用于主要通过 yum 包管理器进行安装、升级、删除和管理仓库。它是处理软件包的一个常见模块,适用于基于 yum 包管理器的 Linux 发行版。
1 | #>>> 安装服务 |
5、service模块
service 模块用于管理系统服务,例如启动、停止、重启服务或确保服务处于特定状态。
1 | #>>> 启动服务 |
6、file模块
file 模块用于管理文件、目录和符号链接的属性,包括创建、删除、修改权限等。
1 | #>>> 创建目录 |
7、copy模块
copy 模块用于从控制节点将文件或目录复制到目标主机。
常见选项:
src:源文件或目录的路径。dest:目标路径。backup:是否在目标上备份现有文件(值为yes时备份)。force:是否强制覆盖目标文件(默认为yes)。mode:设置目标文件或目录的权限(如0644)。
1 | #>>> 复制单个文件到远程主机 |
注意:如果需要拷贝的目录为空,则无法拷贝至目标主机。
1 | #>>> 复制文件并修改权限 |
注意:不覆盖文件代表含义就是。但是需要拷贝的文件在目标主机的路径下存在。则不执行copy
1 | #>>> 利用字符串生成新文件 |

8、Script模块
script 模块用于在目标主机上执行本地脚本。但需要注意的是script 模块只是在远程主机上执行ansible本地脚本,因此需要确保脚本是可以在远程主机的环境中正确执行的。执行脚本的路径必须是相对于控制节点的路径,而不是远程主机的路径。
1 | #>>> 编写测试脚本 |
9、archive模块
archive 模块用于在目标主机上创建压缩文件(归档文件)到目标主机的指定目录。它可以将文件或目录打包成 tar、zip 或其他格式。
1 | #>>> 压缩目录 |
10、unarchive模块
unarchive 模块用于在目标主机上解压存档文件(如 .tar, .zip 等)。也可以将控制主机的压缩包拷贝至目标主机解压或远程的压缩文件,并将其解压到指定的目录中。
1 | #>>> 将当前主机的压缩包拷贝目标主机并解压,并且修改相关权限 |

1 | #>>> 将目标主机压缩包解压到指定目录 |

1 | #>>> 从远程连接下载安装包,并解压到指定目录 |

11、Fetch模块
fetch 模块用于从远程主机复制文件到本地主机。该模块的主要用途是从目标机器获取文件(如日志、配置文件等)并存储在控制节点的指定位置。目前还没有远程拷贝目录到控制主机的功能。未来可能会实现!记住是可能哟。嘿嘿!
1 | >>> 将目标主机文件拷贝到当前主机目录下 |
12、Hostname模块
hostname 模块用于在远程主机上设置或获取主机名。无法通过命令行设置多个主机名。否则会出现冲突。
1 | #>>> 修改单个主机的主机名 |

13、Cron模块
cron 模块用于管理远程主机上的计划任务(cron jobs),可以添加、删除或修改已有的任务。
1 | #>>> 创建计划任务:周一至周五每天凌晨2点20备份数据库 |

1 | #>>> 禁用计划任务 |

1 | #>>> 启动计划任务 |

1 | #>>> 删除计划任务 |

14、Setup模块
setup 模块用于从远程主机收集“事实”,即主机的硬件、网络和操作系统相关的信息。setup 模块会收集诸如 IP 地址、操作系统类型、磁盘空间、内存、环境变量等信息,默认情况下,Ansible 在执行任务时会自动收集这些信息,但也可以通过显式调用 setup 模块来手动收集。
1 | #>>> 查看主机内核版本 |

1 | #>>> 查看主机ipv4相关信息 |

1 | #>>> 查看内存的总大小 |

五、ansible-playbook 剧本
1、介绍
playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。
ansible通过不同的模块实现相应的管理,管理的方式通过定义的清单文件(hosts)所管理的主机包括认证的方式连接的端口等。所有的功能都是通过调用不同的模块(modules)来完成不同的功能的。不管是执行单条命令还是play-book都是基于清单文件。
2、playbook格式
playbook由yaml语言编写。YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。 驼峰式
一个剧本里面可以有多个play,每个play只能有一个tasks,每个tasks可以有多个name
1 | Variables # 变量元素,可传递给Tasks/Templates使用; |
playbook的基础组件:
1 | tasks: |
1 | name: |
1、hosts
hosts 组件定义了任务要运行在哪些主机或主机组上。hosts 是 Playbook 的核心部分之一,因为它决定了将这些任务分发到哪些远程主机执行。
- 语法格式
1 |
|
- 常见用法
1 | #>>> 指定单个主机 |
2、tasks
tasks 组件用于定义一系列将被执行的操作。每个 tasks 列表中的任务都描述了一项操作(如安装软件、修改文件、管理服务等),并且它们是按顺序执行的。
1 |
|
3、示例
1. 安装nginx服务,并且发布服务
1 | #>>> 切换目录 |

具体字段的含义如下:
192.168.174.21: 目标主机的 IP 地址。ok=4: 有 4 个任务成功执行,没有发生错误。changed=0: 表示没有任何任务更改了目标主机的状态(例如安装软件、修改文件等)。unreachable=0: 表示目标主机是可达的(网络正常),没有主机是不可达的。failed=0: 表示没有任务失败,所有任务都成功完成。skipped=0: 表示没有任务被跳过。rescued=0: 表示没有任务进入救援模式(通常在任务失败时触发)。ignored=0: 表示没有被忽略的任务(例如使用ignore_errors: yes忽略的任务)。
2. vars变量引用
vars 用于定义在任务中可以被引用的变量。可以通过两种方式引用变量:使用 或直接通过关键字引用。
1 |
|
1 | 实例二: |

1 | >>> 检测语法: |
3. handlers和notify引用
handlers(处理器)和 notify(触发器)用于在某些任务状态发生变化时自动执行特定操作。handlers 只有在被 notify 触发时才会执行,而 notify 会在任务状态为 changed 时触发处理器。
1 |
|
4. item和loop引用
item 通常用于在循环(loop)中遍历列表或字典。它允许任务在多次迭代中使用不同的值。最常见的用法是通过 loop 模块来执行相同的操作多次,但使用不同的参数。
1 | - hosts: webservers2 |
with_items与loop类似,但loop是 Ansible 2.5 及更高版本的推荐使用方法。
5. when判断
1 |
|


/1.png)




