环境准备

# 创建一个叫web的文件夹并进入(相当于新建一个工作目录)[lyk@controller ~]$ mkdir web && cd web​# 创建Ansible的配置文件ansible.cfg[lyk@controller web]$ cat > ansible.cfg <<'EOF'[defaults]remote_user = lykinventory = ./inventory​[privilege_escalation]become = Truebecome_user = rootbecome_method = sudobecome_ask_pass = FalseEOF​[lyk@controller web]$ cat > inventory <<'EOF'controllernode1node2node3node4EOF

Ansible 角色(把重复任务打包成 “模块”)

# 用ansible-galaxy创建一个叫lyk的角色(生成标准化的目录结构)[lyk@controller web 11:28:45]$ ansible-galaxy init lyk- Role lyk was created successfully​[lyk@controller web 11:30:29]$ sudo yum install -y tree[lyk@controller web 11:31:09]$ tree lyklyk├── defaults│   └── main.yml├── files├── handlers│   └── main.yml├── meta│   └── main.yml├── README.md├── tasks│   └── main.yml├── templates├── tests│   ├── inventory│   └── test.yml└── vars└── main.yml​
Ansible 角色目录位置

默认role使用以下三个目录:

  • ~/.ansible/roles

  • /usr/share/ansible/roles

  • /etc/ansible/roles

优先级从上到下依次降低。

可以在ansible.cfg配置文件[defaults]块中通过变量roles_path定义role位置:

[defaults]roles_path  = ./roles......

多个路径使用冒号分隔:

roles_path = /etc/ansible/roles:/home/student/web/roles
创建角色
# 创建一个存放角色的文件夹roles[lyk@controller web]$ mkdir roles​# 创建一个叫apache的角色(用来部署apache服务)[lyk@controller web]$ ansible-galaxy init apache- apache was created successfully​# 把apache角色移到roles文件夹(方便统一管理)[lyk@controller web]$ mv apache/ roles​# 也可以直接使用以下命令将角色放置到指定目录(一步到位)[lyk@controller web]$ ansible-galaxy init apache --init-path=./roles​# 查看角色列表[lyk@controller web]$ ansible-galaxy list# /home/student/web/roles- apache, (unknown version)[lyk@controller web]$ cd roles/apache/​

从tasks开始,tasks/main.yml内容如下:

---# tasks file for apache- name: install webyum:name: "{{ web_package }}"state: latest​- name: "start {{ web_service }}"service:name: "{{ web_service }}"state: startedenabled: yes​- name: prepare motdtemplate:src: motd.j2dest: /etc/motd​- name: prepare lyk sitetemplate:src: lyk.conf.j2dest: /etc/httpd/conf.d/lyk.confnotify:- restart_web​- name: prepare DocumentRoot file:path: "/var/www/html/{{ ansible_hostname }}" state: directory​- name: prepare index.htmltemplate:src: index.html.j2dest: "/var/www/html/{{ ansible_hostname }}/index.html"--定义了部署 apache 的步骤:安装软件、启动服务、生成欢迎页、配置虚拟主机等。--比如:name: install web 是 “安装 web 软件”,yum模块用来装软件,service模块用来启动服务。
  • defaults/main.yml 内容如下:

    ---# defaults file for apacheweb_package: httpdweb_service: httpd​​--定义了web_package: httpd(要安装的软件名是 httpd)、web_service: httpd(服务名是 httpd)。--好处是:如果以后要换软件(比如 nginx),改这里的变量就行,不用改任务列表。
  • templates/motd.j2 内容如下:

    hello guys!Welcome to {{ ansible_fqdn }}!​​--motd.j2:登录提示模板,{{ ansible_fqdn }}会自动替换成主机名(比如 node1.lyk.cloud);​
  • templates/lyk.conf.j2 内容如下:

    # {{ ansible_managed }}
    <VirtualHost *:80>ServerAdmin lyk@{{ ansible_fqdn }}ServerName {{ ansible_fqdn }}ErrorLog logs/{{ ansible_hostname }}-error.logCustomLog logs/{{ ansible_hostname }}-common.log commonDocumentRoot /var/www/html/{{ ansible_hostname }}/<Directory /var/www/html/{{ ansible_hostname }}/>Options +Indexes +FollowSymlinks +IncludesOrder allow,denyAllow from all</Directory>
    </VirtualHost>--lyk.conf.j2:apache 虚拟主机配置模板,自动生成对应主机的网站配置;
    
  • templates/index.html.j2 内容如下:

    Welcome to {{ ansible_fqdn }} !--index.html.j2:网页首页模板,显示 “Welcome to 主机名”。

  • handlers/main.yml 内容如下:

    ---
    # handlers file for apache
    - name: restart_webservice:name: "{{ web_service }}"state: restarted--定义了restart_web(重启 web 服务),当虚拟主机配置文件修改后,会自动触发这个操作(通过notify: - restart_web调用)。
  • meta/main.yml 内容如下:

    ---
    galaxy_info:author: lykdescription: lyk webcompany: lyk worldlicense: license (GPLv2, CC-BY, etc)min_ansible_version: 2.4platforms:- name: Fedoraversions:- all- 25- name: SomePlatformversions:- allgalaxy_tags: [apache,web]
    dependencies: []--记录角色作者、支持的系统版本等信息(类似 “说明书”)
调用角色(用 playbook 执行角色)
[lyk@controller apache 11:52:16]$ vim playbook.yml[lyk@controller web 11:54:10]$ curl http://node2/
Welcome to node2.lyk.cloud !

系统角色(用现成的 “官方模块”)

# 安装系统自带的角色(比如时间同步、防火墙等预定义角色)
[lyk@controller web 13:31:28]$ sudo yum install -y rhel-system-roles
# 查看系统角色的位置(这些是现成的,不用自己写)
[lyk@controller web 13:38:58]$ ls -1 /usr/share/ansible/roles/# 修改ansible.cfg,让Ansible能找到系统角色
[lyk@controller web 13:46:30]$ vim ansible.cfg 1 [defaults]                                    2 remote_user = lyk                             3 inventory = ./inventory                       4 roles_path = ./roles:/usr/share/ansible/roles/                             5                                               6 [privilege_escalation]                        7 become = True                                 8 become_user = root                            9 become_method = sudo                          10 become_ask_pass = False  # 编辑playbook,用系统角色同步所有主机的时间 
[lyk@controller web 13:48:16]$ vim playbook.yml  1 - name: Manage timesync with servers2   hosts: all                    3   vars:                         4     timesync_ntp_servers:       5       - hostname: ntp.aliyun.com6         iburst: true            7   roles:                        8     - rhel-system-roles.timesync  --简单说:系统角色是别人写好的 “现成工具”,比如时间同步角色,不用自己写任务,直接配置变量就能用,省时省力
负载均衡(用角色部署 haproxy 实现多机分流)
# 查看如何搜索Ansible角色(帮助命令)
[lyk@controller web 14:08:47]$ ansible-galaxy role search --help# 搜索作者geerlingguy的角色(他是Ansible社区知名作者,角色质量高)
[lyk@controller web 14:09:13]$ ansible-galaxy role search --author geerlingguy # 安装他的haproxy角色(负载均衡工具),放在当前roles目录
[lyk@controller web 14:16:20]$ ansible-galaxy role install geerlingguy.haproxy --roles-path ./roles# 重命名角色(把长名字改成haproxy,方便引用)
[lyk@controller web 14:18:02]$ mv roles/geerlingguy.haproxy/ roles/haproxy# 也可以从本地文件安装角色(比如离线环境)
[lyk@controller web 14:13:27]$ ansible-galaxy install http://192.168.42.100/%E8%BD%AF%E4%BB%B6/ansible-role-haproxy-1.3.1.tar.gz# 查看已安装的角色
[lyk@controller web 14:19:01]$  ls roles/
ansible-role-haproxy-1.3.1  apache  haproxy# 下载haproxy角色的说明文档(README.md)到本地查看(sz是上传下载命令)
[lyk@controller web 14:22:37]$ sz roles/haproxy/README.md # 编辑主机列表,把主机分组(LBs是负载均衡服务器,WEBs是网页服务器)
[lyk@controller web 14:24:59]$ vim inventory 1 [LBs]2 controller    # controller作为负载均衡器3  4 [WEBs]5 node[1:4]    # node1到node4作为网页服务器# 编辑playbook,部署负载均衡和网页服务
[lyk@controller web 14:26:17]$ vim playbook.yml 1 - name: deploy LB    #部署负载均衡器2   hosts: LBs  	     # 在负载均衡服务器(controller)上执行3   vars:			      # 配置后端网页服务器(node1到node4)4     haproxy_backend_servers:5       - name: node16         address: 10.1.8.11:80   # node1的IP和端口7       - name: node28         address: 10.1.8.12:809       - name: node310         address: 10.1.8.13:8011       - name: node412         address: 10.1.8.14:8013   roles:14     - haproxy     # 调用haproxy角色部署负载均衡15 - name: deploy apache     #部署网页服务16   hosts: WEBs     # 在网页服务器(node1-4)上执行17   roles:18     - apache      # 调用之前的apache角色部署网页服务# 在node1上关闭可能占用80端口的nginx,启动httpd(确保网页服务正常)
[root@node1 ~ 14:39:46]# systemctl stop nginx.service 
[root@node1 ~ 14:39:54]# systemctl start httpd
[root@node1 ~ 14:40:04]# systemctl status httpd
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)Active: active (running) since 二 2025-08-19 14:37:14 CST; 2min 58s ago# 执行playbook,部署负载均衡和网页服务
[lyk@controller web 14:40:18]$ ansible-playbook playbook.yml # 测试负载均衡效果:访问controller(负载均衡器),会轮流显示node1-4的网页
[lyk@controller web 14:40:33]$ curl http://controller/
Welcome to node2.lyk.cloud !
[lyk@controller web 14:41:35]$ curl http://controller/
Welcome to node3.lyk.cloud !
[lyk@controller web 14:41:37]$ curl http://controller/
Welcome to node4.lyk.lyk.cloud !
[lyk@controller web 14:41:38]$ curl http://controller/
Welcome to node1.lyk.cloud !
  • 简单说:负载均衡就是 “分流”,用户访问 controller(负载均衡器)时,会自动分配到 node1-4 中的一个,避免单台服务器压力太大。这里用现成的 haproxy 角色快速实现,不用自己写负载均衡配置。

总结

整个过程就是:用 Ansible 角色把重复的部署任务(比如装 apache、配置负载均衡)打包成 “模块”,然后通过 playbook 在指定主机上调用这些模块,实现批量、自动化部署。角色的好处是 “一次编写,多次使用”,大大简化了复杂环境的管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93745.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93745.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93745.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试准备指南!

现在已经是8月中旬了&#xff0c;秋招马上就要开始了&#xff0c;不知道大家准备好了吗&#xff1f;现阶段找工作真的是千军万马过独木桥&#xff0c;没有真本事&#xff0c;真的会被淘汰掉&#xff0c;现实就是如此的残酷&#xff01; 为了能够帮助到大家在秋招Java面试中脱颖…

Encoder-Decoder Model编码器-解码器模型

Encoder-Decoder编码器-解码器是一种深度学习模型&#xff0c;应用于图像处理、语音识别、自然语言处理等领域。主要由编码器和解码器两部分组成&#xff0c;这种结构能够处理序列到序列的任务。编码器-解码器模型具备独特的双阶段处理&#xff0c;先对输入信息进行编码&#x…

Python函数总结

目录 一、普通函数 1.1 函数的定义与调用 1.2 函数的说明文档 1.3 函数的参数 1.4 函数的返回值 二、函数的作用域和关键字 2.1 局部作用域 2.2 全局作用域 2.4 global关键字和nonlocal关键字的使用 三、函数的递归与嵌套 3.1 嵌套函数 3.2递归函数 四、函数名的应…

sqlite-gui:一款开源免费、功能强大的SQLite开发工具

sqlite-gui 是一个轻量级的 SQLite 编辑器&#xff0c;基于 C/mingw64/WinAPI 开发&#xff0c;支持 Windows 平台。 sqlite-gui 是一个免费开源的项目&#xff0c;代码托管在 GitHub&#xff1a; https://github.com/little-brother/sqlite-gui 功能特性 支持 SQL 语法高亮…

Ethan独立开发新品速递 | 2025-08-19

每日精选Product Hunt上最值得关注的独立产品&#xff0c;发现全球创新灵感&#xff0c;助力你的产品成长。 下面挑选出对独立开发者最有参考价值的 10 个项目&#xff0c;侧重开发工具、AI 工具、SaaS 和创业支持类产品&#xff0c;去除娱乐、小众垂直和大公司产品。每条保留原…

从 Hive 数仓出发,全面剖析 StarRocks、MySQL、HBase 的使用场景与区别

以 Hive 数仓为底座,深入理解 StarRocks、MySQL 和 HBase 的区别与使用场景 一、前言 在现代大数据架构中,Hive 通常作为离线数仓的核心底座,负责批量数据的接入、清洗、计算与存储。然而,为了满足 实时计算、低延迟查询、业务交互型操作和高并发存储 等不同需求,我们往…

低延迟、跨平台与可控性:直播SDK的模块化价值解析

引言 音视频直播已经从单纯的娱乐应用&#xff0c;成长为产业级的实时交互基础设施。无论是安防监控的秒级告警联动、工业巡检的远程可视化操作&#xff0c;还是智慧教育中的多终端互动课堂、远程医疗里的超低延迟手术协作&#xff0c;都离不开一条低延迟、高稳定性、跨平台可…

JVM参数优化

JVM 参数优化是提升 Java 应用性能、减少 GC 停顿、避免 OOM&#xff08;内存溢出&#xff09;等问题的核心手段。优化的核心目标是平衡内存使用、GC 效率与应用响应速度&#xff0c;需结合应用类型&#xff08;如 Web 应用、批处理应用&#xff09;、业务场景&#xff08;如高…

pytest高级用法之插件开发

背景 pytest&#xff0c;python全功能测试框架&#xff08;用某句名言&#xff0c;甩unittest几条街&#xff09;&#xff0c;钩子函数、pytest插件、pytest装饰器都能扩展pytest。 提及pytest高级用法&#xff0c;不得不说pytest插件&#xff0c;例如assert断言失败继续断言…

cesium中实时获取鼠标精确坐标和高度

/*** 获取鼠标位置的三维坐标(包含高度信息)* @param {Cesium.Cartesian2} position 鼠标位置* @returns {Cesium.Cartesian3|null} 三维坐标*/ function getMousePosition(position) {if (!position) return null;

Netty 集成 protobuf

什么是 Protobuf Protobuf(Protocol Buffers)是 Google 开发的一种高效、语言中立、平台中立的序列化协议,用于在不同系统或语言之间传输结构化数据。开发者通过 .proto 文件定义消息结构,再使用生成的类进行序列化(转为紧凑的二进制数据)和反序列化(还原为对象),相比…

程序调用 AI 大模型 -- Java

程序调用 AI 大模型 – Java 1、SDK 接入 安装阿里云百炼SDK_大模型服务平台百炼(Model Studio)-阿里云帮助中心 <dependency><groupId>com.alibaba</groupId><artifactId>dashscope-sdk-java</artifactId><!-- 请将 the-latest-version 替…

VMware 虚拟机完全使用教程:从基础到高级应用

VMware 虚拟机完全使用教程&#xff1a;从基础到高级应用 一、引言 在当今数字化时代&#xff0c;计算机技术的飞速发展使得硬件性能不断提升&#xff0c;但同时也带来了资源浪费和管理复杂等问题。虚拟机技术应运而生&#xff0c;它能够在一台物理计算机上模拟出多台独立的计…

函数对象 vs 函数指针 vs lambda:该用哪个才高效?

博主介绍&#xff1a;程序喵大人 35 - 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x…

Java团队项目开发规范——对象分层规范

分层与对象命名规范如上图所示&#xff0c;系统划分成3个层&#xff1a;Controller层&#xff0c;Service层&#xff0c;Domain层 Controller层&#xff1a; Controller层是接入层&#xff0c;提供对外或者前端的接口&#xff0c;该层主要作用是提供对外接口的封装。基于CQRS分…

低功耗模式

1. 什么是低功耗&#xff1f;低功耗模式&#xff1a;MCU 暂停部分时钟/外设&#xff0c;降低电流消耗&#xff0c;等待外部事件&#xff08;中断/复位/唤醒&#xff09;再恢复运行。应用场景&#xff1a;电池供电设备&#xff08;传感器、手持设备、IoT 节点&#xff09;——延…

GPT-5 官方前瞻:它将如何重塑你的数字生活?

你是否曾想过&#xff0c;有一天你的浏览器不再是一个被动等待指令的工具&#xff0c;而是一个能主动为你分忧解难的智能伙伴&#xff1f;OpenAI 的 CEO Sam Altman 最近的发言&#xff0c;以及关于 GPT-5 的种种迹象&#xff0c;都预示着这个未来比我们想象的更近。这不仅是一…

驱动开发系列65 - NVIDIA 开源GPU驱动open-gpu-kernel-modules 目录结构

一:OS相关部分 kernel-open/ 内核接口层 kernel-open/nvidia/ nvidia.ko 的接口层,负责GPU初始化,显存管理,PCIe通信,中断处理,电源管理等底层功能。 kernel-open/nvidia-drm/ nvidia-drm.ko 的接口层,提供标准图形接口,让Xorg、Wayland、Kwin、GNOME等桌面环境能够通…

GPT-4.1旗舰模型:复杂任务的最佳选择及API集成实践

GPT-4.1旗舰模型&#xff1a;复杂任务的最佳选择及API集成实践 概述 GPT-4.1作为新一代旗舰大模型&#xff0c;凭借其卓越的智能表现、强大的跨领域问题解决能力&#xff0c;成为复杂任务处理的首选。本文将详细解析GPT-4.1的核心能力、接口用法、计费方式、功能对比及API集成…

paimon保姆级教程简介

还在纠结 Flink 配 Hudi 还是 Iceberg&#xff1f;别选了&#xff0c;快来试试 Flink 的“天选之子”—— Apache Paimon&#xff01; 忘掉复杂的 Lambda 架构&#xff0c;拥抱真正的流批一体。我们的 Paimon 视频教程&#xff0c;带你用 Flink 原生湖仓格式&#xff0c;轻松构…