云端自动化运维

文章目录

  • **云端自动化运维**
    • 一、云端自动化运维的基础
      • 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环境的搭建

  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
    
  2. 解压

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

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

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

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

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

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

    [root@canoe local]# ln -s /usr/local/Python-3.9.2/python /usr/bin/python3
    
  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.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.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字符串

  1. 认识字符串

    >>> 'abc'
    'abc'
    >>> "abc"
    'abc'
    #专⽤明带特殊字符的字符串
    >>> 'a\'b\'c' #通过\的⽅式
    "a'b'c"
    >>> "a'b'c" #通过双引号的⽅式
    "a'b'c"
    
  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'
    
  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
    
  4. 字符串的格式化

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

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

    • >>> print("我叫%s今年%d岁!" %('⼩明', 10))
      我叫⼩明今年10岁!
      >>> "我叫%s今年%d岁!" %('⼩明', 10)
      '我叫⼩明今年10岁!'
      >>> print("我叫{}今年{}岁!".format('⼩明', 10))
      我叫⼩明今年10岁!
      >>> print("我叫{0}今年{1}岁!".format('⼩明', 10))
      我叫⼩明今年10岁!
      
  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.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

  1. 得到当前工作目录

    >>> import os
    >>> os.getcwd()
    '/root'
    >>>
    
  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']
    >>>
    
  3. 删除⼀个⽂件

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

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

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

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

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

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

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

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

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

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

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

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

    >>> os.mkdir("test")
    >>>
    
  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)
    >>>
    
  17. 获取⽂件⼤⼩

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

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

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

    >>> import shutil
    >>> shutil.copyfile("hello.txt","hello3.txt")
    'hello3.txt'
    >>> shutil.copy("hello.txt","test")
    'test/hello.txt'
    >>>
    
  21. 复制文件夹

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

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

    >>> 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⽂件对
      像。
  • 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

  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 包

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

  1. 下载wordpress镜像

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

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

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

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

    • [root@canoe ~]# docker run --name MyWordPress2 --link db:mysql -p 8080:80 -d wordpress
      
  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
  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
    
  • 转换命令

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

    • 定义远控主机文件:

    • /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
      

云端自动化运维学习笔记相关推荐

  1. Python自动化运维---学习笔记

    Python自动化运维 python简介 入门容易精通难,python适合作为第二编程语言(对于运维:Shell,对于开发:Java,对于全栈:nodejs(javascript)) python官网 ...

  2. python自动化运维学习笔记汇总

    定义 对于运维而言,系统链接:https://pan.baidu.com/s/1xWKqN4DqBsOVCCRsYxIs4Q  提取码:Xq4s运行过程中变化小,重复性非常高.Python 是高层语言 ...

  3. 兄弟连Linux运维学习笔记

    最新经典linux运维兄弟连Linux运维学习笔记... --------------- 全程1.5倍播放.加油我一定可以学完Linux ---------------------- Unix与Lin ...

  4. 【运维学习笔记】运维入门

    前言: 这几天过的很像第一年来提高班装系统那会儿,接触了很多新的东西,大量的东西塞在脑子里!今天系统的整理了一下! 时间 事件 1周 看一些硬件的结构,拆 了一些东西(发现其实硬件也没有很神奇,是一些 ...

  5. 自动化运维学习--python

    2019独角兽企业重金招聘Python工程师标准>>> 环境搭建 单机环境搭建 安装python apt-get install python python-dev python-s ...

  6. 大讲台大数据运维学习笔记

    运维通俗的理解即为运行和维护,来保证系统和网站的正常运行,维护它们的安全.保证7×24小时的正常运行,数据的稳定.不丢失,并持续进行系统及网站的优化.那它具体是做什么的呢? 1. 备份有备无患,总是没 ...

  7. linux运维需要哪些网络知识,Linux运维学习笔记-网络技术知识体系总结

    jTemplates部分语法介绍 1.{#if} {#if |COND|}..{#elseif |COND|}..{#else}..{#/if} Examples: {#if 2*8==16} goo ...

  8. Linux运维学习笔记之三十一:监控利器Nagios实战

    第四十二章 监控利器Nagios实战 一.Nagios介绍 1.哪些内容需要监控呢? (1)本地资源 a.负载:uptime: b.CPU:top,sar,cpu温度: c.磁盘:df: d.内存:f ...

  9. 【运维学习笔记】生命不息,搞事开始。。。

    001生命不息,搞事不止!!! 这段时间和hexesdesu搞了很多事情! 之前是机械硬盘和固态硬盘的测速,我就在那默默的看着他一个硬盘一个机械测来测去. 坐在他后面,每天都能看到这位萌萌的小男孩,各 ...

最新文章

  1. msdn的类型成员描述
  2. 深圳电信网速测试工具
  3. leetcode 78. 子集 思考分析
  4. linux系统编程之进程概念(操作系统---管理,进程创建,进程状态,进程优先级, 环境变量,程序地址空间,进程O(1)调度方法)
  5. python计算球坐标系的积分_python – n球面坐标系到笛卡尔坐标系
  6. 华为鸿蒙电脑操作系统测试版,华为鸿蒙测试版下载 华为鸿蒙测试版电脑版下载...
  7. 数据管理与商业智能_商业智能与数据科学
  8. (王道408考研数据结构)第三章栈和队列-第三节2:栈的应用之递归
  9. 蓝牙扫描_无线扫描枪常见的传输模式及其区别
  10. IBM软件三大发力点推进“软”实力着陆中国
  11. linux 类似winscp_联合使用winscp和putty管理你的linux远程机器
  12. 发动机冒黑烟_挖掘机冒黑烟,是怎么回事?
  13. 算法——排序——归并排序图解动画
  14. c语言逻辑运算符组合,C语言的逻辑运算符
  15. Windows(10) Python polyglot安装和运行失败的问题
  16. 全球十大交易系统(Futures Truth Magazine评选)及各交易系统详解
  17. eclipse调成黑色主题背景(老版本适用)
  18. 一、Java虚拟机概述与JVM结构
  19. 用Unity3D开发一个题库系统
  20. wifi网速慢的六个因素

热门文章

  1. C#和JavaScript 使用 Lz4 文本压缩算法 相互压缩/解压
  2. 免费!终极ChatGPT提示+Midjourney宝藏神图,1200+图片,震撼人心
  3. 基于Java+Swing+Mysql人口普查登记系统
  4. moderlarts第一次培训
  5. linux命令chgrp,chgrp命令
  6. python360指数_Python学习之单线程爬取360看看所有电视剧
  7. java计算加班费的程序代码_17.编程题:计算加班费、卖东西、日期提取、线程、数字、网络、数据库...
  8. Word公式编辑器快速上手指南
  9. 2021-06-08 海明距离(汉明距离)
  10. 对称密码(共享密钥密码)