Ansible-综合练习-生产案例
斌的招儿
网上教程大多都是官网模板化的教程和文档,这里小斌用自己实际生产环境使用的例子给大家做一个详解。涉及到一整套ansible的使用,对于roles的使用,也仅涉及到tasks和files目录,方便大家快速上手并规范化管理。
0.环境配置
192.168.255.120 Ansible控制机
192.168.255.123 Ansible被控机
1.安装Ansible
作为学习模拟使用,这里就使用yum安装
[root@120 ~]# yum install -y ansible
2.配置免密
[root@120 ~]# ssh-keygen[root@120 ~]# ssh-copy-id root@192.168.255.123
3.配置主机列表
配置主机列表,我们一般会选择在hosts文件中定义,但是面临一个问题,后续管理主机多,不同项目也有可能设计同一台主机,我们每次都要在一个文件里追加追加,极为不便,所以我们单独建一个目录用来管理主机列表。

我们修改一下配置文件里的主机清单位置,指定一个目录,目录下文件以.conf结尾,书写格式于hosts中一致。

4.测试主机连通性
[root@120 ansible]# ansible yzb -m ping
192.168.255.123 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}
[root@120 ansible]#
5.生成角色
这里不需要手动创建目录和文件,可以借助ansible自带的ansible-galaxy工具。
[root@120 roles]# pwd
/etc/ansible/roles[root@120 roles]# ls[root@120 roles]# ansible-galaxy init init-nginx
- Role init-nginx was created successfully[root@120 roles]# ls
init-nginx[root@120 roles]# tree init-nginx/
init-nginx/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars└── main.yml8 directories, 8 files
[root@120 roles]#

我们可以看到使用 ansible-galaxy init 命令创建了一个新角色的框架
6.配置
开头说过了,仅涉及到tasks和files目录,方便大家快速上手并规范化管理。所以它来了:
这里我们以安装nginx为例子,yum没难度是吧,好的,我们用源码安装的形式教学。
1.熟悉源码安装nginx
只有熟悉怎么源码安装nginx,才能编写剧本自动化安装。源码安装其实就四步:
1.包弄上来解压
2.添加补丁
3.编译安装
4.添加systemed管理
2.准备文件

如图,我们看到四个文件,文件作用如下:
-
- nginx.tar.gz:包含nginx源码包和补丁包
- install.sh:内容为将补丁文件应用到源代码文件中,并执行编译安装,写成脚本减少playbook的篇幅
- nginx.conf:nginx的配置文件,如果业务有特殊模块需求,可以提前编写好配置文件发放到目标主机
- nginx.service:nginx的systemed管理文件
nginx.conf
[root@120 files]# cat nginx.conf
pid /usr/local/nginx/nginx.pid;worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
worker_rlimit_nofile 102400;events {worker_connections 102400;multi_accept on;use epoll;
}http {vhost_traffic_status_zone;log_format json_format '{"timestamp":"$msec",''"time_iso":"$time_iso8601",''"time_local":"$time_local",''"request_time":"$request_time",''"remote_user":"$remote_user",''"remote_addr":"$remote_addr",''"http_x_forwarded_for":"$http_x_forwarded_for",''"request":"$request",''"status":"$status",''"body_bytes_send":"$body_bytes_sent",''"upstream_addr":"$upstream_addr",''"upstream_response_time":"$upstream_response_time",''"upstream_http_content_type":"$upstream_http_content_type",''"upstream_http_content_disposition":"$upstream_http_content_disposition",''"upstream_status":"$upstream_status",''"http_user_agent":"$http_user_agent",''"http_referer":"$http_referer",''"connection":"$connection",''"connection_requests":"$connection_requests",''"scheme":"$scheme",''"host":"$host",''"http_via":"$http_via",''"request_id":"$request_id"}';map $time_iso8601 $logdate {'~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;default 'date-not-found';}# 日志文件名中带有变量时由子进程创建,需要子进程具有目录写入权限access_log /ware/logs/nginx/access-$logdate.log json_format;error_log /ware/logs/nginx/error.log error;server_tokens off;sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 30;keepalive_requests 100000;client_header_timeout 10;client_body_timeout 10;client_max_body_size 100m;reset_timedout_connection on;send_timeout 10;include mime.types;default_type application/octet-stream;charset UTF-8;gzip on;gzip_vary on;gzip_disable "MSIE [1-6].";gzip_http_version 1.0;gzip_comp_level 4;# gzip_static on;gzip_min_length 1024;gzip_buffers 4 16k;gzip_proxied expired no-cache no-store private auth;gzip_types text/plain text/css text/javascript application/x-javascript application/xml application/json application/xml+rss;open_file_cache max=100000 inactive=20s;open_file_cache_valid 30s;open_file_cache_min_uses 2;open_file_cache_errors on;proxy_connect_timeout 75;proxy_read_timeout 300;proxy_send_timeout 300;proxy_buffer_size 64k;proxy_buffers 4 64k;proxy_busy_buffers_size 128k;proxy_temp_file_write_size 128k;include /opt/env/nginx/servs/*.upstreams;include /opt/env/nginx/servs/http-*.conf;
}stream {include /opt/env/nginx/servs/tcp-*.conf;
}
nginx.service
[root@120 files]# cat nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target[Service]
Type=forking
PIDFile=/usr/local/nginx/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target
install.sh
[root@120 files]# cat install.sh
#!/bin/bashdir=/server/storagecd $dirtar xf nginx.tar.gzcd /server/storage/nginxunzip nginx_upstream_check_module.zip
unzip nginx-upstream-fair.zip
unzip nginx-module-vts.zip
unzip ngx_http_substitutions_filter_module.zip
tar zxvf nginx-1.16.1.tar.gzcd $dir/nginx/nginx-upstream-fair-master
sed -i 's/default_port/no_port/g' ngx_http_upstream_fair_module.c
patch -p1 < $dir/nginx/nginx_upstream_check_module-master/upstream_fair.patchcd $dir/nginx/nginx-1.16.1
patch -p1 < $dir/nginx/nginx_upstream_check_module-master/check_1.16.1+.patchcd $dir/nginx/nginx-1.16.1./configure \
--prefix=/usr/local/nginx \
--with-http_realip_module \
--with-http_ssl_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-stream \
--with-http_stub_status_module \
--add-module=${dir}/nginx/nginx_upstream_check_module-master \
--add-module=${dir}/nginx/nginx-upstream-fair-master \
--add-module=${dir}/nginx/nginx-module-vts-master \
--add-module=${dir}/nginx/ngx_http_substitutions_filter_module-mastermake && make install
3.编写剧本
[root@120 tasks]# cd /opt/ansible/roles/init-nginx/tasks[root@120 tasks]# cat main.yml
---
# tasks file for ./nginx- name: create nginx dirfile: path: /opt/env/nginx/servsstate: directoryowner: rootgroup: rootmode: 0755- name: create nginx certsfile:path: /opt/env/nginx/certsstate: directoryowner: rootgroup: rootmode: 0755- name: create nginx logsfile:path: /ware/logs/nginxstate: directoryowner: rootgroup: rootmode: 0755- name: modify logs shell: chmod -R 777 /ware/logs/nginx- name: yum installyum: name: "{{ with_item }}"state: latestvars:with_item:- wget- zip- unzip- patch- gcc- gcc-c++- pcre- pcre-devel- zlib- zlib-devel- openssl- openssl-devel- name: copy nginx.tar.gzvars:- item: /server/storage/copy:src: nginx.tar.gzdest: "{{ item }}"owner: rootgroup: rootmode: 0644- name: copy install.shcopy:src: install.shdest: /server/storage/nginx/mode: 755- name: install nginxshell: /server/storage/nginx/install.sh- name: copy nginx confcopy:src: nginx.confdest: /usr/local/nginx/conf/nginx.confowner: rootgroup: rootmode: 0644- name: copy nginx.servicecopy:src: nginx.servicedest: /usr/lib/systemd/systemowner: rootgroup: rootmode: 0644- name: daemon reloadshell: systemctl daemon-reload- name: enable nginxservice:name: nginxenabled: yes[root@120 tasks]#
7.你写的不对
我们写的playbook都是以hosts开头的,你这直接以具体的task开头,这咋运行?

没错,一般的剧本,都是以上图的格式书写的,但是我们学习Ad-Hoc和roles是干啥的,为了我们的规范化和模块化,要让不同的主机组都能使用一个roles。所以我们需要建一个文件,内容如下:
[root@120 ansible]# cat init-nginx.yml
- hosts: yzbremote_user: rootroles:- role: init-nginx
我们单独拉出来一个文件,这样可以使不同的主机组、不同的任务都有单独的配置文件,清晰明了,也实现了roles的复用!
8.执行剧本,完成目标主机nginx安装
ansible-playbook init-nginx.yml相关文章:
Ansible-综合练习-生产案例
斌的招儿 网上教程大多都是官网模板化的教程和文档,这里小斌用自己实际生产环境使用的例子给大家做一个详解。涉及到一整套ansible的使用,对于roles的使用,也仅涉及到tasks和files目录,方便大家快速上手并规范化管理。 0.环境配置…...
lombok关于构造器的注解的坑【避坑】
文章目录 背景问题问题解决 背景 平时,我们不定义构造器时,会自动创建一个无参的构造器。 当我们提供了任意有参构造器后,将不再自动创建无参构造器。 问题 为了方便创建对象并同时赋值,使用了全参构造器的注解NoArgsConstruct…...
指针并不是用来存储数据的,而是用来存储数据在内存中地址(内存操作/函数指针/指针函数)
推荐:1、4、5号书籍 1. 基本概念 首先,让小明了解指针的基本概念: 指针的定义:指针是一个变量,它存储的是另一个变量的地址。指针的声明:例如,int *p表示一个指向整数的指针变量p。 2. 形象…...
iso21434认证的意义
ISO 21434认证对于汽车行业具有深远的意义,主要体现在以下几个方面: 确保汽车网络安全:ISO 21434认证旨在确保汽车在设计和制造过程中能够抵御潜在的网络威胁和攻击。通过遵循该标准,汽车制造商能够开发出具备可靠网络安全能力的…...
分页处理封装+分页查询题目列表
文章目录 1.sun-club-common封装分页1.com/sunxiansheng/subject/common/eneity/PageInfo.java2.com/sunxiansheng/subject/common/eneity/PageResult.java 2.sun-club-application-controller1.SubjectInfoDTO.java 继承PageInfo并新增字段2.SubjectController.java 3.sun-clu…...
每天一个项目管理概念之WBS
项目管理中的工作分解结构(Work Breakdown Structure,简称WBS)是规划和管理项目的核心工具之一,它通过将复杂的项目任务细分为更小、更易管理的部分来提高项目执行的效率与效果。WBS不仅有助于明确项目范围,还为时间管…...
linux安装mysql8并查看密码
1. **下载RPM包**: wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm 2. **安装RPM包**: sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm 3. **更新YUM缓存**: sudo yum makecache 4. **安装…...
[渗透测试] 任意文件读取漏洞
任意文件读取漏洞 概述 漏洞成因 存在读取文件的功能(Web应用开放了文件读取功能)读取文件的路径客户端可控(完全控制或者影响文件路径)没有对文件路径进行校验或者校验不严格导致被绕过输出文件内容 漏洞危害 下载服务器中的…...
sudo: /etc/init.d/ssh: command not found
在 WSL 中尝试启动 SSH 服务时遇到 sudo: /etc/init.d/ssh: command not found 错误 安装 OpenSSH 服务器 更新软件包列表 sudo apt update安装 OpenSSH 服务器 sudo apt install openssh-server启动 SSH 服务 在 WSL 2 上,服务管理与传统 Linux 系统有所不同。你可以手动启动…...
秋招倒计时?到底需要准备到什么程度?
秋招倒计时?需要准备到什么程度? 秋招,面向全国的毕业生,招聘的激烈程度可想而知!按照往年时间,秋招通常从八月初开始,九月黄金期,十月中后期。距今刚好差不多60天,时间其…...
6.26.4.1 基于交叉视角变换的未配准医学图像多视角分析
1. 介绍 许多医学成像任务使用来自多个视图或模式的数据,但很难有效地将这些数据结合起来。虽然多模态图像通常可以在神经网络中作为多个输入通道进行配准和处理,但来自不同视图的图像可能难以正确配准(例如,[2])。因此,大多数多视…...
62.指针和二维数组(2)
一.指针和二维数组 1.如a是一个二维数组,则数组中的第i行可以看作是一个一维数组,这个一维数组的数组名是a[i]。 2.a[i]代表二维数组中第i行的首个元素的地址,即a[i][0]的地址。 二.进一步思考 二维数组可以看作是数组的数组,本…...
学生表的DDL和DML
DDL -- 创建学生表 CREATE TABLE students (student_id INT PRIMARY KEY AUTO_INCREMENT,studentname VARCHAR(50),age INT,gender VARCHAR(10) );-- 创建课程表 CREATE TABLE courses (course_id INT PRIMARY KEY AUTO_INCREMENT,course_name VARCHAR(50) );-- 创建教师表 CR…...
视觉灵感的探索和分享平台
做设计没灵感?大脑一片空白?灵感是创作的源泉,也是作品的灵魂所在。工作中缺少灵感,这是每个设计师都会经历的苦恼,那当我们灵感匮乏的时候,该怎么办呢?别急,即时设计、SurfCG、Lapa…...
使用 Reqable 在 MuMu 模拟器进行App抓包(https)
1、为什么要抓包? 用开发手机应用时,查看接口数据不能像在浏览器中可以直接通过network查看,只能借助抓包工具来抓包,还有一些线上应用我们也只能通过抓包来排查具体的问题。 2、抓包工具 实现抓包,需要一个抓包工具…...
RedisConnectionException: Unable to connect to localhost/<unresolved>:6379
方法一:删除配置密码选项 一般是因为你在启动redsi服务的时候没有以指定配置文件启动 把application.yml文件中的redis密码注释掉 方法二 以指定配置文件启动 这样就不用删除yml文件中密码的选项了 在redis,windows.conf 中找到requirepass,删除掉前…...
poi word写入图片
直接使用的百度结果,经过测试可行 1.pom增加jar <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apach…...
【监控】2.Grafana的安装
在 macOS 上部署 Grafana 和 Prometheus 来监控 Java 服务是一个非常实用的操作。以下是详细的步骤,包括如何安装和配置 Prometheus、Grafana 以及在 Java 服务中集成 Prometheus 的客户端库来收集指标数据。 1. 安装 Grafana 1.1 使用 Homebrew 安装 Grafana br…...
Java入门教程(上)
Java入门教程(上) Java是一种流行的面向对象编程语言,以其简洁、可移植和强大的特性,被广泛应用于各种软件开发领域。对于初学者来说,掌握Java的基础知识和编程技巧是非常重要的。本文将带你从零开始学习Java…...
【Linux】Linux下使用套接字进行网络编程
🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 用于网络应用开…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
