运维05:自动化

news2024/11/24 10:55:50

人工运维时代

运维人员早期需要维护众多的机器,因此需要执行很多重复的劳动,很多机器需要同时部署相同的服务或者是执行相同的命令,还得反复地登录不同的机器,执行重复的动作

自动化运维时代

早期运维人员会结合ssh免密登录,以及shell脚本来完成自动化的部署操作

系统管理员面临的问题主要是:配置管理系统、远程执行命令、批量安装服务,启停服务等等

后来也诞生了众多的自动化运维软件,比如 Ansible

自动化运维的好处

  • 减少重复的操作,提高工作效率
  • 减少了人为出错的可能性
  • ansible支持数据化管理,数据化追源,找到问题的源头

 Ansible介绍

ansible是一个同时管理多个远程主机的软件,必须是任意可以通过ssh登录的机器,因为ansible可以管理的机器,包括:

  • 远程虚拟机
  • 物理机
  • 本机机器

ansible通过ssh协议实现了,管理节点(安装了ansible服务的机器)和被管理节点的通信。

只要是通过ssh协议登录的主机,就可以完成ansible自动化部署操作

  • 批量文件分发
  • 批量数据复制
  • 批量数据修改、删除
  • 批量自动化安装软件服务
  • 批量服务启动、停止
  • 脚本化,自动批量服务部署

ansible特点

  • 安装部署简单
  • 管理主机便捷、支持多台主机并行管理
  • 无须安装被管理节点的客户端(no agent),且无需占用客户端的其他端口,仅仅使用ssh服务即可
  • 不仅仅支持python,还支持其他语言的二次开发
  • 不用root用户也可执行,降低系统权限

Ansible实践部署

  • 准备好虚拟机 

准备好3个Linux虚拟机,配置在同一个局域网内,然后设置好静态ip地址

childA        192.168.xxx.129                被管理机器

childB        192.168.xxx.130                被管理机器(配置好ssh服务,以及关闭防火墙等等)

master01   192.168.xxx.128                管理机器(安装了ansible的服务器) 

  • 先准备ansible管理机器
#选择yum自动化安装(前提:已经安装好了阿里云yum、epel源)
yum install epel-release
yum install ansible

#检查ansible软件安装情况,查询配置文件和可执行命令
rpm -ql ansible | grep -E '^/etc|^/usr/bin'

#检查ansible版本
ansible --version
  • 再准备ansible被管理机器
yum install epel-release libselinux-python -y

Ansible管理方式

ansible管理主机的方式有2种

  • 传统的输入ssh密码验证
  • 密钥管理

配置好ansible的配置文件,添加被管理机器的ip地址,或者主机名

#主节点备份现有的配置文件
cp /etc/ansible/hosts /etc/ansible/hosts.ori

#添加ansible需要管理的机器地址(节点A和节点B的ip地址)
[root@192 ansible]# vim hosts
[root@192 ansible]# tail -3 /etc/ansible/hosts
[qiujie]
192.168.xxx.129
192.168.xxx.130

ssh密码认证方式管理机器

ansible是直接利用linux本地的ssh服务,以及一些远程的ssh操作,一般情况下客户端的ssh服务默认都是开启的,无须额外管理

步骤:

①在master01机器上,执行如下命令

#在主机器上,告诉其他被管理的机器,你要执行什么命令,以及用什么用户去执行
ansible qiujie -m command -a 'hostname' -k -u root

qiujie    /etc/ansible/hosts 文件中定义的主机组,还可以写主机的ip地址,以及通配符

-m        指定功能模块,默认就是command模块

-a         告诉模块需要执行的参数

-k         询问密码验证

-u         指定运行的用户

运行命令之后报错了: 

报错原因:

使用了密码方式登录,在主机Host Key检查激活情况下,sshpass不支持该用法,得在master01机器的 ~/.ssh/known_hosts 文件中,添加客户端机器的指纹密钥

 ②手动ssh登录,对主机进行连接,即可使用ansible命令操作了

ssh root@192.168.xxx.129
ssh root@192.168.xxx.130

连接之后,再查看  ~/.ssh/known_hosts 文件,发现

③此时可以在master01机器上,再次执行ansible命令

ansible qiujie -m command -a 'hostname' -k -u root

配置免密登录

每次执行ansible命令的时候,都需要输入ssh的认证密码,也就是root密码,如果不同的主机密码不一样,那你还得输入多次才行。因此,我们可以配置如下的快捷登录方式

  • ansible自带的密码认证参数
#可以在 /etc/ansible/hosts文件中,定义密码即可实现快速认证,远程管理主机
#修改后的内容如下:
[qiujie]
192.168.186.129 ansible_user=root ansible_ssh_pass=111111
192.168.186.130 ansible_user=root ansible_ssh_pass=111111

ansible_host               主机地址

ansible_port                端口,默认是22端口

ansible_user               认证的用户

ansible_ssh_pass       用户认证的密码

执行ansible命令(这次后面 -k -u root 那段参数就不用加了,它会自动执行配置文件中设置的账号和密码) 

ansible qiujie -m command -a 'hostname'
  • ssh密钥方式批量管理主机

这个方式比起hosts文件的密码参数来的更安全放心

#在master01机器上创建ssh密钥对
ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1

#检查公私钥文件
[root@master01 ~]# cd ~/.ssh/
[root@master01 .ssh]# ls
id_rsa  id_rsa.pub  known_hosts

编写公钥分发脚本

创建公钥分发脚本

mkdir /mysh

cd /mysh

touch ssh_key_send.sh

vim ssh_key_send.sh

脚本具体内容如下: 

#!/bin/bash
rm -rf ~/.ssh/id_rsa*
ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1
SSH_Pass=123123
Key_Path=~/.ssh/id_rsa.pub
for ip in 129 130
do
        sshpass -p$SSH_Pass ssh-copy-id -i $Key_Path "-o StrictHostKeyChecking=no" 192.168.xxx.$ip
done
#非交互式分发公钥命令需要用sshpass指定SSH密码,通过 -o StrictHostKeyChecking=no 跳过SSH确认连接信息
#执行
sh ssh_key_send.sh

#然后直接使用以下命令连接childA和childB节点,这样不需要输入密码
ssh -o ' StrictHostKeyChecking=no' '192.168.xxx.129'
ssh -o ' StrictHostKeyChecking=no' '192.168.xxx.130'

ansible模式

ansible实现批量化管理主机的模式,主要有2种

  • ad-hoc模式:利用ansible的纯命令行实现批量管理
  • playbook剧本模式:利用ansible的playbook剧本实现批量管理

ansible-doc命令

列出ansible支持的所有模块

ansible-doc -l

查看某个模块的具体用法参数

ansible-doc -s command

Ansible模块精讲

1、command模块

  • 作用:在远程节点上执行一个命令

chdir                在执行命令之前,先通过cd进入该参数指定的目录

creates            在创建一个文件之前,判断该文件是否存在,如果存在了则跳过前面的动作,如果不存在,则执行前面的动作

free_form         该参数可以输入任何的系统命令,实现远程执行和管理

removes           定义一个文件是否存在,如果存在则执行前面的动作,如果不存在则跳过

command模块是ansible默认的基本模块,也可以省略不写,但是要注意如下的坑:

使用command模块,不得出现shell变量,比如$name,也不得出现特殊符号,比如 > < | ; & 这些符号command模块都不认识,如果你想用前面指定的变量、特殊符号,请使用shell模块

  • command模块案例

 获取所有被管理机器的负载信息

ansible qiujie -m command -a 'uptime'

让客户端机器,先切换到 /tmp 目录下,然后打印当前的工作目录

ansible qiujie -m command -a "pwd chdir=/tmp"

让客户端机器,判断 /qiujie 文件是否存在,如果不存在就打印当前路径,存在就跳过

ansible qiujie -m command -a "pwd creates=/qiujie"

让客户端机器,判断/aaa目录是否存在,如果存在就列出/aaa目录下的所有东西,不存在就跳过

 ansible qiujie -m command -a "ls /aaa   removes=/aaa"

warn参数,是否提供警告信息

#执行命令,并且不提示报错信息
ansible qiujie -m command -a "chmod 000 /etc/hosts warn=false"

shell模块

批量查询进程信息

ansible qiujie -m shell -a "ps -ef | grep vim"

批量在客户端机器,创建写入文件信息

ansible qiujie -m shell -a "echo 你真棒 > /tmp/heihei.txt"

批量执行脚本

#需要执行的这个脚本,必须在客户端机器上存在,否则会报错,这是shell模块的特点
#因为还有一个专门执行脚本的script模块

1.创建文件夹
2.创建sh脚本文件,还要写入脚本内容
3.赋予脚本可执行权限
4.执行脚本,并且忽略warning信息


ansible qiujie -m shell -a "mkdir -p /server/myscripts;    echo 'hostname' > /server/myscripts/hostname.sh;   chmod +x /server/myscripts/hostname.sh warn=false"

script 模块

功能:把 master01 管理机器上的脚本,远程地传输到被管理的节点上执行

比起shell模块,script模块功能更强大,在master01机器本地有一份脚本,就可以在所有被管理节点上去运行

1.在管理节点上创建脚本
[root@master01 /]# mkdir /myscripts
[root@master01 /]# cd /myscripts
[root@master01 myscripts]# echo -e "pwd\nhostname" > /myscripts/local_hostname.sh 
[root@master01 myscripts]# cat /myscripts/local_hostname.sh 
pwd
hostname

2.授权
[root@master01 myscripts]# chmod +x /myscripts/local_hostname.sh

远程地批量执行脚本,并且在客户端上不需要存在该脚本

myscripts]# ansible qiujie -m script -a "/myscripts/local_hostname.sh"

利用script模块,可以批量让所有被管理的机器执行脚本,且该脚本不需要在被管理的客户端上存在

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell数组函数:数组——数组和循环(二)

for脚本快速定义数组 [rootlocalhost ~]# vim for12.sh #脚本编辑 #!/bin/bash for a in cat /etc/hosts do hosts[o]$a donefor i in ${!hosts[]} do echo "$i : ${hosts[$a]}" done[rootlocalhost ~]# vim for12.sh #执行脚本区别 &#xff1a;for的空格分割…

漏洞复现-某教育视频云平台前台某接口文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

【每日一题】—— D. Divide and Equalize(Codeforces Round 903 (Div. 3))(数学、数论)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

代码随想录二刷 | 栈与队列 | 前 k 个高频元素

代码随想录二刷 &#xff5c; 栈与队列 &#xff5c; 前 k 个高频元素 题目描述解题思路 & 代码实现 题目描述 347.前k个高频元素 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nu…

[node] Node.js的Web 模块

[node] Node.js的Web 模块 什么是 Web 服务器&#xff1f;Web的应用架构http使用方式使用 Node 创建 Web 服务器使用 Node 创建 Web 客户端 什么是 Web 服务器&#xff1f; Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序&#xff0c;Web服务器…

http与apache

目录 1.http相关概念 2.http请求的完整过程 3.访问浏览器背后的原理过程 4.动态页面与静态页面区别 静态页面&#xff1a; 动态页面&#xff1a; 5.http协议版本 6.http请求方法 7.HTTP协议报文格式 8.http响应状态码 1xx&#xff1a;提示信息 2xx&#xff1a;成功…

『TypeScript』深入理解变量声明、函数定义、类与接口及泛型

&#x1f4e3;读完这篇文章里你能收获到 了解TypeScript变量声明与类型注解掌握TypeScript函数与方法的使用掌握TypeScript类与接口的使用掌握TypeScript泛型的应用 文章目录 一、变量声明与类型注解1. 变量声明2. 类型注解3. 类型推断 二、函数与方法定义1. 函数定义2. 方法定…

学习Opencv(蝴蝶书/C++)相关1——4.图形和大型数组类型

文章目录 1. 多维度数组和多通道数组区别2. NAryMatIterator详解2.1 介绍2.2 dispatch和SIMD(OpenCV和numpy)2.2.1 OpenCV的2.2.2 numpy的2.2.3 OpenCV文档搜索2.3 调用指令集对代码进行优化2.4 NAryMatIterator理解2.4.1 plane和连续2.4.2 构造函数和迭代2.5 NAryMatIterato…

Cisco Packet Tracer配置命令——交换机篇

交换机VLAN配置 在简单的网络环境中&#xff0c;当交换机配置完端口后&#xff0c;即可直接应用&#xff0c;但若在复杂或规模较大的网络环境中&#xff0c;一般还要进行VLAN的规划&#xff0c;因此在交换机上还需进行 VLAN 的配置。交换机的VLAN配置工作主要有VLAN的建立与删…

CAN总线协议编程实例

1. can.h #ifndef __CAN_H #define __CAN_H#include "./SYSTEM/sys/sys.h"/******************************************************************************************/ /* CAN 引脚 定义 */#define CAN_RX_GPIO_PORT GPIOA #define CAN_RX_GPI…

超大规模集成电路设计----FPGA时序模型及FSM的设计(八)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----RTL级设计之FSM&#xff08;八&#xff09; 7.1 CPLD的时序模型7.1.1 XPLA3 时序模型7.1.…

算法___

文章目录 算法两数之和 算法 两数之和 题目如下图&#xff1a; 我的答案如下图&#xff1a; 我采用的是最笨的思路&#xff0c;直接暴力的两次循环&#xff0c;第一次外循环是取数组的第一个元素&#xff0c;然后内循环会遍历数组后面除第一个的所有元素&#xff0c;然后和…

煤矿电力监控系统

煤矿电力监控系统是一种用于煤矿电力系统的监控解决方案。该系统在重点煤矿的矿井变电站、主运输、主通风、主排水、主副提升等重要设备上加装智能用电融合终端&#xff0c;实时监测煤矿重要设备的电流、电压、负载等主要数据变化。为管理人员提供实时监测、报表管理、告警中心…

初始类与对象

初始类与对象 实验介绍 本课程是进一步对类与对象的深入认识&#xff0c;如何定义并实例化一个类&#xff0c;介绍如何使用 C 标准库 string 类等。 知识点 认识类与对象内联函数string 类类的定义与实例化 认识类与对象 官方定义 类&#xff1a;在面向对象编程中是一种…

小白学习java理解栈手写栈——第四关(青铜挑战)

内容1.理解栈的基本特征2.理解如何使用数组来构造栈3.理解如何使用链表来构造栈 1.栈的基础知识 1.1栈的特征 栈和队列是比较特殊的线性表&#xff0c;又称为访问受限的线性表。栈是很多表达式、符号等运算的基础&#xff0c;也是递归的底层实现&#xff0c;理论上递归能做的…

vim常见操作

vim常见操作 文章目录 vim常见操作1. 回退/前进2. 搜索3. 删除4. 定位到50行5. 显示行号6. 复制粘贴7. 剪贴8. 替换9. vim打开文件的时候出现 1. 回退/前进 1.esc进入命令模式 2.ctrlr 前进 u 回退2. 搜索 1&#xff09; esc进入命令模式 2&#xff09; /text  查找text&am…

JavaScript如何实现按键音效、视频播放,标签分类切换横向滚动

1.使用HTML5的audio标签 &#xff08;音频播放&#xff09; <audio id"click-sound"><source src"audio/show.mp3" type"audio/mpeg"> </audio> <button id"button">按钮</button> var clickSound d…

Linux_vi/vim编辑器

3.VI 与 VIM 3.1概述 vi编辑器&#xff1a;是Linux和Unix上最基本的文本编辑器&#xff0c;工作在字符模式下。由于不需要图形界面&#xff0c;vi是效率很高的文本编辑器。 vim是&#xff1a;vi的增强版&#xff0c;比vi更容易使用。vi的命令几乎全部都可以在vim上使用。 3…

QT----自定义信号和槽

第二天 2.1自定义信号和槽 新建一个Qtclass 自定义信号&#xff1a;返回值是void &#xff0c;只需要声明&#xff0c;不需要实现&#xff0c;可以有参数&#xff0c;可以重载 自定义槽&#xff1a;返回值void &#xff0c;需要声明&#xff0c;也需要实现&#xff0c;可以有…

华为OD机试 - 攀登者1(Java JS Python C)

题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如:[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图,地图中有两个山脉位置分别为 1,2,3,4,5…