运维05:自动化

人工运维时代

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

自动化运维时代

早期运维人员会结合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 /myshcd /myshtouch ssh_key_send.shvim 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
dosshpass -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
hostname2.授权
[root@master01 myscripts]# chmod +x /myscripts/local_hostname.sh

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

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

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

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

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

相关文章

Java基础——对象类型转换(向上、向下转型)

非继承关系的类之间对象类型不可以互相类型转换&#xff0c;只有继承关系才可以互相转换。 简单说&#xff0c;对象类型转换的前提要是继承关系。 对象类型转换分为&#xff1a;向上转型和向下转型。多态就是一种自动向上转型。 向上转型&#xff1a;子类对象用父类类型接收…

Leetcode 2963. Count the Number of Good Partitions

Leetcode 2963. Count the Number of Good Partitions 1. 解题思路2. 代码实现 题目链接&#xff1a;2963. Count the Number of Good Partitions 1. 解题思路 这一题根据题意&#xff0c;显然我们可以将其先分为 n n n个原子partition&#xff0c;确保任意两个partition之间…

git 常用的使用方法

1.查看分支 $ git branch #查看本地分支 $ git branch -r #查看远程分支 $ git branch -a #查看所有分支 $ git branch -vv #查看本地分支及追踪的分支 2.创建分支 方法1 $ git branch 分支名 #创建本地分支 #将本地分支push&#xff0c;就创建了远程分支方法2 #创建本地分…

载入了名字空间‘htmltools’ 0.5.6,但需要的是>= 0.5.7解决方案

解决方案&#xff1a;删除之前的旧版本安装包&#xff0c;安装新的包 1.卸载之前的安装包 2.关闭R&#xff0c;重新打开 3. # install.packages("htmltools") library(htmltools)

Java 并发编程(一)

1、在 java 中守护线程和本地线程区别&#xff1f; java 中的线程分为两种&#xff1a;守护线程&#xff08;Daemon&#xff09;和用户线程&#xff08;User&#xff09; 任何线程都可以设置为守护线程和用户线程&#xff0c;通过方法 Thread.setDaemon(boolon)&#xff1b;tru…

HarmonyOS学习--了解基本工程目录

1.工程级目录 工程的目录结构如下&#xff1a; 其中详细如下&#xff1a; AppScope中存放应用全局所需要的资源文件。entry是应用的主模块&#xff0c;存放HarmonyOS应用的代码、资源等。oh_modules是工程的依赖包&#xff0c;存放工程依赖的源文件。build-profile.json5是工…

如何找到MACOS系统更新的安装包

首先在应用商店中下载新系统的安装包&#xff0c;然后在设置中不要点安装&#xff0c;会自动跳出安装的界面&#xff0c;不要关闭界面&#xff0c;打开命令行用root权限输入命令cat /var/log/install.log | grep *.dmg&#xff0c; 就会显示 sh-3.2# cat /var/log/install.log …

算法基础十

加一 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 示例 1&#xff1a; 输入&#xff1a;digits [1,2,3] 输出&#xff1a;[1,2,4] 解释&#xff1a;输入数组表…

YOLO_embedded: YOLO算法快速嵌入式部署

YOLO_embedded&#xff1a; YOLO算法快速嵌入式部署 for UbuntuBased on YOLOXOpenVINO & TensorRT 本项目提供c和python两种语言&#xff0c;详情请见各个文件夹下的README.md 安装OpenVINO 点此进入官网选择版本进行下载&#xff0c;然后打开install_openvino.sh将相…

ORACLE 19c 统一恢复处于ASM中的CDB含PDB数据文件到某一个文件目录下面

NOCDB情况下&#xff0c;要把ASM中的文件恢复到文件系统&#xff0c;大家都知道分别设置每个文件的路径即可&#xff0c;但如果是租户环境&#xff0c;每个PDB都有不同路径&#xff0c;而且每个PDB都有SYSTEM&#xff0c;SYSAUX等一些表空降&#xff0c;不可能放在同一个目录中…

Linux_CentOS_7.9 VNC安装卸载以及相关配置开机自启动服务简易记录

VNC安装卸载以及相关配置开机自启动服务&#xff1a; 查看环境&#xff1a;&#xff08;yum镜像源配置可以参考我之前文章里面有详细参考http://t.csdnimg.cn/mzGoI&#xff09; [rootorcl238 ~]# rpm -qa | grep vnc ##查看系统现有VNC软件版本 gtk-vnc2-0.7.0-3.el7.x86…

道可云元宇宙每日资讯|青岛市元宇宙领域新产品推介暨产学研对接会举行

道可云元宇宙每日简报&#xff08;2023年12月7日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 青岛市元宇宙领域新产品推介暨产学研对接会举行 为加快推动青岛市元宇宙技术和产业创新&#xff0c;引领下一代互联网发展&#xff0c;青岛市元宇宙领域新产品推介暨…

算法基础九

螺旋矩阵2 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 示例 2&#xff1a; 输入&#xff1a;n …

第12节: Vue3 修饰符

如何在UniApp中使用Vue3框架使用修饰符&#xff1a; <template> <view> <button click"toggleVisibility ^ :disabledisDisabled">点击切换显示状态</button> <text>{{ isVisible ? 显示 : 隐藏 }}</text> </view> …

简易加减运算器的制作----数字电路设计(含proteus仿真)

简易加减运算器的制作 一、功能要求—基本功能 1、自制0-9按键&#xff0c;在一个LED数码管上稳定地显示当前按下的值。&#xff08;基本功能&#xff09; 2、增加、两个按键&#xff0c;实现0-9两个一位数的加法运算&#xff0c;同时在两位LED上稳定地显示运算结果。&#…

React中每次渲染都会传入一个新的props.children到子组件?

传入props.children后, 为什么会导致组件的重新渲染&#xff1f; 问题描述 在 react 中, 我想要对组件的渲染进行优化, 遇到了一个非常意思的问题, 当我向一个组件中传入了 props.children 之后, 每次父组件重新渲染都会导致这个组件的重新渲染; 它看起来的表现就像是被memo包…

MTU与MSS

MTU&#xff1a;一个网络包的最大长度&#xff0c;以太网中一般为1500各字节。 MSS&#xff1a;除去头部之后&#xff0c;一个网络包所能容纳的TCP数据的最大长度。 应用程序调用write后&#xff0c;将要发送的数据被交给TCP/IP协议栈进行。 协议栈不关心应用的数据内容&…

四:爬虫-Cookie与Session实战

四&#xff1a;Cookie与Session实战 ​ 在浏览网站的过程中&#xff0c;我们经常会遇到需要登录的情况&#xff0c;有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站&#xff0c;但是有时候过一段时间就需要重新登录。还有一些网站&#xff0c;在打开浏览器…

c语言归并排序(详解)

归并排序是一种分治算法&#xff0c;它将列表分割成较小的子列表&#xff0c;然后递归地对子列表进行排序&#xff0c;最后将这些子列表合并以产生已排序的列表。基本概念包括&#xff1a; 分割&#xff1a;将列表分割成较小的子列表&#xff0c;直到子列表的长度为1或0。排序…

Leetcode—219.存在重复元素II【简单】

2023每日刷题&#xff08;五十三&#xff09; Leetcode—219.存在重复元素II 实现代码 class Solution { public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int, int> m;int n nums.size();for(int i 0; i < n; i) {if(m…