引言

大家好,欢迎来到我的 《Ansible 安全自动化:从服务器到K8S的堡垒之路》 系列教程,我是Prism!
在这个系列里,我们的目标是彻底告别繁琐的人工配置,用 Ansible 打造一套固若金汤、一键部署的服务器与K8S安全基线
作为本系列的开篇之作,我们将从什么是Ansible以及如何编写一个简单的Ansible剧本开始
通过本篇文章的学习,您将了解:
1、Ansible是什么工具,使用场景是什么
2、Ansible具有什么样的层次结构(帮助理解Ansible的运作机制)
3、如何快速编写一个简单的Ansible剧本

链接:兄弟篇:KVM基础

预告: 下一期将介绍创建KVM虚拟机的几种方式,使用Ansible创建为重点内容

注意:如大家有更好的建议,欢迎提出,如果喜欢煮波的内容,点点关注不迷路,谢谢大家!!!

准备好了吗?发车咯!!!

  1. 是什么

    1. Ansible是自动化工具,可以用来配置管理、应用部署、任务执行等。特点就是简单、无代理、强大
      1. 简单
        1. 使用yaml来编写剧本
      2. 无代理
        1. 不像其他自动化工具,需要在被管理的主机上安装任何客户端或代理程序,它只需要通过SSH协议,就能远程连接到服务器上进行操作,大大降低了部署的复杂性,也减少了安全风险
      3. 强大
        1. 可部署分布式应用、管理云资源
  2. 使用场景

    1. 自动化配置管理

      1. 统一环境
        1. 确保所有服务器环境保持一致,无论是操作系统版本,软件包还是文件配置。这对于保障生产环境的稳定性至关重要
      2. 配置漂移
        1. 当手动管理服务器时,总会因为各种原因导致不同服务器的配置出现差异。Ansible能定期检查并纠正这些差异
    2. 应用部署

      1. 一键部署
        1. 可以编写一个剧本,让它自动完成从代码拉取,依赖安装、服务启动到配置更新的所有步骤,让应用部署变得像按下开关一样简单
      2. 滚动更新
        1. 对于高可用的应用,不能一次性关闭所有服务器。Ansible能帮你实现“滚动更新”,一台一台更新服务器,确保服务不中断,这在云网络环境中尤为重要
    3. 任务执行

      1. 有时候,不需要完整的剧本,只是想在几十台服务器上快速执行一个命令。Ansible的Ad-hoc命令就是为此而生的
        1. 批量重启服务
          1. ansible all -a "sudo systemctl restart nginx”
        2. 批量检查磁盘空间
          1. ansible all -a “df -h”
        3. 批量添加用户
          1. ansible all -a “useradd prism”
    4. 云原生基础设施自动化

      1. 云资源管理
        1. Ansible有专门的模块来管理各种云资源,可以用Ansible剧本将云资源的创建、配置和部署一体化
      2. 混合云管理
        1. 如果同时管理私有云和公有云,Ansible可以作为统一的自动化工具,用一套剧本管理所有环境,不再需要学习各种不同的云API
    5. 信息安全与合规性

      1. 安全加固
        1. 可以编写剧本,自动化执行安全基线配置,比如禁用root远程登录、修改默认端口、配置防火墙规则等,确保所有服务器都符合公司的安全策略
      2. 漏洞修复
        1. 当出现新的安全漏洞时,比如某个软件包需要升级,可以用Ansible批量快速地进行修复,大大缩短响应时间
      3. 合规性审计
        1. 用Ansible定期检查服务器配置,确保它们符合ISO 27001、GDPR等安全标准,并生成审计报告
  3. 层次结构

    1. 控制节点

      1. 运行Ansible命令的机器
      2. 在这里编写剧本,然后通过它来远程控制所有被管理的服务器
    2. 被管理节点

      1. 需要管理和配置的服务器、网络设备等
      2. Ansible通过SSH协议连接到这些节点,执行任务
    3. 剧本(playbook)

      1. 定义了要在哪些主机上执行任务
        1. 一个剧本可以包含多个“剧本”
    4. 模块

      1. Ansible的工具箱,是具体执行任务的单元
        1. apt模块用于在Debian/Ubuntu系统上安装软件,yum模块用于在CentOS/RedHat系统上安装软件,copy模块用于复制文件,service模块用于管理服务
      2. Ansible有自带的几百个模块。而且社区孩子啊不断开发新的模块
    5. 清单

      1. 是一个文件,列出了所有被管理的服务器
      2. 可以对这些服务器进行分组,比如把web服务器分到一组,数据库服务器分到另一组,这样就可在剧本中直接指定对某个组的所有机器进行操作,非常方便
    6. 变量

      1. 可以存储和重复使用数据
      2. 可以为不同的组或主机定义不同的变量,比如数据库的用户名和密码、应用的端口号等
    7. 总结

      1. 控制节点通过SSH连接到被管理节点,使用剧本来定义任务,而剧本则调用各种模块来执行具体的命令,这一切都基于清单来管理主机,并利用变量角色来组织和复用代码
  4. 如何启动第一个Ansible

    1. 安装Ansible
      1. sudo apt update && sudo apt install ansible
      2. pip install ansible
    2. 配置SSH密钥登录
    3. 创建 Inventory
      1. 创建一个名为inventiry.ini的文件
        1. [web_servers] 和 [db_servers]是你自己定义的分组名,你可以根据服务器的用途来命名
        2. [all_servers]是一个方便的集合,包含了所有服务器
          1. 将这里的Ip地址替换成你·自己的被管理节点的Ip地址或域名
    4. 编写第一个剧本”Playbook”
      1. 我们要编写一个最简单的剧本,让它去检查所有的服务器是否能正常连接,并安装一个简单的软件包,比如tree(一个查看目录结构的实用小工具)
        1. 创建一个名为first_playbook.yml文件(yaml一定要使用两个空格进行缩进)
            1. YAML文件的开头
          1. name
            1. 给你的剧本起个名字,方便你是呗它的用途
          2. hosts: all_servers
            1. 告诉Ansible,这个剧本要在清单文件中all_servers组里的所有主机上执行
          3. become: yes
            1. 告诉Ansible在执行任务时,要使用sudo权限
          4. tasks
            1. 任务列表,你的所有具体操作都写在里面
          5. name(在task下)
            1. 给每个任务起名字
          6. ping
            1. 一个内置的模块,用来测试服务器是否可以被连接到,如果ping成功,它会返回pong
          7. ansible.builtin.package
            1. 用来管理软件包
          8. name: tree
            1. 指定要安装的软件包名称
          9. state: present
            1. 确保这个软件包存在于服务器上,如果你想卸载它,可以修改成为state: absent
    5. 运行“剧本”
      1. ansible-playbook -i inventory.ini first_playbook.yml
        1. ansible-playbook
          1. 运行Ansible剧本的命令
        2. -i inventory.ini
          1. 指定你的清单文件
        3. first_playbook.yml
          1. 指定你要运行的剧本文件
  5. 如何验证各台主机的部署是否成功

    1. 使用Ad-hoc命令快速验证(适合临时检查)

      1. 最简单,最快速
        1. which tree
          1. 这是一个Linux命令,用来查找tree命令的安装路径。如果返回了路径,就说明安装成功了
    2. 用专用的“验证”剧本

      1. 对于复杂的部署,仅仅检查一个文件或命令是否存在是不够的。一般会创建一个专门的验证剧本,来检查所有关键的部署状态
        1. 这样做的好处是
          1. 可重复
            1. 可以随时运行这个脚本,来验证环境是否还处于预期状态
          2. 清晰
            1. 将部署和验证分离,逻辑更清晰
          3. 可扩展
            1. 可以轻松地添加更多的验证任务,比如检查端口是否开放,服务是否运行,文件内容是否正确等等
        2. 场景:编写一个verify_playbook.yml,来验证tree是否安装,并且Web服务是否正在运行
          1. check_name: yes
            1. 这个参数告诉Ansible,只检查状态,不做任何更改。如果软件包不存在或服务没启动,它会告诉你chantged,但不会真的去安装或启动它
          2. ansible.builtin.stat
            1. 这个模块用来检查文件或目录的状态,比如是否存在,权限如何等等
          3. register: index_file_status
            1. 这是Ansible的“拍照”功能,它会把stat模块的执行结果保存到一个名为ondex_file_status的变量里
          4. ansible.builtin.assert
            1. 如果that后面的条件不满足(比如文件不存在),它会立即报错并停止剧本的执行,同时显示你自定义的fail_msg
        3. 执行这个脚本
          1. ansible-playbook -i inventory.ini verify_playbook.yml
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐