当前位置:   article > 正文

云端自动化运维学习笔记_论文题 云端自动化运维

论文题 云端自动化运维

云端自动化运维

文章目录

一、云端自动化运维的基础

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环境的搭建
  1. 首先访问https://www.python.org/downloads/下载python

在这里插入图片描述

在这里插入图片描述

  1. 安装下载包:python-3.9.4-amd64.exe

  2. 为计算机添加安装⽬录搭到环境变量,如图把python的安装⽬录添加到pth系统变量中即可

    在这里插入图片描述

  3. 测试python安装是否成功,cmd打开命令⾏输⼊ python 命令

    在这里插入图片描述

1.2.2Linux系统下Python安装
  1. 下载安装包

    [root@canoe opt]# wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz
    
    • 1
  2. 解压

    [root@canoe opt]# tar xf Python-3.9.2.tgz
    
    • 1
  3. 将解压后的文件迁移至/usr/local

    [root@canoe opt]# mv Python-3.9.2 /usr/local
    
    • 1
  4. 进入python目录

    [root@canoe opt]# cd /usr/local/Python-3.9.2/
    [root@canoe Python-3.9.2]# 
    
    • 1
    • 2
  5. 执行配置文件

    [root@canoe Python-3.9.2]# ./configure
    
    • 1
  6. 安装gcc++

    [root@canoe Python-3.9.2]# yum install gcc gcc-c++
    
    • 1
  7. 编译安装

    [root@canoe Python-3.9.2]# make
    [root@canoe Python-3.9.2]# make install
    
    • 1
    • 2
  8. 在/usr/bin路径下生成python3的软链接

    [root@canoe local]# ln -s /usr/local/Python-3.9.2/python /usr/bin/python3
    
    • 1
  9. 测试进入

    [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
    • 2
    • 3
    • 4
    • 5

1.3开发工具介绍

1.3.1Pycharm
  1. 去官网下载https://www.jetbrains.com/pycharm/download/#section=windows

    在这里插入图片描述

  2. 双击安装包,按照next一直进行下去,直至安装完成。

1.3.2Vim
  • 安装

    [root@canoe ~]# sudo yum install vim
    
    • 1

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
>>> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Python数据类型的转换:

  • int(x)将x转换成⼀个整数

  • float(x)将x转换成浮点数

  • complex(x)将x转换为⼀个复数,实数为x虚数为0

  • complex(x, y)将x和y转换为复数,x为实数部,y为虚数部

  • 常用的数学函数

    在这里插入图片描述

1.4.2字符串
  1. 认识字符串

    >>> 'abc'
    'abc'
    >>> "abc"
    'abc'
    #专⽤明带特殊字符的字符串
    >>> 'a\'b\'c' #通过\的⽅式
    "a'b'c"
    >>> "a'b'c" #通过双引号的⽅式
    "a'b'c"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  2. 字符串索引

    >>> 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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  3. 字符串的遍历

    >>> 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  4. 字符串的格式化

    • 与C语言的字符串的格式化类似

    • 不同的类型采用不同的格式进行输出,python也可采用{}进行控制参数类型的输出

    • >>> print("我叫%s今年%d岁!" %('⼩明', 10))
      我叫⼩明今年10岁!
      >>> "我叫%s今年%d岁!" %('⼩明', 10)
      '我叫⼩明今年10岁!'
      >>> print("我叫{}今年{}岁!".format('⼩明', 10))
      我叫⼩明今年10岁!
      >>> print("我叫{0}今年{1}岁!".format('⼩明', 10))
      我叫⼩明今年10岁!
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
  5. 字符串的内建函数

    在这里插入图片描述

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
1.4.5集合
>>> s = {1, 1, 2, 3, 4}
>>> s
{1, 2, 3, 4}
  • 1
  • 2
  • 3
1.4.6函数
>>> def hello():
... print("hello world")
>>> hello()
hello world
  • 1
  • 2
  • 3
  • 4
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("不及格")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 循环语句

    • 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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • break会终止循环

    • >>> for i in range(10): #break会终⽌循环
      ... if i == 5:
      ... break
      ... print(i, end='\t')
      0 1 2 3 4
      
      • 1
      • 2
      • 3
      • 4
      • 5

二、基础运维

2.1os和shutil

  1. 得到当前工作目录

    >>> import os
    >>> os.getcwd()
    '/root'
    >>> 
    
    • 1
    • 2
    • 3
    • 4
  2. 返回指定⽬录下的所有⽂件和⽬录名

    >>> 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']
    >>> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
  3. 删除⼀个⽂件

    >>> os.remove('/usr/local/bin/hello.py')
    >>> 
    
    • 1
    • 2
  4. 删除多个⽬录

    >>> os.removedirs('/usr/local/bin/hello')
    >>>
    
    • 1
    • 2
  5. 检验给出的路径是否是⼀个⽂件

    >>> os.path.isfile('/usr/local/bin/hello.txt')
    True
    >>> 
    
    • 1
    • 2
    • 3
  6. 检验给出的路径是否是⼀个⽬录

    >>> os.path.isdir('/usr/local/bin/hello.txt')
    False
    >>> 
    
    • 1
    • 2
    • 3
  7. 判断是否是绝对路径

    >>> os.path.isabs('/usr/local/bin/hello.txt')
    True
    >>> 
    
    • 1
    • 2
    • 3
  8. 检验给出的路径是否真实存在

    >>> os.path.exists('/usr/local/bin/hello.txt')
    True
    >>> 
    
    • 1
    • 2
    • 3
  9. 返回⼀个路径的⽬录名和⽂件名

    >>> os.path.split('/usr/local/bin/hello.txt')
    ('/usr/local/bin', 'hello.txt')
    >>> 
    
    • 1
    • 2
    • 3
  10. 分离扩展名

    >>> os.path.splitext("hello.txt")
    ('hello', '.txt')
    >>> 
    
    • 1
    • 2
    • 3
  11. 获取路径名

    >>> os.path.dirname('/usr/local/bin/hello.txt')
    '/usr/local/bin'
    >>> 
    
    • 1
    • 2
    • 3
  12. 运⾏shell命令

    >>> os.system("touch /usr/local/bin/hello1.txt")
    0
    >>> 
    
    • 1
    • 2
    • 3
  13. 重命名

    >>> os.rename('hello1.txt','hello2.txt')
    >>> 
    
    • 1
    • 2
  14. 创建多集⽬录

    >>> os.makedirs("/hello/hello.txt")
    >>> 
    
    • 1
    • 2
  15. 创建单个⽬录

    >>> os.mkdir("test")
    >>> 
    
    • 1
    • 2
  16. 获取⽂件属性

    >>> 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)
    >>> 
    
    • 1
    • 2
    • 3
  17. 获取⽂件⼤⼩

    >>> os.path.getsize('hello.txt')
    0
    >>> 
    
    • 1
    • 2
    • 3
  18. 终⽌当前进程

    >>> os.exit()
    
    • 1
  19. 创建空⽂件

    >>> os.mknod("test.txt")
    >>> 
    
    • 1
    • 2
  20. 复制文件

    >>> import shutil
    >>> shutil.copyfile("hello.txt","hello3.txt")
    'hello3.txt'
    >>> shutil.copy("hello.txt","test")
    'test/hello.txt'
    >>> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  21. 复制文件夹

    >>> shutil.copytree("test","test2")
    'test2'
    >>> 
    
    • 1
    • 2
    • 3
  22. 重命名⽂件(⽬录)

    >>> os.rename("test","test1")
    >>> 
    
    • 1
    • 2
  23. 移动⽂件(⽬录)

    >>> shutil.move("hello.txt","test3")
    'test3'
    >>> 
    
    • 1
    • 2
    • 3

2.2python处理文本文件

2.2.1简单的将文件读取到字符串中
>>> f = open("/usr/local/bin/hello.txt","r")
>>> str = f.read()
>>> f.close()
>>> print(str)
helsiisjfsfifjsfjis

>>> 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
2.2.2按行读取整个⽂件
>>> f = open("/usr/local/bin/hello.txt","r")
>>> lines = f.readlines()
>>> for line in lines:
...     print(line,end=" ")
... 
helsiisjfsfifjsfji
 sjisf
 sji
 sji
 n
 nsif
 nsi
 s
 >>> f.close()
>>> 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
2.2.3简单的将字符串写⼊txt中
>>> with open('hello.txt', 'w') as f:
...     f.write("大家好")
... 
3
>>> open("/usr/local/bin/hello.txt","r").read()
'大家好'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
2.2.4with…as…语法
  • 会先执行__enter__方法,并返回一个对象
  • 执⾏完毕后会调⽤__exit__⽅法
class Test:
	def __enter__(self):
		print('enter method executing')
		return self
		
	def __exit__(self, type, value, traceback):
		print('exit method executing')
		
	def sayHello(self):
		print('hello world')
		
with Test() as test: #会执⾏__enter__⽅法并返回Test对象
test.sayHello()
#执⾏完毕后会调⽤__exit__⽅法
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

三、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
>>> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
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

>>> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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)
>>> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
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
>>> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
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
  • 1

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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

-在这里插入图片描述

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')
  • 1
  • 2
  • 3
  • 4
4.4.2 SSHClient常⽤的⽅法介绍
  • connect⽅法
    • conect⽅法实现了远程SSH连接并校验
  • exec_command
    • 远程命令执⾏⽅法,该命令的输⼊与输出流为标准输⼊(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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 在这里插入图片描述

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

五、Git

5.1安装Sourcetree

  1. 下载地址:https://www.sourcetreeapp.com/

    在这里插入图片描述

  2. 双击下载的.exe文件,进行安装

5.2创建远程仓库

  1. 登录www.gitee.com创建一个仓库

    在这里插入图片描述

  2. 通过创建的仓库生成的HTTP/SSH链接,在本地远程访问仓库,进行拉取,提交推送

    在这里插入图片描述

  3. 使用sourcetree克隆远程仓库

    在这里插入图片描述

  4. 创建一个文件并提交

    在这里插入图片描述

  5. 推送本地仓库到远程仓库里面去

    在这里插入图片描述

  6. 查看远程仓库

    在这里插入图片描述

六、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 包
  • 1

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 ~]# 
  • 1
  • 2
  • 3
  • 4
  • 5

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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

七、Docker

7.1docker的安装

7.1.1更新软件包
  • [root@canoe ~]# yum update 
    
    • 1
7.1.2关闭防火墙
  • [root@canoe ~]# systemctl stop firewalld  					#关闭防火墙
    [root@canoe ~]# systemctl disable firewalld 				#默认开机不启动防火墙
    
    • 1
    • 2
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设置规则
    
    • 1
    • 2
    • 3
    • 4
7.1.4保存防火墙规则
  • [root@canoe ~]# service iptables save
    
    • 1
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
      
      • 1
    • 复制下载的文件到此目录

7.1.6安装并启动
  • [root@canoe docker]# yum -y install *								#安装
    
    • 1
  • [root@canoe docker]# systemctl start docker							#启动
    
    • 1
  • [root@canoe docker]# systemctl enable docker						#设置开机启动
    
    • 1
  • [root@canoe docker]# docker run hello-world							#测试是否安装成功:
    
    • 1
  • 在这里插入图片描述

7.2docker加速配置

  • 将docker配置国内的阿里云的镜像上,以便于后期进行下载与访问速度快

  • 在/etc/下新建一个docker目录

    • [root@canoe ~]# mkdir -p /etc/docker
      
      • 1
  • 新建一个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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

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博客安装

  1. 下载wordpress镜像

    • [root@canoe ~]# docker pull wordpress
      
      • 1
  2. 下载mariadb镜像

    • [root@canoe ~]# docker pull mariadb
      
      • 1
  3. 查看镜像

    • [root@canoe ~]# docker images
      
      • 1
  4. 启动mariadb

    • [root@canoe ~]# docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb
      
      • 1
  5. 启动wordpress

    • [root@canoe ~]# docker run --name MyWordPress2 --link db:mysql -p 8080:80 -d wordpress
      
      • 1
  6. 查看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
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
  7. 访问wordpress

    1. 浏览器访问:http://106.13.30.87:8080/
      2.在这里插入图片描述
      3.在这里插入图片描述
      4.在这里插入图片描述

7.5docker镜像

7.5.1镜像的特性

容器创建时需要指定镜像,每个镜像都由唯一的标示 Image ID ,和容器的 Container ID 一样,默认 128 位,可以使用前 16 为缩略形式,也可以使用镜像名与版本号两部分组合唯一标示,如果省略版本号,默认使用最新版本标签 ( latesr )
镜像的分层:Docker 的镜像通过联合文件系统 ( union filesystem ) 将各层文件系统叠加在一起

7.5.2容器转换为镜像
  • docker commit CID xx.xx.xx
    
    • 1
  • 转换命令

    • docker build -t wangyang/jdk-tomcat
      
      • 1
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
      
      • 1
      • 2
  • 新建一个Dockerfile文件与新建一个hello.txt

    • [root@canoe test]# touch Dockerfile
      [root@canoe test]# touch hello.txt
      
      • 1
      • 2
  • 向Dockerfile文件写入

    • [root@canoe test]# vim Dockerfile
      
      • 1

    -在这里插入图片描述

  • 容器转为镜像

    • [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]# 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
    • 在这里插入图片描述

  • 启动镜像

    • [root@canoe test]# docker run --name tomcat_self1 -d -p 8080:8088 self_tomcat:V1.0
      cf59691df26cd06a51454af5cd26af19b914c0041fc03b230fdd1a617784d968
      
      • 1
      • 2

    -在这里插入图片描述

  • 浏览器访问

    • 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
  • 配置文件

    • 定义远控主机文件:

    • /etc/ansible/hosts

    • [servers]
      192.168.31.107
      192.168.31.108
      192.168.31.109
      
      • 1
      • 2
      • 3
      • 4
  • 生成密钥

    • # ssh-keygen
      
      • 1
  • 使用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
      
      • 1
      • 2
      • 3
  • 执行ping命令

    • [root@canoe ~]# ansible servers -m ping
      
      • 1
    • 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"
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
  • 指定用户,执行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
      
      • 1
      • 2
      • 3
      • 4
    • 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"
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
  • 执行命令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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
  • 执行命令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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
  • 执行命令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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
  • 执行命令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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
  • 执行命令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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/880130
推荐阅读
相关标签
  

闽ICP备14008679号