引言
大家好,欢迎来到我的 《Ansible 安全自动化:从服务器到K8S的堡垒之路》 系列教程,我是Prism!
在这个系列里,我们的目标是彻底告别繁琐的人工配置,用 Ansible 打造一套固若金汤、一键部署的服务器与K8S安全基线
作为本系列的开篇之作,我们将从什么是Ansible以及如何编写一个简单的Ansible剧本开始
通过本篇文章的学习,您将了解:
1、Ansible是什么工具,使用场景是什么
2、Ansible具有什么样的层次结构(帮助理解Ansible的运作机制)
3、如何快速编写一个简单的Ansible剧本
准备好了吗?发车咯!!!
是什么
- Ansible是自动化工具,可以用来配置管理、应用部署、任务执行等。特点就是简单、无代理、强大
- 简单
- 使用yaml来编写剧本
- 无代理
- 不像其他自动化工具,需要在被管理的主机上安装任何客户端或代理程序,它只需要通过SSH协议,就能远程连接到服务器上进行操作,大大降低了部署的复杂性,也减少了安全风险
- 强大
- 可部署分布式应用、管理云资源
- 简单
- Ansible是自动化工具,可以用来配置管理、应用部署、任务执行等。特点就是简单、无代理、强大
使用场景
自动化配置管理
- 统一环境
- 确保所有服务器环境保持一致,无论是操作系统版本,软件包还是文件配置。这对于保障生产环境的稳定性至关重要
- 配置漂移
- 当手动管理服务器时,总会因为各种原因导致不同服务器的配置出现差异。Ansible能定期检查并纠正这些差异
- 统一环境
应用部署
- 一键部署
- 可以编写一个剧本,让它自动完成从代码拉取,依赖安装、服务启动到配置更新的所有步骤,让应用部署变得像按下开关一样简单
- 滚动更新
- 对于高可用的应用,不能一次性关闭所有服务器。Ansible能帮你实现“滚动更新”,一台一台更新服务器,确保服务不中断,这在云网络环境中尤为重要
- 一键部署
任务执行
- 有时候,不需要完整的剧本,只是想在几十台服务器上快速执行一个命令。Ansible的Ad-hoc命令就是为此而生的
- 批量重启服务
- ansible all -a "sudo systemctl restart nginx”
- 批量检查磁盘空间
- ansible all -a "df -h"
- 批量添加用户
- ansible all -a "useradd prism"
- 批量重启服务
- 有时候,不需要完整的剧本,只是想在几十台服务器上快速执行一个命令。Ansible的Ad-hoc命令就是为此而生的
云原生基础设施自动化
- 云资源管理
- Ansible有专门的模块来管理各种云资源,可以用Ansible剧本将云资源的创建、配置和部署一体化
- 混合云管理
- 如果同时管理私有云和公有云,Ansible可以作为统一的自动化工具,用一套剧本管理所有环境,不再需要学习各种不同的云API
- 云资源管理
信息安全与合规性
- 安全加固
- 可以编写剧本,自动化执行安全基线配置,比如禁用root远程登录、修改默认端口、配置防火墙规则等,确保所有服务器都符合公司的安全策略
- 漏洞修复
- 当出现新的安全漏洞时,比如某个软件包需要升级,可以用Ansible批量快速地进行修复,大大缩短响应时间
- 合规性审计
- 用Ansible定期检查服务器配置,确保它们符合ISO 27001、GDPR等安全标准,并生成审计报告
- 安全加固
层次结构
控制节点
- 运行Ansible命令的机器
- 在这里编写剧本,然后通过它来远程控制所有被管理的服务器
被管理节点
- 需要管理和配置的服务器、网络设备等
- Ansible通过SSH协议连接到这些节点,执行任务
剧本(playbook)
- 定义了要在哪些主机上执行任务
- 一个剧本可以包含多个“剧本”
- 定义了要在哪些主机上执行任务
模块
- Ansible的工具箱,是具体执行任务的单元
- apt模块用于在Debian/Ubuntu系统上安装软件,yum模块用于在CentOS/RedHat系统上安装软件,copy模块用于复制文件,service模块用于管理服务
- Ansible有自带的几百个模块。而且社区孩子啊不断开发新的模块
- Ansible的工具箱,是具体执行任务的单元
清单
- 是一个文件,列出了所有被管理的服务器
- 可以对这些服务器进行分组,比如把web服务器分到一组,数据库服务器分到另一组,这样就可在剧本中直接指定对某个组的所有机器进行操作,非常方便
变量
- 可以存储和重复使用数据
- 可以为不同的组或主机定义不同的变量,比如数据库的用户名和密码、应用的端口号等
总结
- 控制节点通过SSH连接到被管理节点,使用剧本来定义任务,而剧本则调用各种模块来执行具体的命令,这一切都基于清单来管理主机,并利用变量和角色来组织和复用代码
如何启动第一个Ansible
- 安装Ansible
- sudo apt update && sudo apt install ansible
- pip install ansible
- 配置SSH密钥登录
- 创建 Inventory
- 创建一个名为inventiry.ini的文件
- [web_servers] 和 [db_servers]是你自己定义的分组名,你可以根据服务器的用途来命名
- [all_servers]是一个方便的集合,包含了所有服务器
- 将这里的Ip地址替换成你·自己的被管理节点的Ip地址或域名
- 创建一个名为inventiry.ini的文件
- 编写第一个剧本”Playbook”
- 我们要编写一个最简单的剧本,让它去检查所有的服务器是否能正常连接,并安装一个简单的软件包,比如tree(一个查看目录结构的实用小工具)
- 创建一个名为first_playbook.yml文件(yaml一定要使用两个空格进行缩进)
- —
- YAML文件的开头
- name
- 给你的剧本起个名字,方便你是呗它的用途
- hosts: all_servers
- 告诉Ansible,这个剧本要在清单文件中all_servers组里的所有主机上执行
- become: yes
- 告诉Ansible在执行任务时,要使用sudo权限
- tasks
- 任务列表,你的所有具体操作都写在里面
- name(在task下)
- 给每个任务起名字
- ping
- 一个内置的模块,用来测试服务器是否可以被连接到,如果ping成功,它会返回pong
- ansible.builtin.package
- 用来管理软件包
- name: tree
- 指定要安装的软件包名称
- state: present
- 确保这个软件包存在于服务器上,如果你想卸载它,可以修改成为state: absent
- —
- 创建一个名为first_playbook.yml文件(yaml一定要使用两个空格进行缩进)
- 我们要编写一个最简单的剧本,让它去检查所有的服务器是否能正常连接,并安装一个简单的软件包,比如tree(一个查看目录结构的实用小工具)
- 运行“剧本”
- ansible-playbook -i inventory.ini first_playbook.yml
- ansible-playbook
- 运行Ansible剧本的命令
- -i inventory.ini
- 指定你的清单文件
- first_playbook.yml
- 指定你要运行的剧本文件
- ansible-playbook
- ansible-playbook -i inventory.ini first_playbook.yml
- 安装Ansible
如何验证各台主机的部署是否成功
使用Ad-hoc命令快速验证(适合临时检查)
- 最简单,最快速
- which tree
- 这是一个Linux命令,用来查找tree命令的安装路径。如果返回了路径,就说明安装成功了
- which tree
- 最简单,最快速
用专用的“验证”剧本
- 对于复杂的部署,仅仅检查一个文件或命令是否存在是不够的。一般会创建一个专门的验证剧本,来检查所有关键的部署状态
- 这样做的好处是
- 可重复
- 可以随时运行这个脚本,来验证环境是否还处于预期状态
- 清晰
- 将部署和验证分离,逻辑更清晰
- 可扩展
- 可以轻松地添加更多的验证任务,比如检查端口是否开放,服务是否运行,文件内容是否正确等等
- 可重复
- 场景:编写一个verify_playbook.yml,来验证tree是否安装,并且Web服务是否正在运行
- check_name: yes
- 这个参数告诉Ansible,只检查状态,不做任何更改。如果软件包不存在或服务没启动,它会告诉你chantged,但不会真的去安装或启动它
- ansible.builtin.stat
- 这个模块用来检查文件或目录的状态,比如是否存在,权限如何等等
- register: index_file_status
- 这是Ansible的“拍照”功能,它会把stat模块的执行结果保存到一个名为ondex_file_status的变量里
- ansible.builtin.assert
- 如果that后面的条件不满足(比如文件不存在),它会立即报错并停止剧本的执行,同时显示你自定义的fail_msg
- check_name: yes
- 执行这个脚本
- ansible-playbook -i inventory.ini verify_playbook.yml
- 这样做的好处是
- 对于复杂的部署,仅仅检查一个文件或命令是否存在是不够的。一般会创建一个专门的验证剧本,来检查所有关键的部署状态