云端自动化运维学习笔记
云端自动化运维
文章目录
- **云端自动化运维**
- 一、云端自动化运维的基础
- 1.1云端自动化运维的概述
- 1.1.1自动化运维势在必行
- 1.1.2什么是成熟的自动化运维平台
- 1.2Python环境的搭建
- 1.2.1Windows系统下Python环境的搭建
- 1.2.2Linux系统下Python安装
- 1.3开发工具介绍
- 1.3.1Pycharm
- 1.3.2Vim
- 1.4Python的基础语法
- 1.4.1 数字运算
- 1.4.2字符串
- 1.4.3列表与元组
- 1.4.4字典
- 1.4.5集合
- 1.4.6函数
- 1.4.7条件控制与循环语句
- 二、基础运维
- 2.1os和shutil
- 2.2python处理文本文件
- 2.2.1简单的将文件读取到字符串中
- 2.2.2按行读取整个⽂件
- 2.2.3简单的将字符串写⼊txt中
- 2.2.4with...as...语法
- 三、subprocess
- 3.1目录
- 3.2简介
- 3.3旧模块的使用
- 3.3.1os.system()
- 3.3.2 os.popen()
- 3.4 subprocess模块
- 3.4.1 subprocess.run()
- 3.4.2 subprocess.call()
- 3.4.3 subprocess.check_call()
- 3.4.4 subprocess.getstatusoutput()
- 3.4.5 subprocess.getoutput()
- 3.4.6 subprocess.check_output()
- 3.5 subprocess.Popen()
- 3.5.1 stdout
- 3.5.2 stderr
- 3.5.3 poll()
- 3.5.4 wait()
- 3.5.5 terminate()
- 3.5.6 pid
- 四、paramiko
- 4.1 paramiko介绍
- 4.2 paramiko安装
- 4.3 实现远程SSH运⾏命令
- 4.4 paramiko的核⼼组件
- 4.4.1 SSHClient类
- 4.4.2 SSHClient常⽤的⽅法介绍
- 4.4.3 SFTPClient类
- 4.4.4 SFTPClient类常⽤⽅法
- 4.5采用SSHClient类实现远程SSH运行命令
- 4.6SFTPClient类应⽤
- 4.6.1文件的上传
- 4.6.2文件的下载
- 五、Git
- 5.1安装Sourcetree
- 5.2创建远程仓库
- 六、Linux下安装配置jdk、tomcat
- 6.1在官网下载需要安装的jdk和tomcat
- 6.2解压
- 6.3配置java环境变量
- 6.4查看是否安装成功
- 6.5启动tomcat
- 6.6关闭tomcat
- 七、Docker
- 7.1docker的安装
- 7.1.1更新软件包
- 7.1.2关闭防火墙
- 7.1.3安装iptables
- 7.1.4保存防火墙规则
- 7.1.5下载docker软件包
- 7.1.6安装并启动
- 7.2docker加速配置
- 7.3docker容器管理
- 7.3.1docker中三个重要概念
- 7.3.2docker指令与命令
- 7.3.2.1docker指令基础用法
- 7.3.2.2docker常用命令
- 7.3.3容器管理命令
- 7.3.4docker -run常用参数
- 7.4wordpress博客安装
- 7.5docker镜像
- 7.5.1镜像的特性
- 7.5.2容器转换为镜像
- 7.5.3Dockerfile
- 7.5.4自己做一个docker镜像
- 八、ansible
- 8.1ansible简介
- 8.2架构和工作原理
- 8.3ansible安装和配置及命令
一、云端自动化运维的基础
1.1云端自动化运维的概述
运维技术不成熟早期,通过⼿⼯执⾏命令管理硬件、软件资源,运维⼈员需要执⾏⼤量的重复命令完成
⽇常运维⼯作。让⼯具或系统替代⼈⼯来⾃动完成具体的运维⼯作,提⾼效率降低运维成本执在必⾏。
1.1.1自动化运维势在必行
1.⼿⼯运维缺点多
2. 传统⼈⼯运维难以管理⼤量的软、硬件资源
3. 业务需要的频繁变量
4. ⾃动化运维的技术已经成熟
5. ⼯具已经到位
1.1.2什么是成熟的自动化运维平台
1.需要有⽀持混合云的配置管理数据库
2. 有完备的监控和应⽤性能分析系统
3. 需要具备批量运维⼯具
4. 需要有⽇志分析⼯具
5. 需要有持续集成和版本控制⼯具
6. 还要有漏洞扫描⼯具
1.2Python环境的搭建
1.2.1Windows系统下Python环境的搭建
- 首先访问https://www.python.org/downloads/下载python
安装下载包:python-3.9.4-amd64.exe
为计算机添加安装⽬录搭到环境变量,如图把python的安装⽬录添加到pth系统变量中即可
测试python安装是否成功,cmd打开命令⾏输⼊ python 命令
1.2.2Linux系统下Python安装
下载安装包
[root@canoe opt]# wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz
解压
[root@canoe opt]# tar xf Python-3.9.2.tgz
将解压后的文件迁移至/usr/local
[root@canoe opt]# mv Python-3.9.2 /usr/local
进入python目录
[root@canoe opt]# cd /usr/local/Python-3.9.2/ [root@canoe Python-3.9.2]#
执行配置文件
[root@canoe Python-3.9.2]# ./configure
安装gcc++
[root@canoe Python-3.9.2]# yum install gcc gcc-c++
编译安装
[root@canoe Python-3.9.2]# make [root@canoe Python-3.9.2]# make install
在/usr/bin路径下生成python3的软链接
[root@canoe local]# ln -s /usr/local/Python-3.9.2/python /usr/bin/python3
测试进入
[root@canoe bin]# python3 Python 3.9.2 (default, Mar 3 2021, 13:36:26) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux Type "help", "copyright", "credits" or "license" for more information. >>>
1.3开发工具介绍
1.3.1Pycharm
去官网下载https://www.jetbrains.com/pycharm/download/#section=windows
双击安装包,按照next一直进行下去,直至安装完成。
1.3.2Vim
安装
[root@canoe ~]# sudo yum install vim
1.4Python的基础语法
1.4.1 数字运算
>>> 2 + 2 4 >>> 50 - 5 * 6 #先乘除后加减 20 >>> (50 - 5 * 6) / 4 #()运算符优先级最⼤ 5.0 >>> 8 / 5 #相除结果不会取整 1.6 >>> 19 / 3 6.333333333333333 >>> 19 // 3 #整数除法返回向下取整后的结果 6 >>> 17 % 3 #求余 2 >>> 5 * 3 + 2.0 17.0 >>> 5 ** 2 #5的平⽅ 25 >>> 2 ** 7 #2的7次⽅ 128 >>>
Python数据类型的转换:
int(x)将x转换成⼀个整数
float(x)将x转换成浮点数
complex(x)将x转换为⼀个复数,实数为x虚数为0
complex(x, y)将x和y转换为复数,x为实数部,y为虚数部
常用的数学函数
1.4.2字符串
认识字符串
>>> 'abc' 'abc' >>> "abc" 'abc' #专⽤明带特殊字符的字符串 >>> 'a\'b\'c' #通过\的⽅式 "a'b'c" >>> "a'b'c" #通过双引号的⽅式 "a'b'c"
字符串索引
>>> s="abcdefg" >>> s[0] 'a' >>> s[1] 'b' >>> s[:] 'abcdefg' >>> s[2:3] 'c' >>> s[2:] 'cdefg' >>> s[-1] 'g' >>> s[-2:] 'fg' >>> s[0]='f'
字符串的遍历
>>> s = "abcd" >>> for i, a in enumerate(s): #采用enumerate()的方式进行遍历 ... print(i,a) ... 0 a 1 b 2 c 3 d >>> for a in s: #直接进行遍历字符串 ... print(a) ... a b c d >>>for i in range(len(s)): #采用range()函数里面放置字符串的长度,使用len()函数获取 ... print(i, s[i]) ... 0 a 1 b 2 c 3 d
字符串的格式化
与C语言的字符串的格式化类似
不同的类型采用不同的格式进行输出,python也可采用{}进行控制参数类型的输出
>>> print("我叫%s今年%d岁!" %('⼩明', 10)) 我叫⼩明今年10岁! >>> "我叫%s今年%d岁!" %('⼩明', 10) '我叫⼩明今年10岁!' >>> print("我叫{}今年{}岁!".format('⼩明', 10)) 我叫⼩明今年10岁! >>> print("我叫{0}今年{1}岁!".format('⼩明', 10)) 我叫⼩明今年10岁!
字符串的内建函数
1.4.3列表与元组
可以通过索引修改列表中的元素
不能对元组中的元素进⾏修改
>>> li = [1, 1, 2, 2, 3] #列表中可以包含重复元素
>>> li
[1, 1, 2, 2, 3]
>>> li = ['a', 1, 1] #列表中元素类型可以不⼀样
>>> li
['a', 1, 1]
>>> li[0] = 'b' #可以通过索引修改列表中的元素
>>> li
['b', 1, 1]
>>> tup = (1, 1, 2, 2, 3) #元组中的元素可以重复
>>> tup
(1, 1, 2, 2, 3)
>>>
>>> tup = ('a', 1, 1) #元组中的元素类型可以不同
>>> tup
('a', 1, 1)
>>> tup[0] = 'b' #不能对元组中的元素进⾏修改
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
1.4.4字典
>>> zs = {'name': 'zs', 'age': 15} #定义字典
>>> zs
{'name': 'zs', 'age': 15}
>>>
>>> zs['sex'] = '男' #添加值
>>> zs
{'name': 'zs', 'age': 15, 'sex': '男'}
>>>
>>> zs['name'] = 'ls' #对值进⾏修改
>>> zs
{'name': 'ls', 'age': 15, 'sex': '男'}
1.4.5集合
>>> s = {1, 1, 2, 3, 4}
>>> s
{1, 2, 3, 4}
1.4.6函数
>>> def hello():
... print("hello world")
>>> hello()
hello world
1.4.7条件控制与循环语句
条件控制
score = input("请输⼊分数:") score = int(score) if score < 0 or score > 100:print("错误") elif score >= 90:print("优") elif score >=80 :print("良") elif score >= 70:print("中") elif score >= 60:print("及格") else:print("不及格")
循环语句
continue终止当前循环
>>> for i in range(10): ... print(i, end='\t') 0 1 2 3 4 5 6 7 8 9 >>> for i in range(10): #continue会终⽌当次循环 ... if i == 5: ... continue ... print(i, end='\t') 0 1 2 3 4 6 7 8 9
break会终止循环
>>> for i in range(10): #break会终⽌循环 ... if i == 5: ... break ... print(i, end='\t') 0 1 2 3 4
二、基础运维
2.1os和shutil
得到当前工作目录
>>> import os >>> os.getcwd() '/root' >>>
返回指定⽬录下的所有⽂件和⽬录名
>>> os.listdir('/usr/local/bin') ['pip', '2to3-3.9', 'pydoc3', 'pip3', 'python3-config', 'python3.9-config', 'python3.9', 'idle3.9', 'python3', 'pydoc3.9', 'idle3', 'pip3.9', 'easy_install-3.9', '2to3'] >>>
删除⼀个⽂件
>>> os.remove('/usr/local/bin/hello.py') >>>
删除多个⽬录
>>> os.removedirs('/usr/local/bin/hello') >>>
检验给出的路径是否是⼀个⽂件
>>> os.path.isfile('/usr/local/bin/hello.txt') True >>>
检验给出的路径是否是⼀个⽬录
>>> os.path.isdir('/usr/local/bin/hello.txt') False >>>
判断是否是绝对路径
>>> os.path.isabs('/usr/local/bin/hello.txt') True >>>
检验给出的路径是否真实存在
>>> os.path.exists('/usr/local/bin/hello.txt') True >>>
返回⼀个路径的⽬录名和⽂件名
>>> os.path.split('/usr/local/bin/hello.txt') ('/usr/local/bin', 'hello.txt') >>>
分离扩展名
>>> os.path.splitext("hello.txt") ('hello', '.txt') >>>
获取路径名
>>> os.path.dirname('/usr/local/bin/hello.txt') '/usr/local/bin' >>>
运⾏shell命令
>>> os.system("touch /usr/local/bin/hello1.txt") 0 >>>
重命名
>>> os.rename('hello1.txt','hello2.txt') >>>
创建多集⽬录
>>> os.makedirs("/hello/hello.txt") >>>
创建单个⽬录
>>> os.mkdir("test") >>>
获取⽂件属性
>>> os.stat('hello.txt') os.stat_result(st_mode=33188, st_ino=154259, st_dev=64769, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1617787778, st_mtime=1617787778, st_ctime=1617787778) >>>
获取⽂件⼤⼩
>>> os.path.getsize('hello.txt') 0 >>>
终⽌当前进程
>>> os.exit()
创建空⽂件
>>> os.mknod("test.txt") >>>
复制文件
>>> import shutil >>> shutil.copyfile("hello.txt","hello3.txt") 'hello3.txt' >>> shutil.copy("hello.txt","test") 'test/hello.txt' >>>
复制文件夹
>>> shutil.copytree("test","test2") 'test2' >>>
重命名⽂件(⽬录)
>>> os.rename("test","test1") >>>
移动⽂件(⽬录)
>>> shutil.move("hello.txt","test3") 'test3' >>>
2.2python处理文本文件
2.2.1简单的将文件读取到字符串中
>>> f = open("/usr/local/bin/hello.txt","r") >>> str = f.read() >>> f.close() >>> print(str) helsiisjfsfifjsfjis>>>
2.2.2按行读取整个⽂件
>>> f = open("/usr/local/bin/hello.txt","r") >>> lines = f.readlines() >>> for line in lines: ... print(line,end=" ") ... helsiisjfsfifjsfjisjisfsjisjinnsifnsis>>> f.close() >>>
2.2.3简单的将字符串写⼊txt中
>>> with open('hello.txt', 'w') as f:
... f.write("大家好")
...
3
>>> open("/usr/local/bin/hello.txt","r").read()
'大家好'
2.2.4with…as…语法
- 会先执行__enter__方法,并返回一个对象
- 执⾏完毕后会调⽤__exit__⽅法
class Test:def __enter__(self):print('enter method executing')return selfdef __exit__(self, type, value, traceback):print('exit method executing')def sayHello(self):print('hello world')with Test() as test: #会执⾏__enter__⽅法并返回Test对象
test.sayHello()
#执⾏完毕后会调⽤__exit__⽅法
三、subprocess
3.1目录
旧模块的使用
- os.system()
- os.popen()
subprocess模块
- subprocess.run()
- subprocess.call()
- subprocess.check_call()
- subprocess.getstatusoutput()
- subprocess.getoutput()
- subprocess.check_output()
subprocess.Popen()
- stdout
- stderr
poll()- wait()
- terminate()
- pid
3.2简介
subprocess最早在2.4版本引⼊。⽤来⽣成⼦进程,并可以通过管道连接他们的输⼊/输出/错误,以及获得
他们的返回值。
subprocess⽤来替换多个旧模块和函数:
- os.system
- os.spawn*
- os.popen*
- popen2.*
commands.*运⾏python的时候,我们都是在创建并运⾏⼀个进程,linux中⼀个进程可以fork⼀个⼦进程,并让这个⼦
进程exec另外⼀个程序。在python中,我们通过标准库中的subprocess包来fork⼀个⼦进程,并且运⾏⼀
个外部的程序。subprocess包中定义有数个创建⼦进程的函数,这些函数分别以不同的⽅式创建⼦进程,所
以我们可以根据需要来从中选取⼀个使⽤。另外subprocess还提供了⼀些管理标准流(standard stream)和
管道(pipe)的⼯具,从⽽在进程间使⽤⽂本通信。
3.3旧模块的使用
3.3.1os.system()
执⾏操作系统的命令,将结果输出到屏幕,只返回命令执⾏状态(0:成功,⾮ 0 : 失败)
>>> import os
>>> os.system('df -Th')
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 990M 0 990M 0% /dev
tmpfs tmpfs 1000M 0 1000M 0% /dev/shm
tmpfs tmpfs 1000M 1008K 999M 1% /run
tmpfs tmpfs 1000M 0 1000M 0% /sys/fs/cgroup
/dev/vda1 ext4 40G 7.2G 31G 20% /
overlay overlay 40G 7.2G 31G 20% /var/lib/docker/overlay2/8af005e938f71d7fe40e70ef2e0557688cc54880b71bd3b0bab2472971492427/merged
overlay overlay 40G 7.2G 31G 20% /var/lib/docker/overlay2/1c50d87e3af800afe89dbc4fbf57ebe75ad68a68bbec46f05ccf6ed24fda2a95/merged
overlay overlay 40G 7.2G 31G 20% /var/lib/docker/overlay2/1e5b4cbaedc146648b3de7f8a9fba3acd68a93a5a5bc675286aa150333d52c9a/merged
overlay overlay 40G 7.2G 31G 20% /var/lib/docker/overlay2/1bae9d89d5a26ab8a54a8d7cf0f25dca0f6117ee27ac3c4d09d8b97e52671eb0/merged
overlay overlay 40G 7.2G 31G 20% /var/lib/docker/overlay2/0b249a8003ebe413c1886c422099daf638ce99a7ca96230edc3b59f9c0554a1e/merged
tmpfs tmpfs 200M 0 200M 0% /run/user/0
0
>>>
3.3.2 os.popen()
执⾏操作系统的命令,会将结果保存在内存当中,可以⽤read() ⽅法读取出来
>>> import os
>>> res = os.popen("ls -l")
>>> print(res)
<os._wrap_close object at 0x7f755460f3d0>
>>> print(res.read())
total 80
drwxr-xr-x 9 root root 4096 Mar 22 08:56 apache-tomcat-7.0.100
drwxr-xr-x 2 root root 4096 Mar 17 08:39 docker
-rw-r--r-- 1 root root 12964 Mar 17 09:40 index.html
drwxr-xr-x 8 10143 10143 4096 Dec 9 20:50 jdk1.8.0_281
-rw-r--r-- 1 root root 25548 Apr 7 2017 mysql57-community-release-el7-10.noarch.rpm
-rw-r--r-- 1 root root 6140 Nov 12 2015 mysql-community-release-el7-5.noarch.rpm
drwxr-xr-x 2 root root 4096 Mar 24 11:38 test
drwxr-xr-x 2 root root 4096 Mar 24 11:51 test_1
drwxr-xr-x 2 root root 4096 Mar 22 09:54 tomcat
drwxr-xr-x 2 root root 4096 Mar 24 10:36 tomcat1>>>
3.4 subprocess模块
3.4.1 subprocess.run()
>>> import subprocess as sub
>>> sub.run(["df","-Th"])
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 990M 0 990M 0% /dev
tmpfs tmpfs 1000M 0 1000M 0% /dev/shm
tmpfs tmpfs 1000M 1008K 999M 1% /run
tmpfs tmpfs 1000M 0 1000M 0% /sys/fs/cgroup
/dev/vda1 ext4 40G 7.2G 31G 20% /
overlay overlay 40G 7.2G 31G 20% /var/lib/docker/overlay2/8af005e938f71d7fe40e70ef2e0557688cc54880b71bd3b0bab2472971492427/merged
overlay overlay 40G 7.2G 31G 20% /var/lib/docker/overlay2/1c50d87e3af800afe89dbc4fbf57ebe75ad68a68bbec46f05ccf6ed24fda2a95/merged
overlay overlay 40G 7.2G 31G 20% /var/lib/docker/overlay2/1e5b4cbaedc146648b3de7f8a9fba3acd68a93a5a5bc675286aa150333d52c9a/merged
overlay overlay 40G 7.2G 31G 20% /var/lib/docker/overlay2/1bae9d89d5a26ab8a54a8d7cf0f25dca0f6117ee27ac3c4d09d8b97e52671eb0/merged
overlay overlay 40G 7.2G 31G 20% /var/lib/docker/overlay2/0b249a8003ebe413c1886c422099daf638ce99a7ca96230edc3b59f9c0554a1e/merged
tmpfs tmpfs 200M 0 200M 0% /run/user/0
CompletedProcess(args=['df', '-Th'], returncode=0)
>>>
3.4.2 subprocess.call()
执⾏命令,返回命令的结果和执⾏状态,0或者⾮0
>>> res = subprocess.call(["ls","-l"])
total 80
drwxr-xr-x 9 root root 4096 Mar 22 08:56 apache-tomcat-7.0.100
drwxr-xr-x 2 root root 4096 Mar 17 08:39 docker
-rw-r--r-- 1 root root 12964 Mar 17 09:40 index.html
drwxr-xr-x 8 10143 10143 4096 Dec 9 20:50 jdk1.8.0_281
-rw-r--r-- 1 root root 25548 Apr 7 2017 mysql57-community-release-el7-10.noarch.rpm
-rw-r--r-- 1 root root 6140 Nov 12 2015 mysql-community-release-el7-5.noarch.rpm
drwxr-xr-x 2 root root 4096 Mar 24 11:38 test
drwxr-xr-x 2 root root 4096 Mar 24 11:51 test_1
drwxr-xr-x 2 root root 4096 Mar 22 09:54 tomcat
drwxr-xr-x 2 root root 4096 Mar 24 10:36 tomcat1
>>> res
0
>>>
3.4.3 subprocess.check_call()
执⾏命令,返回结果和状态,正常为0 ,执⾏错误则抛出异常
3.4.4 subprocess.getstatusoutput()
接受字符串形式的命令,返回 ⼀个元组形式的结果,第⼀个元素是命令执⾏状态,第⼆个为执⾏结果
3.4.5 subprocess.getoutput()
接受字符串形式的命令,放回执⾏结果
3.4.6 subprocess.check_output()
执⾏命令,返回执⾏的结果,⽽不是打印
3.5 subprocess.Popen()
3.5.1 stdout
3.5.2 stderr
3.5.3 poll()
3.5.4 wait()
3.5.5 terminate()
3.5.6 pid
四、paramiko
4.1 paramiko介绍
paramiko是基于Python实现的SSH2远程安全连接,⽀持认证及密钥⽅式。可以实现远程命令执⾏、⽂件传
输、中间SSH代理等功能,相对于Pexpect,封装的层次更⾼,更贴近SSH协议的功能
官⽹地址:http://www.paramiko.org/installing.html
http://docs.paramiko.org/en/2.4/
https://pypi.org/project/paramiko/
4.2 paramiko安装
[root@canoe ~]# pip3 install paramiko
4.3 实现远程SSH运⾏命令
import paramiko hostname = '' //linux服务器的ip地址 username = 'root' password = '**********' //root账户的密码 paramiko.util.log_to_file('syslogin.log') #发送paramiko⽇志到syslogin.log⽂件 ssh = paramiko.SSHClient() #创建⼀个SSH客户端client对象 ssh.load_system_host_keys() #获取客户端host_keys,默认~/.ssh/known_hosts,⾮默 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=hostname,username=username,password=password) #创建SSH连接 stdin,stdout,stderr = ssh.exec_command('ls /') #调⽤远程执⾏命令⽅法 print(stdout.read().decode('utf-8')) #打印命令执⾏结果,得到Python列表形式,可以 ssh.close()
-
4.4 paramiko的核⼼组件
paramiko包含两个核⼼组件,⼀个为SSHClient类,另⼀个为SFTPClient类。
4.4.1 SSHClient类
SSHClient类是SSH服务会话的⾼级表示,该类封装了传输(transport)、通道(channel)及SFTPClient的校
验、建⽴的⽅法,通常⽤于执⾏远程命令。
client = SSHClient()
client.load_system_host_keys()
client.connect('ssh.example.com')
stdin, stdout,stderr = client.exec_command('ls -l')
4.4.2 SSHClient常⽤的⽅法介绍
- connect⽅法
- conect⽅法实现了远程SSH连接并校验
- exec_command
- 远程命令执⾏⽅法,该命令的输⼊与输出流为标准输⼊(stdin)、输出(stdout)、错误(stderr)的Python⽂件对
像。
- 远程命令执⾏⽅法,该命令的输⼊与输出流为标准输⼊(stdin)、输出(stdout)、错误(stderr)的Python⽂件对
- load_system_host_keys
- 加载本地公钥校验⽂件,默认为~/.ssh/known_host,⾮默认路径需要⼿⼯指定
- set_missing_host_policy
4.4.3 SFTPClient类
SFTPClient作为⼀个SFTP客户端对象,根据SSH传输协议的sftp会话,实现远程⽂件操作,⽐如⽂件上传、
下载、权限、状态等操作。
4.4.4 SFTPClient类常⽤⽅法
- from_transport
- 创建⼀个已连通的SFTP客户端通道。
- put
- 上传本地⽂件到远程SFTP服务端
- get
- 从远程SFTP服务端下载⽂件到本地。
4.5采用SSHClient类实现远程SSH运行命令
import paramiko # 实例化SSHClient client = paramiko.SSHClient() # ⾃动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts⽂件中记录的主机 client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接SSH服务端,以⽤户名和密码进⾏认证 client.connect(hostname='', port=22, username='root', password='*********') # 打开⼀个Channel并执⾏命令 stdin, stdout, stderr = client.exec_command('ls -al /') # stdout 为正确输出,stderr # 打印执⾏结果 print(stdout.read().decode('utf-8')) # 关闭SSHClient client.close()
4.6SFTPClient类应⽤
4.6.1文件的上传
import paramiko transport = paramiko.Transport(("", 22)) transport.connect(username='root', password='**********') sftp = paramiko.SFTPClient.from_transport(transport) sftp.put('C:\\Users\\canoe\\Desktop\\taobao.zip', '/opt/tamp/taobao.zip') sftp.close()
4.6.2文件的下载
import paramiko transport = paramiko.Transport(("", 22)) transport.connect(username='root', password='*********') sftp = paramiko.SFTPClient.from_transport(transport) sftp.get('/opt/tamp/taobao.zip', 'C:\\Users\\canoe\\Desktop\\taobao.zip') sftp.close()
五、Git
5.1安装Sourcetree
下载地址:https://www.sourcetreeapp.com/
双击下载的.exe文件,进行安装
5.2创建远程仓库
登录www.gitee.com创建一个仓库
通过创建的仓库生成的HTTP/SSH链接,在本地远程访问仓库,进行拉取,提交推送
使用sourcetree克隆远程仓库
创建一个文件并提交
推送本地仓库到远程仓库里面去
查看远程仓库
六、Linux下安装配置jdk、tomcat
6.1在官网下载需要安装的jdk和tomcat
- jdk下载:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html
- tomcat下载:https://tomcat.apache.org/download-10.cgi
6.2解压
tar -zxvf 包
6.3配置java环境变量
- 编辑/etc/profile文件
6.4查看是否安装成功
[root@canoe ~]# java -version
java version "1.8.0_281"
Java(TM) SE Runtime Environment (build 1.8.0_281-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.281-b09, mixed mode)
[root@canoe ~]#
6.5启动tomcat
[root@canoe bin]# ./startup.sh
Using CATALINA_BASE: /root/tomcat10
Using CATALINA_HOME: /root/tomcat10
Using CATALINA_TMPDIR: /root/tomcat10/temp
Using JRE_HOME: /root/jdk1.8.0_281
Using CLASSPATH: /root/tomcat10/bin/bootstrap.jar:/root/tomcat10/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
6.6关闭tomcat
[root@canoe bin]# ./shutdown.sh
Using CATALINA_BASE: /root/tomcat10
Using CATALINA_HOME: /root/tomcat10
Using CATALINA_TMPDIR: /root/tomcat10/temp
Using JRE_HOME: /root/jdk1.8.0_281
Using CLASSPATH: /root/tomcat10/bin/bootstrap.jar:/root/tomcat10/bin/tomcat-juli.jar
Using CATALINA_OPTS:
[root@canoe bin]#
七、Docker
7.1docker的安装
7.1.1更新软件包
[root@canoe ~]# yum update
7.1.2关闭防火墙
[root@canoe ~]# systemctl stop firewalld #关闭防火墙 [root@canoe ~]# systemctl disable firewalld #默认开机不启动防火墙
7.1.3安装iptables
[root@canoe ~]# yum install -y iptables-services #安装iptables [root@canoe ~]# systemctl start iptables #启动iptables [root@canoe ~]# systemctl enable iptables #开机启动iptables [root@canoe ~]# iptables -F #清空iptables设置规则
7.1.4保存防火墙规则
[root@canoe ~]# service iptables save
7.1.5下载docker软件包
下载地址:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
需要下载的软件包
- docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
- docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
创建一个docker目录,将上述下载的文件赋值过去
[root@canoe ~]# mkdir ~/docker
复制下载的文件到此目录
7.1.6安装并启动
[root@canoe docker]# yum -y install * #安装
[root@canoe docker]# systemctl start docker #启动
[root@canoe docker]# systemctl enable docker #设置开机启动
[root@canoe docker]# docker run hello-world #测试是否安装成功:
7.2docker加速配置
将docker配置国内的阿里云的镜像上,以便于后期进行下载与访问速度快
在/etc/下新建一个docker目录
[root@canoe ~]# mkdir -p /etc/docker
新建一个daemon.json文件
[root@canoe docker]# sudo tee /etc/docker/daemon.json <<-'EOF' > {> "registry-mirrors": ["https://jvxivkc1.mirror.aliyuncs.com"] > } > EOF {"registry-mirrors": ["https://jvxivkc1.mirror.aliyuncs.com"] }[root@canoe docker]# sudo systemctl daemon-reload [root@canoe docker]# sudo systemctl restart docker
7.3docker容器管理
7.3.1docker中三个重要概念
- 仓库:保存镜像的地方
- 镜像:相当于安装的意思
- 容器:安装好,正在运行的软件
7.3.2docker指令与命令
7.3.2.1docker指令基础用法
- docker +命令关键字(COMMAND)+参数
7.3.2.2docker常用命令
- docker info 【显示 Docker 系统信息,包括镜像和容器数】
- docker search 【搜索镜像】
- docker pull 【下载镜像】
- docker images 【查看本地镜像信息】
- docker rmi 【删除本地镜像】
- docker ps 【docker中启动进程信息】
- docker run 【启动容器】
- docker start/stop 【启动/停止容器】
7.3.3容器管理命令
- 每一个容器被创建后,都会生成一个CONTAINER ID作为容器的唯一标志,对续对容器启动、停止、修改、删除等操作,都是通过CONTAINER ID来完成。
- docker start/stop CONTAINERID 【启动停止容器】
- docker start/stop MywordPress 【通过容器别名启动停止】
- docker inspect MywordPress 【查看容器所有信息】
- docker logs MywordPress 【查看容器日志】
- docker stats MywordPress 【查看容器占用的系统资源】
- docker exec 容器名 容器内执行的命令【容器执行命令】
- docker exec -it 容器名 /bin/bash 【交互式进入容器】
7.3.4docker -run常用参数
- –restart=always 【容器的自动启动】
- -h x.xx.xxx 【设置容器主机名】
- –dns xx.xx.xx.xx 【设置容器的DNS服务器】
- –dns-search 【DNS搜索设置】
- –add-host hostname:IP 注入hostname IP解析
- –rm 服务停止时自动删除
7.4wordpress博客安装
下载wordpress镜像
[root@canoe ~]# docker pull wordpress
下载mariadb镜像
[root@canoe ~]# docker pull mariadb
查看镜像
[root@canoe ~]# docker images
启动mariadb
[root@canoe ~]# docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb
启动wordpress
[root@canoe ~]# docker run --name MyWordPress2 --link db:mysql -p 8080:80 -d wordpress
查看docker中启动的进程
[root@canoe ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11e4919c8d9f wordpress "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->80/tcp MyWordPress2 c7a80f0f3528 mariadb "docker-entrypoint.s…" 3 hours ago Up 3 hours 3306/tcp db
访问wordpress
- 浏览器访问:http://106.13.30.87:8080/
2.
3.
4.
- 浏览器访问:http://106.13.30.87:8080/
7.5docker镜像
7.5.1镜像的特性
容器创建时需要指定镜像,每个镜像都由唯一的标示 Image ID ,和容器的 Container ID 一样,默认 128 位,可以使用前 16 为缩略形式,也可以使用镜像名与版本号两部分组合唯一标示,如果省略版本号,默认使用最新版本标签 ( latesr )
镜像的分层:Docker 的镜像通过联合文件系统 ( union filesystem ) 将各层文件系统叠加在一起
7.5.2容器转换为镜像
docker commit CID xx.xx.xx
转换命令
docker build -t wangyang/jdk-tomcat
7.5.3Dockerfile
- Dockerfile: Dockfile 是一种被 Docker 程序解释的脚本,Dockerfile 由一条一条的指令组成,每条指令对应Linux 下面的一条命令。Docker 程序将这些 Dockerfile 指令翻译真正的 Linux 命令。Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,类似于 Makefile。Docker 程序将读取 Dockerfile,根据指令生成定制的 image
- 语法:
7.5.4自己做一个docker镜像
新建一个目录
[root@canoe ~]# mkdir test [root@canoe ~]# cd test
新建一个Dockerfile文件与新建一个hello.txt
[root@canoe test]# touch Dockerfile [root@canoe test]# touch hello.txt
向Dockerfile文件写入
[root@canoe test]# vim Dockerfile
-
容器转为镜像
[root@canoe test]# docker build -t self_tomcat:V1.0 . Sending build context to Docker daemon 3.072kB Step 1/4 : FROM tomcat:latest---> 040bdb29ab37 Step 2/4 : MAINTAINER 指定作者的名字---> Using cache---> 7a4403b55301 Step 3/4 : RUN mkdir /usr/local/tomcat/webapps/test---> Using cache---> e29f8cbb4a99 Step 4/4 : ADD ./hello.txt /usr/local/tomcat/webapps/test---> 9b25feb11939 Successfully built 9b25feb11939 Successfully tagged self_tomcat:V1.0 [root@canoe test]#
启动镜像
[root@canoe test]# docker run --name tomcat_self1 -d -p 8080:8088 self_tomcat:V1.0 cf59691df26cd06a51454af5cd26af19b914c0041fc03b230fdd1a617784d968
-
浏览器访问
- http://106.13.30.87:8088/test/hello.txt
八、ansible
8.1ansible简介
- 作用:ansible用于应用部署和配置管理
- 特点:基于SSH协议,客户端无需部署
8.2架构和工作原理
架构组成:ansible核心、ansible模块
工作原理:
- 单个模块,单个命令执行方式;
- 剧本执行方式
8.3ansible安装和配置及命令
yum安装:
- 先安装epel源:
- yum install http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
再安装ansible:yum -y install ansible
- yum install http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
- 先安装epel源:
配置文件
定义远控主机文件:
/etc/ansible/hosts
[servers] 192.168.31.107 192.168.31.108 192.168.31.109
生成密钥
# ssh-keygen
使用ssh-copy-id命令来复制ansible公钥到各个节点
[root@canoe ~]# ssh-copy-id root@192.168.31.107 [root@canoe ~]# ssh-copy-id root@192.168.31.108 [root@canoe ~]# ssh-copy-id root@192.168.31.109
执行ping命令
[root@canoe ~]# ansible servers -m ping
192.168.31.108 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong" } 192.168.31.109 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong" } 192.168.31.107 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong" }
指定用户,执行ping命令
[root@canoe ~]# ssh-copy-id chen@192.168.31.107 [root@canoe ~]# ssh-copy-id chen@192.168.31.108 [root@canoe ~]# ssh-copy-id chen@192.168.31.109 [root@canoe ~]# ansible all -m ping -u chen
192.168.31.109 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong" } 192.168.31.108 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong" } 192.168.31.107 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong" }
执行命令echo hello
[root@canoe ~]# ansible -a "echo hello" servers 192.168.31.109 | CHANGED | rc=0 >> hello 192.168.31.107 | CHANGED | rc=0 >> hello 192.168.31.108 | CHANGED | rc=0 >> hello
执行命令date -R
[root@canoe ~]# ansible -m command -a "date -R" servers 192.168.31.108 | CHANGED | rc=0 >> Sun, 28 Mar 2021 12:15:55 +0800 192.168.31.109 | CHANGED | rc=0 >> Sun, 28 Mar 2021 12:15:54 +0800 192.168.31.107 | CHANGED | rc=0 >> Sun, 28 Mar 2021 12:15:56 +0800
执行命令uptime
[root@canoe ~]# ansible -m command -a "uptime" servers 192.168.31.108 | CHANGED | rc=0 >> 12:17:21 up 23 min, 2 users, load average: 0.00, 0.01, 0.05 192.168.31.109 | CHANGED | rc=0 >> 12:17:21 up 22 min, 2 users, load average: 0.24, 0.06, 0.07 192.168.31.107 | CHANGED | rc=0 >> 12:17:22 up 11 min, 2 users, load average: 0.08, 0.09, 0.07
ping": “pong”
}
192.168.31.108 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“ping”: “pong”
}
192.168.31.107 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“ping”: “pong”
}
```
执行命令echo hello
[root@canoe ~]# ansible -a "echo hello" servers 192.168.31.109 | CHANGED | rc=0 >> hello 192.168.31.107 | CHANGED | rc=0 >> hello 192.168.31.108 | CHANGED | rc=0 >> hello
执行命令date -R
[root@canoe ~]# ansible -m command -a "date -R" servers 192.168.31.108 | CHANGED | rc=0 >> Sun, 28 Mar 2021 12:15:55 +0800 192.168.31.109 | CHANGED | rc=0 >> Sun, 28 Mar 2021 12:15:54 +0800 192.168.31.107 | CHANGED | rc=0 >> Sun, 28 Mar 2021 12:15:56 +0800
执行命令uptime
[root@canoe ~]# ansible -m command -a "uptime" servers 192.168.31.108 | CHANGED | rc=0 >> 12:17:21 up 23 min, 2 users, load average: 0.00, 0.01, 0.05 192.168.31.109 | CHANGED | rc=0 >> 12:17:21 up 22 min, 2 users, load average: 0.24, 0.06, 0.07 192.168.31.107 | CHANGED | rc=0 >> 12:17:22 up 11 min, 2 users, load average: 0.08, 0.09, 0.07
云端自动化运维学习笔记相关推荐
- Python自动化运维---学习笔记
Python自动化运维 python简介 入门容易精通难,python适合作为第二编程语言(对于运维:Shell,对于开发:Java,对于全栈:nodejs(javascript)) python官网 ...
- python自动化运维学习笔记汇总
定义 对于运维而言,系统链接:https://pan.baidu.com/s/1xWKqN4DqBsOVCCRsYxIs4Q 提取码:Xq4s运行过程中变化小,重复性非常高.Python 是高层语言 ...
- 兄弟连Linux运维学习笔记
最新经典linux运维兄弟连Linux运维学习笔记... --------------- 全程1.5倍播放.加油我一定可以学完Linux ---------------------- Unix与Lin ...
- 【运维学习笔记】运维入门
前言: 这几天过的很像第一年来提高班装系统那会儿,接触了很多新的东西,大量的东西塞在脑子里!今天系统的整理了一下! 时间 事件 1周 看一些硬件的结构,拆 了一些东西(发现其实硬件也没有很神奇,是一些 ...
- 自动化运维学习--python
2019独角兽企业重金招聘Python工程师标准>>> 环境搭建 单机环境搭建 安装python apt-get install python python-dev python-s ...
- 大讲台大数据运维学习笔记
运维通俗的理解即为运行和维护,来保证系统和网站的正常运行,维护它们的安全.保证7×24小时的正常运行,数据的稳定.不丢失,并持续进行系统及网站的优化.那它具体是做什么的呢? 1. 备份有备无患,总是没 ...
- linux运维需要哪些网络知识,Linux运维学习笔记-网络技术知识体系总结
jTemplates部分语法介绍 1.{#if} {#if |COND|}..{#elseif |COND|}..{#else}..{#/if} Examples: {#if 2*8==16} goo ...
- Linux运维学习笔记之三十一:监控利器Nagios实战
第四十二章 监控利器Nagios实战 一.Nagios介绍 1.哪些内容需要监控呢? (1)本地资源 a.负载:uptime: b.CPU:top,sar,cpu温度: c.磁盘:df: d.内存:f ...
- 【运维学习笔记】生命不息,搞事开始。。。
001生命不息,搞事不止!!! 这段时间和hexesdesu搞了很多事情! 之前是机械硬盘和固态硬盘的测速,我就在那默默的看着他一个硬盘一个机械测来测去. 坐在他后面,每天都能看到这位萌萌的小男孩,各 ...
最新文章
- msdn的类型成员描述
- 深圳电信网速测试工具
- leetcode 78. 子集 思考分析
- linux系统编程之进程概念(操作系统---管理,进程创建,进程状态,进程优先级, 环境变量,程序地址空间,进程O(1)调度方法)
- python计算球坐标系的积分_python – n球面坐标系到笛卡尔坐标系
- 华为鸿蒙电脑操作系统测试版,华为鸿蒙测试版下载 华为鸿蒙测试版电脑版下载...
- 数据管理与商业智能_商业智能与数据科学
- (王道408考研数据结构)第三章栈和队列-第三节2:栈的应用之递归
- 蓝牙扫描_无线扫描枪常见的传输模式及其区别
- IBM软件三大发力点推进“软”实力着陆中国
- linux 类似winscp_联合使用winscp和putty管理你的linux远程机器
- 发动机冒黑烟_挖掘机冒黑烟,是怎么回事?
- 算法——排序——归并排序图解动画
- c语言逻辑运算符组合,C语言的逻辑运算符
- Windows(10) Python polyglot安装和运行失败的问题
- 全球十大交易系统(Futures Truth Magazine评选)及各交易系统详解
- eclipse调成黑色主题背景(老版本适用)
- 一、Java虚拟机概述与JVM结构
- 用Unity3D开发一个题库系统
- wifi网速慢的六个因素
热门文章
- C#和JavaScript 使用 Lz4 文本压缩算法 相互压缩/解压
- 免费!终极ChatGPT提示+Midjourney宝藏神图,1200+图片,震撼人心
- 基于Java+Swing+Mysql人口普查登记系统
- moderlarts第一次培训
- linux命令chgrp,chgrp命令
- python360指数_Python学习之单线程爬取360看看所有电视剧
- java计算加班费的程序代码_17.编程题:计算加班费、卖东西、日期提取、线程、数字、网络、数据库...
- Word公式编辑器快速上手指南
- 2021-06-08 海明距离(汉明距离)
- 对称密码(共享密钥密码)