运维自动化之 Ansible 核心知识点总结

目录

ansible和核心工作原理

ansible核心工作流程:

ansibel典型应用场景

1.容器化环境管理

2.应急故障修复

核心优势:无客户端(Agentless)架构

ansible相关命令

核心模块详解

ansibel之playbook

运行playbook的方式

[Playbook 核心元素](#Playbook 核心元素)

[Ansible Roles:角色化管理与大型项目编排](#Ansible Roles:角色化管理与大型项目编排)

[(一)Roles 官方定义与价值](#(一)Roles 官方定义与价值)

(二)官方标准目录结构

[(三)Roles 创建与调用示例(以 httpd 角色为例)](#(三)Roles 创建与调用示例(以 httpd 角色为例))

[(四)Roles 高级用法](#(四)Roles 高级用法)


ansible和核心工作原理

控制主机(control Node):发布任务的主机,需要安装ansibel。python和ssh客户端

目标主机(Managed Nodes):接受任务的主机,不需要安装ansible,只需要安装python,ssh客户端即可

主机清单(Inventory):定义哪些是目标主机,支持按功能或区域分组,及可通过判断语句给指定的组的主机发布任务

剧本(playbook):用yaml编写的任务,定义要做什么,怎么做,按什么顺序做

核心模块(Modules):ansible的功能模块,负责实现具体操作,如yum模块负责安装,copy模块负责复制

插件(Plugins):用于扩展功能的组件,ssh复制与目标节点通信

加密工具(Vault):加密剧本中的敏感信息,比如数据库中的密码,云API密钥

ansible核心工作流程:

ansibel的执行流程"执行前检查---任务执行---结果反馈"

1.准备阶段:定义目标与任务

首先编写Inventory文件定义目标主机节点

再编写任务,并指定之前定义的目标主机节点

2.步骤一:解析配置与建立连接

执行anisble-playbook nginx.yml (文件名)

ansible首先解析Inventory获取目标节点的IP地址/SSH端口、用户名信息等

通过连接插件与目标节点建立连接,并验证目标节点的Python环境

3.facts收集(可选)

Ansible自动化目标节点执行setup模块,手机节点的"facts"信息

Facts可作为Playbook中的变量,若无需收集,可通过gather_facts:no

4.任务执行(状态化驱动)

ansible是按照playbook中的定义的顺序,逐一像目标节点发送任务指令

特点是状态化执行:每个模块会先检测目标节点的状态,只有在当前状态和期望状态不一致时,才执行操作

例如:

1.playbook定义 state:present (确保...存在,及确保安装),模块会检测是否存在需要的软件,若存在则跳过,不存在则执行yum install安装

2.若定义"state :started" (确保...是启动的),则首先检测定义的软件是启动,若启动则不执行,若没启动则执行systemctl start ...

3.任务执行支持 "错误重试"(通过 retries 配置)和 "忽略错误"(通过 ignore_errors: yes 配置),提高容错性。

ansibel典型应用场景

1.容器化环境管理

适合团队:云原生团队、微服务团队

核心需求:简化k8s操作,统一容器与虚拟机运维

ansible解决方案:使用ansible kubernetes模块,一键创建Deployment、Service,或者容器化管理容器节点

2.应急故障修复

适合团队:所有

核心需求:快速定位故障,减少业务中断时间

ansible解决方案:编写故障恢复剧本(重启数据库,切换备用节点、清理日志),故障时一键执行

核心优势:无客户端(Agentless)架构

1.Ansible 与其他自动化工具(如 Puppet、Chef)的最大区别是 "无客户端",即目标节点无需安装任何 Agent 程序,仅依赖 SSH 和 Python(大部分 Linux 系统默认预装),这一架构带来三大优势:

2.部署成本低:无需在目标节点部署、升级、维护 Agent,尤其适合大规模集群(如 1000+ 节点);

3.安全性高:无需开放额外端口(仅需 SSH 22 端口),避免 Agent 被黑客利用的风险;

4.兼容性强:支持几乎所有 Linux 发行版(CentOS、Ubuntu、Debian)、Windows(通过 WinRM 连接)、BSD 等,无需为不同系统适配 Agent。

ansible相关命令

ansible 通过 ssh 实现配置管理、应用部署、任务执行等功能,建议配置 ansible 端能基于密钥认证的方式联系各被管理节点

ansible [-m module_name] [-a args]

ansible + 被管理的主机 (ALL) + 模块 + 参数

--version 显示版本

-m module 指定模块,默认为 command

-v 详细过程 -vv -vvv 更详细

--list-hosts 显示主机列表,可简写

--list-k, --ask-pass 提示输入 ssh 连接密码,默认 key 验证

-C, --check 检查,并不执行

-T, --timeout=TIMEOUT 执行命令的超时时间,默认 10s

-u, --user=REMOTE_USER 执行远程执行的用户

-b, --become 代替旧版的 sudo 切换

--become-user=USERNAME 指定 sudo 的 runas 用户,默认为 root

-K, --ask-become-pass 提示输入 sudo 时的口令

ansible all --list 列出所有主机

核心模块详解

command 模块:

默认模块,在被控端执行命令,不支持特殊符号($、|、>)与变量。

示例:ansible websrvs -a 'chdir=/data ls'(进入 /data 目录执行 ls)。

shell 模块:

通过/bin/sh执行命令,支持特殊符号与变量。

示例:ansible all -m shell -a "sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config"(关闭 SELinux)。

copy 模块:

从控制端拷贝文件至被控端。

关键参数:src(源路径)、dest(目标路径)、mode(权限)、backup=yes(目标存在时备份)、content(直接指定文件内容)。

示例:ansible websrvs -m copy -a "src=/root/test.sh dest=/tmp/test.sh owner=wang mode=600 backup=yes"。

fetch 模块:

从被控端提取文件至控制端,不支持目录(需先打包)。

示例:ansible websrvs -m fetch -a 'src=/root/test.sh dest=/data/scripts'(文件会存放在/data/scripts//root/test.sh)。

file 模块:

管理文件 / 目录属性(创建、删除、权限、软链接)。

关键参数:path(路径)、state(状态:touch 创建文件、directory 创建目录、link 创建软链接、absent 删除)、recurse(递归设置目录属性)。

示例:ansible websrvs -m file -a 'path=/data/testdir state=directory owner=mysql group=mysql'(创建目录并指定属主)。

yum 模块:

管理 RPM 包,state支持present(安装)、absent(卸载)、latest(安装最新版)。

示例:ansible websrvs -m yum -a 'name=httpd state=present'(安装 httpd)。

service/systemd 模块:管理服务生命周期。

关键参数:name(服务名)、state(started/stopped/restarted/reloaded)、enabled=yes(开机自启)。

示例:ansible websrvs -m service -a 'name=httpd state=started enabled=yes'(启动 httpd 并设为开机自启)。

user/group 模块:

管理用户与用户组。

示例:ansible websrvs -m user -a 'name=app uid=88 system=yes home=/app shell=/sbin/nologin'(创建系统用户 app)。

setup 模块:收集被控端 facts(系统信息),支持过滤。

示例:ansible websrvs -m setup -a "filter=ansible_memtotal_mb"(获取内存总量)。

cron 模块:

管理定时任务。

示例:ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1' name=Synctime"(每 5 分钟同步时间)。

ansibel之playbook

运行playbook的方式

ansible-playbook ... [options]

常见选项

--check -C 文件,也会导致检测失败)

--list-hosts

--list-tags

--list-tasks 只检测可能会发生的改变,但不真正执行操作 (只检查语法,如果执行过程中出现问题,-C无法检测出来) (执行playbook生成的文件不存在,后面的程序如果依赖这些列出运行任务的主机列出tag (列出标签)列出task (列出任务)

--limit 主机列表 只针对主机列表中的主机执行-

v -vv -vvv

示例显示过程

ansible-playbook hello.yml --check 只检测

ansible-playbook hello.yml --list-hosts 显示运行任务的主机

ansible-playbook hello.yml --limit websrvs 限制主机

Playbook 核心元素

hosts:

指定目标主机(如hosts: websrvs:dbsrvs)。

remote_user:

执行任务的远程用户(可在 task 中单独指定)。

tasks:

任务列表,每个任务调用一个模块,需指定name(任务描述)与模块参数。

示例:

yaml

tasks: - name: 安装httpd yum: name=httpd state=present - name: 启动httpd service: name=httpd state=started enabled=yes

handlers 与 notify:

handlers 是 "触发式任务",仅当 notify 所在任务状态为changed时执行(如配置文件修改后重启服务)。

示例:

yaml

tasks: - name: 拷贝httpd配置文件 copy: src=httpd.conf dest=/etc/httpd/conf/ notify: restart httpd # 触发handler handlers: - name: restart httpd service: name=httpd state=restarted

tags:为任务打标签,支持指定执行部分任务(如ansible-playbook -t install httpd.yml仅执行 install 标签任务)。

示例:

yaml

tasks: - name: 安装httpd yum: name=httpd state=present tags: install - name: 启动httpd service: name=httpd state=started tags: service

vars:定义变量,支持多种来源(命令行-e、主机清单、独立变量文件、setup facts),优先级:命令行-e > Playbook 内定义 > 主机清单变量。

示例:

yaml

vars: http_port: 80 tasks: - name: 打印端口 debug: msg="HTTP端口为{{ http_port }}"

(三)高级特性:Templates、When、With_items

Templates(模板):基于 Jinja2 语法的动态配置文件,后缀为.j2,支持变量、算术运算与流程控制,需放在templates目录(与 Playbook 同级)。

示例:nginx.conf.j2中定义worker_processes {{ ansible_processor_vcpus }};(动态设置工作进程数为 CPU 核心数),Playbook 中调用:

yaml

tasks: - name: 部署nginx配置 template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

When(条件判断):基于变量或 facts 结果决定任务是否执行,支持比较运算(==、!=)、逻辑运算(and/or)。

示例:仅在 CentOS 7 执行任务:

yaml

tasks: - name: 部署CentOS 7配置 template: src=nginx.conf.c7.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version == "7"

With_items(迭代):实现任务循环,支持字符串列表与字典列表,循环变量固定为item。

字符串列表示例(批量创建用户):

yaml

tasks: - name: 批量创建用户 user: name={{ item }} state=present groups=wheel with_items: - testuser1 - testuser2

字典列表示例(批量配置端口):

yaml

tasks: - name: 批量配置UFW规则 ufw: rule: "{{ item.rule }}" port: "{{ item.port }}" proto: "{{ item.proto }}" with_items: - { rule: 'allow', port: 22, proto: 'tcp' } - { rule: 'allow', port: 80, proto: 'tcp' }

安装nginx

yaml

--- # install nginx - hosts: websrvs remote_user: root tasks: - name: add group nginx user: name=nginx state=present - name: add user nginx user: name=nginx state=present group=nginx - name: Install Nginx yum: name=nginx state=present - name: web page copy: src=files/index.html dest=/usr/share/nginx/html/index.html - name: Start Nginx service: name=nginx state=started enabled=yes

Ansible Roles:角色化管理与大型项目编排

(一)Roles 官方定义与价值

Roles 是 Ansible 1.2 + 引入的角色化机制,通过结构化目录组织变量、任务、模板等组件,实现代码复用与复杂项目编排,适用于 "基于主机构建服务" 的场景(如部署 Nginx、MySQL),核心价值是降低维护成本、提升代码复用率。

(二)官方标准目录结构

Roles 目录需遵循固定层级,每个角色为独立目录,核心目录功能如下:

plaintext

roles/ <角色名>/ # 如nginx、httpd tasks/ # 任务文件,必须包含main.yml(入口文件,通过include调用其他任务) files/ # copy/script模块调用的静态文件 templates/ # template模块调用的.j2模板文件 handlers/ # 触发器任务,必须包含main.yml vars/ # 角色专属变量,必须包含main.yml meta/ # 角色依赖与元数据(可选) default/ # 默认变量(优先级最低,可选)

(三)Roles 创建与调用示例(以 httpd 角色为例)

创建目录结构:

bash

mkdir -pv roles/httpd/{tasks,files,handlers}

编写任务文件:

tasks/install.yml(安装 httpd):

yaml

  • name: 安装httpd包 yum: name=httpd state=present

tasks/config.yml(拷贝配置文件):

yaml

  • name: 拷贝httpd配置 copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes notify: restart httpd # 触发重启

tasks/main.yml(任务入口,定义执行顺序):

yaml

  • include: install.yml - include: config.yml - include: service.yml

编写 handlers:handlers/main.yml(重启 httpd):

yaml

  • name: restart httpd service: name=httpd state=restarted

准备静态文件:将httpd.conf放入roles/httpd/files/。

调用 Roles:创建 Playbook(role_httpd.yml):

yaml

  • hosts: websrvs remote_user: root roles: - role: httpd # 调用httpd角色

执行:ansible-playbook role_httpd.yml。

(四)Roles 高级用法

传递变量:调用角色时传递变量,如:

yaml

roles: - { role: nginx, http_port: 8080, worker_processes: 4 }

条件调用:基于条件决定是否执行角色,如:

yaml

roles: - { role: nginx, when: ansible_os_family == "RedHat" }

标签控制:为角色打标签,指定执行部分角色,如:

yaml

roles: - { role: nginx, tags: ['web', 'nginx'] } - { role: mysql, tags: ['db', 'mysql'] }

执行命令:ansible-playbook -t web role_site.yml(仅执行 web 标签角色)。

相关推荐
JuiceFS1 小时前
JuiceFS sync 原理解析与性能优化,企业级数据同步利器
运维·后端
fruge2 小时前
前端自动化脚本:用 Node.js 写批量处理工具(图片压缩、文件重命名)
前端·node.js·自动化
Logan Lie2 小时前
Web服务监听地址的取舍:0.0.0.0 vs 127.0.0.1
运维·后端
Y淑滢潇潇2 小时前
RHCE 防火墙实验
linux·运维·rhce
稻谷君W3 小时前
Ubuntu 远程访问 Win11 WSL2 并固定访问教程
linux·运维·ubuntu
泡沫·3 小时前
4.iSCSI 服务器
运维·服务器·数据库
悠悠121384 小时前
告别Zabbix?我用Netdata只花10分钟就搞定了50台服务器的秒级监控(保姆级实战)
运维·服务器·zabbix
天庭鸡腿哥4 小时前
大小只有4K的软件,可让系统瞬间丝滑!
运维·服务器·windows·microsoft·everything
虚伪的空想家4 小时前
华为昇腾Atlas 800 A2物理服务器开启VT-d模式
运维·服务器·ubuntu·kvm·vt-d·直通
学渣676564 小时前
服务器端口映射
运维·服务器