当前位置: 首页 > news >正文

运维自动化之 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 标签角色)。

http://www.dtcms.com/a/431461.html

相关文章:

  • 高频基础面试题解析:字符串操作、数字运算、条件循环
  • 建设行业信息管理系统网站德阳网站制作
  • 笔记本安装Ubuntu 20.04其触摸板如何开启或关闭
  • 站长之家域名查询排行阿里云网站备案注销
  • 企业微网站建设网站开发版权归谁
  • 爬虫数据采集(实例分析1)
  • 大理旅游网站建设有口碑的做网站
  • 卓老师建站特色功能三门峡做网站
  • 网站建站维护运营湖北省建设工程网站
  • smss!SmpStartCsr函数分析之SmpLoadSubSystemsForMuSession3389远程桌面新进程csrss.exe的由来
  • 网络安全细则[特殊字符]
  • 网页设计中文本居中用什么代码项链seo关键词
  • 决策树算法基础:信息熵相关知识
  • C#基础08-面向对象
  • 网站建设公司费用网站开发遵循
  • php做网站 价格商城网站开发技术可行性分析
  • 10.仅使用 CSS 实现波浪形卡片 UI 设计
  • 太原市手机微网站建设网络推广都有哪些方式
  • display ospf interface 概念及题目
  • 专栏导航:《数据中心网络与异构计算:从瓶颈突破到架构革命》
  • 基层单位不能建设网站织梦做有网站有后台 能下载备份所有代码文件么
  • 爱网站关键词查询工具长尾美食网站建设项目预算
  • Swift 属性
  • 服务器做网站用什么环境好页游平台网站
  • 在手机上做网站是什么软件网店推广软件
  • 无锡网站建设服务公司如何给网站的关键词做排名
  • java线上问题排查-占用内存的大对象
  • 公司网站维护一年多少钱做网站网站代理
  • 【51单片机计时器1中断的60秒数码管倒计时】2023-1-23
  • 广州网站建设知名乐云seo淘宝上开做网站的店铺