Ansible自动化运维(五) 运维实战

server/2024/12/17 17:42:35/

Ansible自动化运维这部分我将会分为五个部分来为大家讲解

(一)介绍、无密钥登录、安装部署、设置主机清单

(二)Ansible 中的 ad-hoc 模式 模块详解(15)个

(三)Playbook 模式详解

(四)jinja2 模板 Roles角色详解

(五)运维实战

相关文章标题以及链接
Ansible自动化运维(一)介绍、无密钥登录、安装部署_ansible 免密登录-CSDN博客
Ansible自动化运维(二) ad-hoc 模式 模块详解_ansible ad-hoc-CSDN博客
Ansible自动化运维(三)playbook剧本详解-CSDN博客
Jinja2模板、Roles角色详解-CSDN博客
Ansible自动化运维(五) 运维实战-CSDN博客

目录

一、Ansible批量自动化编译安装nginx

1、Ansible批量自动化编译安装nginx

1.1 编译安装nginx

1.2 创建roles角色目录

1.3 查看文件内容

查看tasks主任务文件

查看templates目录下的文件

nginx.conf.j2

systemctl.nginx.j2

查看handlers触发器

查看var变量

查看roles.yml总脚本

执行脚本:

二、管理配置文件回滚操作:

查看目录里的所有文件内容

New  更新文件

查看总脚本:

查看tasks/main.yml主任务

查看template 模板

查看handlers/main.yml里的内容

查看var变量

old  回滚文件

查看总执行脚本

backup  备份文件

backup脚本内容

测试


一、Ansible批量自动化编译安装nginx

1.1 编译安装nginx

首先我们要在本机机器上编译安装nginx
配置基础环境
安装依赖项

yum -y install epel-release
yum -y install  gcc-c++                        
yum install -y pcre pcre-devel                
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
yum install -y wget

下载解压源码包

wget http://nginx.org/download/nginx-1.26.2.tar.gz
mkdir /usr/local/nginx
tar -zxvf nginx-1.26.2.tar.gz -C /usr/local/nginx

进入到目录中,进行配置,下载

cd /usr/local/nginx/nginx-1.26.2 && ./configure
make && make install

检查语法并启动

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx

1.2 创建roles角色目录

目录结构

[root@server ~]# tree /etc/ansible/roles
/etc/ansible/roles
└── nginx├── default│   └── main.yml├── files├── handlers│   └── main.yml├── meta│   └── main.yml├── roles.yml├── tasks│   └── main.yml├── templates│   ├── nginx.conf.j2│   └── systemctl.nginx.j2└── vars└── main.yml8 directories, 8 files

1.3 查看文件内容

查看tasks主任务文件

[root@server nginx]# cat tasks/main.yml 
- name: install packetyum:name: "{{ item }}"state: presentloop:- gcc- wget- net-tools- pcre - pcre-devel- zlib- zlib-devel- name: 创建/tmp目录file: path: /tmpstate: directorymode: '0755'- name: 下载nginx,并传到目标主机/tmp/nginx文件中get_url:url: "http://nginx.org/download/nginx-1.26.2.tar.gz"dest: "/tmp/nginx-1.26.2.tar.gz"mode: '0644'- name: 在远端创建目录file: path: /usr/local/nginxstate: directory- name: 解压nginx文件unarchive: src: /tmp/nginx-1.26.2.tar.gzdest: /tmpremote_src: yescreates: /tmp/nginx-1,26.2.tar.gz   - name: configure nginxcommand: /tmp/nginx-1.26.2/configure --prefix=/usr/local/nginxargs:chdir: /tmp/nginx-1.26.2- name: Build nginxcommand: makeargs:chdir: /tmp/nginx-1.26.2- name: Install nginxcommand: make installargs:chdir: /tmp/nginx-1.26.2- name: 创建/etc/nginx目录file:path: /etc/nginxstate: directorymode: '0755'- name: conftemplate:src: nginx.conf.j2 dest: /etc/nginx/nginx.conftags: nginxconfnotify: new conf to reload- name: systemctl nginxtemplate:src: systemctl.nginx.j2dest: /etc/systemd/system/nginx.service- name: 重新加载配置文件command: systemctl daemon-reload- name: start serviceservice: name: nginx state: started enabled: yes- name: 运行状态command: systemctl status nginxregister: nginx_status- name: 输出nginx运行状态信息debug:var: nginx_status.stdout_lines

查看templates目录下的文件

[root@server nginx]# ls templates/
nginx.conf.j2  systemctl.nginx.j2
nginx.conf.j2
[root@server nginx]# cat templates/nginx.conf.j2
user  nginx; # 设置 Nginx 服务的系统使用用户
worker_processes  {{ ansible_processor_vcpus }}; # 工作进程数error_log  /var/log/nginx/error.log warn; # Nginx 的错误日志
pid        /var/run/nginx.pid; # Nginx 启动时候的 PID 文件events {worker_connections  1024; # 每个工作进程允许的最大连接数
}http { include       /etc/nginx/mime.types;
default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"'; # 日志格式定义access_log  /var/log/nginx/access.log  main; # 访问日志sendfile        on; # 开启高效文件传输模式
keepalive_timeout  65; # 客户端与服务端的超时时间server { listen       {{ nginxport }};server_name  localhost;location / {root   /usr/share/nginx/html; # 页面存放目录index  index.html index.htm; # 默认页面}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}
}include /etc/nginx/conf.d/*.conf;
}

如果不好使,出现报错那就换回nginx的原配置文件,
一般在  /usr/local/nginx/conf/nginx.conf  路径中

cp -r  /usr/local/nginx/conf/nginx.conf /etc/ansible/roles/nginx/templates/nginx.conf.j2
systemctl.nginx.j2
[root@server nginx]# cat templates/systemctl.nginx.j2 
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/local/nginx/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target

查看handlers触发器

[root@server nginx]# cat handlers/main.yml 
- name: new conf to reloadservice: name: nginx state: restarted

因为主任务中有一项notify关键字

查看var变量

[root@server nginx]# cat vars/main.yml 
nginxport: 80

查看roles.yml总脚本

[root@server nginx]# cat roles.yml 
- hosts: node2become: yesroles:- nginx

执行脚本:

[root@server nginx]# ansible-playbook roles.yml

这里我们能看到,已经成功在host2主机上编译安装nginx并启动。
为了再次确认,我们进行更详细的检查

ansible node2 -i inventory_file -m command -a "systemctl status nginx"

再次进行测试
这次我们将两台虚拟机全部恢复快照,恢复到原始形态

[root@server nginx]# cat /etc/ansible/hosts
[node4]
host1
host2

[root@server nginx]# cat roles.yml

[root@server nginx]# cat roles.yml 
- hosts: node4become: yesroles:- nginx

执行脚本:

[root@server nginx]# ansible-playbook roles.yml

这里报错是因为,一开始host1主机网络出现问题,不用担心。再执行一遍就好了,不用做任何修改。
再执行一遍就OK

测试结果:

至此,我们成功在两台机器上完成编译安装并且成功启动

二、管理配置文件回滚操作:

生产环境中大多数时候需要管理配置文件的,安装软件包只是在初始化环境的时候用一下。下面给写一个管理nginx配置文件的playbook。

old目录中的yml文件与new目录中的相同,files中的配置文件不同。
其中new为更新时用到的,old为回滚时用到的,files下面为nginx.conf和vhosts目录,handlers为重启nginx服务的命令
在执行nginx.yml前,应备份当前配置文件,当执行之后发现错误,则进行回滚操作。关于回滚,需要在执行playbook之前先备份一下旧的配置,所以对于老配置文件的管理一定要严格,千万不能随便去修改线上机器的配置,并且要保证new/files下面的配置和线上的配置一致

我的文件:

备份文件:backup.yml

更新文件:nginx.yml

回滚文件:nginxold.yml

大概思路:

在执行任何更新之前,先运行 backup.yml 进行备份。

然后尝试运行 nginx.yml 来应用新的更改。

如果更新过程中遇到问题,使用 nginxold.yml 来恢复到之前的配置状态。

各个目录与文件的位置

[root@server ansible]# cd nginx_config/
[root@server nginx_config]# ls
roles
[root@server nginx_config]# cd roles/
[root@server roles]# ls
backup.yml  new  nginxold.yml  nginx.yml  old  usernginx.yml

查看目录里的所有文件内容

New  更新文件

── new
    │   ├── files
    │   │   ├── nginx.conf
    │   │   └── vhosts
    │   ├── handlers
    │   │   └── main.yml
    │   ├── tasks
    │   │   ├── main.yml
    │   │   └── main.yml.bak
    │   ├── templates
    │   │   ├── nginx.conf.j2
    │   │   └── vhosts.j2
    │   └── vars
    │       └── main.yml

[root@server roles]# ls
backup.yml  new  nginxold.yml  nginx.yml  old  usernginx.yml
查看总脚本:
[root@server roles]# cat nginx.yml 
---
- hosts: node1become: yesroles:- role: new
查看tasks/main.yml主任务
[root@server roles]# cat new/tasks/main.yml
---
- name: 循环创建目录file:path: "{{ item }}"state: directorymode: '0755'loop:- /etc/nginx- /var/log/nginx- /usr/local/nginx- name: 备份当前配置文件template:src: vhosts.j2dest: /usr/local/nginx/conf/vhosts- name: 将配置文件复制到被控主机(关键字reload nginx)template:src: nginx.conf.j2dest: /usr/local/nginx/conf/nginx.confnotify: reload nginx- name: 开启nginx服务并且设置开机自启service:name: nginxstate: startedenabled: yes- name: Ensure nginx user and group existbecome: yesuser:name: nginxsystem: yesshell: /sbin/nologincreate_home: nostate: presentnotify: reload nginx- name: Ensure nginx group existsbecome: yesgroup:name: nginxstate: presentnotify: reload nginx
查看template 模板
[root@server roles]# ls new/templates/
nginx.conf.j2  vhosts.j2

这里nginx.conf.j2是nginx的配置文件

       vhosts是一会做实验要用到的

这个是nginx.conf.j2里的内容,脚本里忘写了,手动复制一下吧

cp -r /usr/local/nginx/conf/nginx.conf /etc/ansible/nginx_config/roles/new/templates/nginx.conf.j2

这个是vhosts里的内容

[root@server roles]# cat new/templates/vhosts.j2 
#jlvnkuioarhvosrjvsanvjlk

随便写几行就行,一会做实验用的


查看handlers/main.yml里的内容
[root@server roles]# cat new/handlers/main.yml 
---
- name: reload nginxcommand: systemctl reload nginxlisten: "reload nginx"
查看var变量
[root@server roles]# cat new/vars/main.yml 
backup_path: /etc/ansible/nginx_config/roles/old/files
nginx_port: 80

old  回滚文件

目录结构和new里的一样就行
创建目录和文件即可,不做任何改动

[root@server roles]# ls
backup.yml  new  nginxold.yml  nginx.yml  old  usernginx.yml

这里nginxold.yml为old目录的总执行脚本


查看总执行脚本
[root@server roles]# cat nginxold.yml 
---
- hosts: node1become: yesroles:- role: old

backup  备份文件

备份文件
查看执行脚本

[root@server roles]# ls
backup.yml  new  nginxold.yml  nginx.yml  old  usernginx.yml
backup脚本内容

这里backup.yml为备份的执行脚本

[root@server roles]# cat backup.yml 
---
- name: tongbu    hosts: localhostbecome: yestasks: - name: Backup current Nginx configuration using rsyncsynchronize:src: /etc/ansible/nginx_config/roles/new/dest: /etc/ansible/nginx_config/roles/old/archive: yesdelegate_to: localhost  # 确保任务在控制节点上运行

操作流程
大概的操作思路就是

在执行任何更新之前,先运行 backup.yml 进行备份。

然后尝试运行 nginx.yml 来应用新的更改。

如果更新过程中遇到问题,使用 nginxold.yml 来恢复到之前的配置状态。


再没进行更新配置之前先使用backup.yml脚本进行备份

 ansible-playbook backup.yml

备份完成后就可以使用nginx.yml脚本来进行更新

ansible-playbook nginx.yml

如果更新过程中遇到问题,使用 nginxold.yml 来恢复到之前的配置状态。

ansible-playbook nginxold.yml
测试

还记得之前在template目录创建的vhosts文件不

[root@server roles]# cat new/templates/vhosts.j2
#jlvnkuioarhvosrjvsanvjlk

我们先进行备份

[root@server roles]# ansible-playbook backup.yml 

执行更新脚本

我们查看一下被控主机的vhosts文件内容

[root@server roles]# ansible node1 -m command -a "cat /usr/local/nginx/conf/vhosts"
host1 | CHANGED | rc=0 >>
#jlvnkuioarhvosrjvsanvjlk

执行脚本

[root@server roles]# ansible-playbook nginx.yml 

继续查看vhosts文件内容:

[root@server roles]# ansible node1 -m command -a "cat /usr/local/nginx/conf/vhosts"
host1 | CHANGED | rc=0 >>
#72364876235646325466372456

发现已经成功修改成最新的状态

此时我们因为做完了备份,所以执行nginxold.yml脚本就可以进行一个回滚操作,恢复到原来的配置状态,我们一起实验看一下

执行old脚本

[root@server roles]# ansible-playbook nginxold.yml 

我们这是后再进行查看vhosts文件内的内容

[root@server roles]# ansible node1 -m command -a "cat /usr/local/nginx/conf/vhosts"
host1 | CHANGED | rc=0 >>
#jlvnkuioarhvosrjvsanvjlk

发现此时,文件内容已经恢复到备份时的状态


http://www.ppmy.cn/server/150960.html

相关文章

视频监控汇聚平台方案设计:Liveweb视频智能监管系统方案技术特点与应用

随着科技的发展,视频监控平台在各个领域的应用越来越广泛。然而,当前的视频监控平台仍存在一些问题,如视频质量不高、监控范围有限、智能化程度不够等。这些问题不仅影响了监控效果,也制约了视频监控平台的发展。 为了解决这些问…

华为设备ssh协议配置要点儿

*红宝书------华为SSH协议的配置的要点* 路由器使用ssh协议来进行配置 1&#xff0c;需要在服务器上创建ssh账户并开启ssh协议 2&#xff0c;手工配置密钥&#xff08;推荐768以上 3&#xff0c;VTY用户接口下允许开启SSH登录方式 R1配置 <Huawei>sys Enter system…

C# 方法的参数主要有四种类型:值参数、引用参数ref 、输出参数out、可变参数params

在 C# 中&#xff0c;方法的参数主要有四种类型&#xff1a;值参数、引用参数ref 、输出参数out、可变参数&#xff08;使用 params 修饰符声明&#xff09;。下面是每种参数类型的详细说明、使用注意事项。 1. 值参数 值参数是最常见的参数传递方式。当值参数被传递给方法时…

【深度学习项目】目标检测之YOLO系列-V4(二)

快速通道&#xff1a;https://blog.csdn.net/u014608435/article/details/144497816 介绍 YOLOv4&#xff08;You Only Look Once v4&#xff09;是YOLO系列目标检测算法的又一个重要版本&#xff0c;它在2020年由Alexey Bochkovskiy、Chien-Yao Wang和Hong-Yuan Mark Liao提出…

高级java每日一道面试题-2024年12月16日-数据库篇-分布式数据库中SQL的执行过程和传统数据库有什么不一样的地方?

如果有遗漏,评论区告诉我进行补充 面试官: 分布式数据库中SQL的执行过程和传统数据库有什么不一样的地方&#xff1f; 我回答: 在 Java 高级面试中&#xff0c;分布式数据库与传统单机数据库&#xff08;如 MySQL、PostgreSQL 等&#xff09;之间 SQL 执行过程的差异是一个非…

在Scala中对Map函数的使用

package pp28{object cscc {def main(args: Array[String]): Unit {val m1 Map("马云 — 阿里巴巴" -> 1964,"马化腾 — 腾讯" -> 1971,"李彦宏 - 百度" -> 1968,"雷军 - 小米" -> 1969,"丁磊 - 网易" -> …

计算机网络-传输层 UDP协议

学习一个网络协议&#xff0c;主要就是学习“数据格式/报文格式” UDP的特点 UDP传输的过程类似于寄信. ⽆连接: 知道对端的IP和端⼝号就直接进⾏传输, 不需要建⽴连接; 不可靠: 没有确认机制, 没有重传机制; 如果因为⽹络故障该段⽆法发到对⽅, UDP协议层也不会给应 ⽤层返回任…

什么是IP地址?什么是IP属地?它们如何改变IP

一&#xff0c;IP地址和IP属地的定义和关系 1&#xff1a;IP地址定义 互联网协议地址&#xff0c;每一台设备都拥有一个独一无二的身份证明——IP地址&#xff0c;无论是电脑、手机还是服务器&#xff0c;在连接到互联网的瞬间&#xff0c;就被赋予了一个IP地址&#xff0c;它…