运维自动化之 Ansible 核心知识点总结
目录
ansible和核心工作原理
ansible核心工作流程:
ansibel典型应用场景
1.容器化环境管理
2.应急故障修复
核心优势:无客户端(Agentless)架构
ansible相关命令
核心模块详解
ansibel之playbook
运行playbook的方式
Playbook 核心元素
Ansible Roles:角色化管理与大型项目编排
(一)Roles 官方定义与价值
(二)官方标准目录结构
(三)Roles 创建与调用示例(以 httpd 角色为例)
(四)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 标签角色)。