常用服务安装部署

 目录:
  一、MYSQL(mariadb)
  二、Python编译安装
  三、Python之Linux下的virtualenv
  四、Ipython解释器
  五、Web服务基础
  六、Saltstack
 
mysql (分支 mariadb)
1.安装mariadb
    -yum
    -源码编译安装
    -下载rpm安装
    yum和源码编译安装的区别?
        1.路径区别-yum安装的软件是他自定义的,源码安装的软件./configure --preifx=软件安装的绝对路径
        2.yum仓库的软件,版本可能比较低,而源码编译安装,版本可控
        3.编译安装的软件,支持第三方功能扩展./configure  这里可以加上很多参数,定制功能
        
    yum仓库的区别
        1.阿里云的yum仓库
        2.假设mysql官网,也会提供rpm包,源码包,以及yum源,供给下载
        

2.配置mariadb的官方yum源,用于自动下载mariadb的rpm软件包,自动安装

    注意点:阿里云提供的yum仓库,和epel源仓库,它也有mariadb,但是版本可能会很低
    
    这个是yum默认的mariadb的版本信息
    mariadb  x86_64   1:5.5.60-1.el7_5   base  8.9 M
    
    
    那我们就得选用mariadb的官方yum源,

3.配置官方的mariadb的yum源,手动创建 mariadb.repo仓库文件  (此步重要!)
    touch /etc/yum.repos.d/mariadb.repo 
    然后写入如下内容
    [mariadb]
    name = MariaDB
    baseurl = http://yum.mariadb.org/10.1/centos7-amd64
    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
    gpgcheck=1

4.通过yum安装mariadb软件,安装mariadb服务端和客户端  (由于是国外镜像源,因此下载速度可能很慢)
    yum install MariaDB-server MariaDB-client -y


5.如果下载速度太慢,请删除 mariadb.repo,只是为了使用阿里云的yum源中的mariadb
    rm -rf /etc/yum.repos.d/Mariadb.repo 
    然后清空yum 缓存
    yum clean all 

6.使用阿里云的yum下载  mariadb   (阿里云的mariadb包名是小写的,而官方的是大写的!!!!注意的)
    yum install mariadb-server  mariadb -y  

7.安装完成后,启动mariadb服务端
    systemctl  start/stop/restart/status  mariadb 
    systemctl enable mariadb   开机启动mariadb


8.mysql初始化
    mysql_secure_installation   这条命令可以初始化mysql,删除匿名用户,设置root密码等等....

9.设置mysql的中文编码支持,修改/etc/my.cnf 
        1.vi /etc/my.cnf 
          在[mysqld]中添加参数,使得mariadb服务端支持中文
              [mysqld]
            character-set-server=utf8
            collation-server=utf8_general_ci
        2.重启mariadb服务,读取my.cnf新配置
            systemctl restart mariadb 
        3.登录数据库,查看字符编码
            mysql -uroot -p 
         
            输入 \s  查看编码 
        
10.mysql常用命令
        desc  查看表结构;
        create database  数据库名;
        create table  表名;
        show create  database  库名;          查看如何创建db的
        show create table 表名;            查看如何创建table结构的

        #修改mysql的密码
        set password = PASSWORD('redhat');
        
        #创建mysql的普通用户,默认权限非常低
        create user yining@'%' identified by 'yiningzhenshuai';
        
        #查询mysql数据库中的用户信息
        use mysql;
        select host,user,password  from user;

11.给用户添加权限命令
    grant all privileges on *.* to 账户@主机名      对所有库和所有表授权所有权限

    grant all privileges on *.* to yining@'%';  给yining用户授予所有权限

    flush privileges;        刷新授权表

12.授予远程登录的权限命令                (root不能远程登录的问题??)
    grant all privileges on *.* to yining@'%';  给yining用户授予所有权限

    grant all privileges on *.* to root@'%' identified by 'redhat';  #给与root权限授予远程登录的命令

    此时可以在windows登录linux的数据库

    mysql -uyining -p  -h  服务器的地址              连接服务器的mysql


13.学习mysql的数据备份与恢复 

    1.mysqldump -u root -p --all-databases > /data/AllMysql.dump        导出当前数据库的所有db,到一个文件中(这是Linux的命令,不是MySQL的命令)
    2.导入备份数据(二选一)
      登录mysql 导入数据
        mysql -u root -p 
        source /data/AllMysql.dump 
    
      通过命令导入数据
        mysql -uroot -p   <   /data/AllMysql.dump  #在登录时候,导入数据文件,一样可以写入数据
mariadb的下载安装配置及MySQL命令的使用
mysql的主从复制架构,需要准备两台机器,并且可以通信,安装好2个mysql,保持版本一致性 
mysql -v 查看数据库版本


主库的配置
1.准备主库的配置文件  /etc/my.cnf 
    在/etc/my.cnf中写入开启主库的参数
        [mysqld]
        server-id=1             #标注 主库的身份id
        log-bin=s15mysql-bin        #那个binlog的文件名
    
2.重启mairadb,读取配置文件
    systemctl restart mariadb 

3.查看主库的状态
    mysql -uroot -p 

    show master status;  #这个命令可以查看 日志文件的名字,以及数据起始点 

4.创建用于主从数据同步的账户
    create user 'yuanhao'@'%' identified by 'yuanhaobuxitou';

5.授予主从同步账号的,复制数据的权限
    grant replication slave on *.* to 'yuanhao'@'%';

6.进行数据库的锁表,防止数据写入

    flush table with read lock;

7.将数据导出 (这个是Linux的命令,不是MySQL的命令)
    mysqldump -u root -p --all-databases >  /opt/zhucong.dump

8.然后将主库的数据,发送给从库
    scp /opt/zhucong.dump   root@从库:/opt/

9.此时去从库的mysql上,登录,导入主库的数据,保持数据一致性
    mysql -uroot -p 
    source /opt/zhucong.dump 



从库的配置
1.写入my.cnf,从库的身份信息
    vi /etc/my.cnf 
    [mysqld]
    server-id=10

2.检查一下主库和从库的 参数信息 

    show variables like 'server_id';
    show variables like 'log_bin';

3.通过一条命令,开启主从同步
    change master to master_host='192.168.13.78',
    master_user='yuanhao',
    master_password='yuanhaobuxitou',
    master_log_file='s15mysql-bin.000001',
    master_log_pos=571;

4.开启从库的slave同步
    start slave; 

5.查看主从同步的状态
    show slave status\G;  

    若以下两条参数都为Yes ,则主从正常
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
mysql的主从复制
 
    1.下载python3的源码
        cd /opt
        yum install wget -y  安装wget命令
        wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz
    
        注.安装python3之前,环境依赖解决
           通过yum安装工具包,自动处理依赖关系,每个软件包通过空格分割
           提前安装好这些软件包,日后就不会出现很多坑
    
           得保证这些依赖工具包,正确安装
            yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y

    2.解压缩源码包
        下载好python3源码包之后得到 Python-3.6.2.tgz
        解压缩 tar命令可以解压缩 tgz格式
        tar -xvf  Python-3.6.2.tgz

    3.切换源码包目录
        cd Python-3.6.2 

    4.编译且安装
        1.释放编译文件makefile,这makefile就是用来编译且安装的
            ./configure --prefix=/opt/python36/
                --prefix  指定软件的安装路径 
        2.开始编译python3
            make
        3.编译且安装  (只有在这一步,才会生成/opt/python36)
            make install 
        4.配置python3.6的环境变量
            1.配置软连接(注意,这个和PATH配置,二选一)
                ln -s 目标文件  软连接文件
                ln -s  /opt/python36/bin/python3.6    /usr/bin/python3 
                此时还没有pip
                ln -s  /opt/python36/bin/pip3   /usr/bin/pip3 

            2.配置path环境变量 (二选一即可)
                echo $PATH查看环境变量
                    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
                #这个变量赋值操作,只是临时生效,需要写入到文件,永久生效
                    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/python36/bin
                #linux有一个全局个人配置文件
                    编辑这个文件,在最底行写入PATH
                        vim /etc/profile 
                    写入
                        PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/python36/bin
                    保存退出
            
                    读一下这个/etc/profile 使得生效
                        source /etc/profile
            
        5.测试linux安装一个django,
            pip3 install django 
        6.创建django项目
            django-admin startproject mysite 
        7.创建django的APP应用
            django-admin startapp   app01 
            
        8.编写视图函数,测试一个index视图
        
        9.注意修改settings.py的allow_hosts,windows方可访问linux的django项目
编译安装python3 步骤
python的虚拟环境 virtualenv
    1.需求在linux服务器上,既可以有django2.0环境,也能运行django1.11.11环境
        思路:
        1.django2.0想要运行,我们得准备python解释器+pip3软件包管理
        2.还想运行django1.11.11  python解释器+pip3 
            - 在编译安装一个python3.6???????
            -  pip3安装的模块,都放在/opt/python36/lib/python3.6/site-packages
    
    virtualenv 就是一个虚拟解释器
        就是基于物理环境下的python解释器,虚拟/分身 出的 多个解释器 

        venv1 
            django2.0
        venv2
            django1.1
        venv3 
            flask
    
        venv4 
            requests
            scrapy 

    安装virtualenv

        1.下载virtualenv工具
            通过物理环境的pip工具安装
                pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv
            安装完成后你的linux就多了一个virtualenv命令
        2.创建虚拟环境venv1  venv2 

            virtualenv --no-site-packages --python=python3   s15venv1
                调用虚拟环境的命令 
                --no-site-packages  这是构建干净,隔离的模块的参数 
                --python=python3    这个参数是指定虚拟环境以哪一个物理解释器为基础的
                最后一个是虚拟环境的名字  会创建这么一个文件夹
        3.进入虚拟环境目录,激活虚拟环境
            找到你的虚拟环境目录bin下的activate文件并用source激活虚拟环境
                source myenv/s15venv1/bin/activate
            
            激活虚拟环境,原理就是修改了PATH变量,path是有顺序执行的
                echo $PATH 检查环境变量
                which python3 
                which  pip3  检查虚拟环境是否正常
    
        4.测试安装2个虚拟环境,venv1,venv2,并且运行2个django不同版本的项目

        5.退出虚拟环境的命令
            deactivate 


保证本地开发环境和线上一致性的操作
    解决方案:
        1.通过命令保证环境的一致性,导出当前python环境的包
            pip3 freeze > requirements.txt   

            这将会创建一个 requirements.txt 文件,其中包含了当前环境中所有包及 各自的版本的简单列表。
            可以使用 “pip list”在不产生requirements文件的情况下, 查看已安装包的列表。

        2.上传至服务器后,在服务器下创建virtualenv,在venv中导入项目所需的模块依赖
            pip3 install -r requirements.txt
python的虚拟环境 virtualenv
虚拟环境管理工具virtualenvwrapper

    1.安装这个命令,注意必须得在物理解释器下!
        pip3 install virtualenvwrapper
    
         注意这里path的配置,需要将物理解释器的python,放在path最前面
 
             echo $PATH 
             这里保持配置和我一样,将python3放在最前面
            [root@localhost ~]# echo $PATH
            /opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin

    
    2.修改环境变量,每次开机就加载这个virtualenvwrapper工具

        vim ~/.bashrc   #vim编辑用户家目录下的.bashrc文件,这个文件是用户在登录的时候,就读取这个文件
        #export 是读取shell命令的作用
        #这些变量根据你自己的绝对路径环境修改
        export WORKON_HOME=~/Envs   #设置virtualenv的统一管理目录
        export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'   #添加virtualenvwrapper的参数,生成干净隔绝的环境
        export VIRTUALENVWRAPPER_PYTHON=/opt/python362/bin/python3     #指定python解释器
        source /opt/python362/bin/virtualenvwrapper.sh #执行virtualenvwrapper安装脚本 
    
    3.重新登录会话,使得这个配置生效
        logout 
        ssh ....

    4.此时正确的话 virtualenvwrapper工具已经可以使用
        提供了哪些命令?
            mkvirtualenv  虚拟环境名       #自动下载虚拟环境,且激活虚拟环境

            workon  虚拟环境名           #激活虚拟环境

            deactivate              退出虚拟环境 

            rmvirtualenv            删除虚拟环境 

            cdvirtualenv              进入当前已激活的虚拟环境所在的目录

            cdsitepackages             进入当前激活的虚拟环境的,python包的目录
管理python虚拟环境virtualenv的工具virtualenvwrapper

 

安装环境:

centos7 + vmware + xshell

 一、MYSQL(mariadb)

mysql+centos7+主从复制

MYSQL(mariadb)

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。
开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。
MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

方法1:yum安装mariadb

Red Hat Enterprise Linux/CentOS 7.0 发行版已将默认的数据库从 MySQL 切换到 MariaDB。

第一步:添加 MariaDB yum 仓库

1、首先在 RHEL/CentOS 和 Fedora 操作系统中添加 MariaDB 的 YUM 配置文件 MariaDB.repo 文件。

#编辑创建mariadb.repo仓库文件 vi /etc/yum.repos.d/MariaDB.repo
2、添加repo仓库配置
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

第二步:在 CentOS 7 中安装 MariaDB

2、当 MariaDB 仓库地址添加好后,你可以通过下面的一行命令轻松安装 MariaDB。

yum install MariaDB-server MariaDB-client -y

第三不,启动mariadb相关命令

mariadb数据库的相关命令是:

systemctl start mariadb  #启动MariaDB

systemctl stop mariadb  #停止MariaDB

systemctl restart mariadb  #重启MariaDB

systemctl enable mariadb  #设置开机启动

启动后正常使用mysql

systemctl start mariadb

初始化mysql

在确认 MariaDB 数据库软件程序安装完毕并成功启动后请不要立即使用。为了确保数据 库的安全性和正常运转,需要先对数据库程序进行初始化操作。这个初始化操作涉及下面 5 个 步骤。
➢ 设置 root 管理员在数据库中的密码值(注意,该密码并非 root 管理员在系统中的密 码,这里的密码值默认应该为空,可直接按回车键)。
➢ 设置 root 管理员在数据库中的专有密码。
➢ 随后删除匿名账户,并使用 root 管理员从远程登录数据库,以确保数据库上运行的业
务的安全性。
➢ 删除默认的测试数据库,取消测试数据库的一系列访问权限。
➢ 刷新授权列表,让初始化的设定立即生效。

确保mariadb服务器启动后,执行命令初始化

mysql_secure_installation

初始化mysql

 

 mysql基本命令

#修改mysql密码
MariaDB [(none)]> set password = PASSWORD('redhat123');

生产环境里不会死磕root用户,为了数据库的安全以及和其他用户协同管理数据库,就需要创建其他数据库账户,然后分配权限,满足工作需求。

MariaDB [(none)]> create user yuchao@'127.0.0.1' identified by 'redhat123';

MariaDB [(none)]> use mysql;

MariaDB [mysql]> select host,user,password from user where user='yuchao';

切换普通用户yuchao,查看数据库信息,发现无法看到完整的数据库列表

[root@master ~]# mysql -uyuchao -p -h 127.0.0.1

MariaDB [(none)]> show databases;

数据库权限设置

mysql使用grant命令对账户进行授权,grant命令常见格式如下

grant 权限 on 数据库.表名 to 账户@主机名            对特定数据库中的特定表授权
grant 权限 on 数据库.* to 账户@主机名              对特定数据库中的所有表给与授权
grant 权限1,权限2,权限3 on *.* to 账户@主机名      对所有库中的所有表给与多个授权
grant all privileges on *.* to 账户@主机名      对所有库和所有表授权所有权限

退出数据库,使用root登录,开始权限设置

[root@master ~]# mysql -uroot -p

MariaDB [(none)]> use mysql;

MariaDB [(none)]> grant all privileges on *.* to yuchao@127.0.0.1;

MariaDB [mysql]> show grants for yuchao@127.0.0.1;

移除权限

MariaDB [(none)]> revoke all privileges on *.* from yuchao@127.0.0.1;

配置mysql

1.中文编码设置,编辑mysql配置文件/etc/my.cnf,下入以下内容

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.log
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

 

2.授权配置

远程连接设置哦设置所有库,所有表的所有权限,赋值权限给所有ip地址的root用户
mysql > grant all privileges on *.* to root@'%' identified by 'password';
#创建用户
mysql > create user 'username'@'%' identified by 'password';
#刷新权限
flush privileges;

数据库备份与恢复

mysqldump命令用于备份数据库数据

[root@master ~]# mysqldump -u root -p --all-databases > /tmp/db.dump

2.导出db1、db2两个数据库的所有数据

mysqldump -uroot -proot --databases db1 db2 >/tmp/user.sql

进入mariadb数据库,删除一个db

[root@master ~]# mysql -uroot -p

MariaDB [(none)]> drop database s11;

进行数据恢复,吧刚才重定向备份的数据库文件导入到mysql中

[root@master ~]# mysql -uroot -p < /tmp/db.dump

MYSQL主从复制

MySQL数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上。

MySQL数据库支持单向、双向、链式级联,等不同业务场景的复制。在复制的过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,而一个或多个其他的服务器充当从服务器(slave),接收来自Master上binlog文件的日志内容,解析出SQL,重新更新到Slave,使得主从服务器数据达到一致。

主从复制的逻辑有以下几种

一主一从,单向主从同步模式,只能在Master端写入数据

一主多从

双主主复制逻辑架构,此架构可以在Master1或Master2进行数据写入,或者两端同事写入(特殊设置)

在生产环境中,MySQL主从复制都是异步的复制方式,即不是严格的实时复制,但是给用户的体验都是实时的。
MySQL主从复制集群功能使得MySQL数据库支持大规模高并发读写成为可能,且有效的保护了服务器宕机的数据备份。

应用场景

利用复制功能当Master服务器出现问题时,我们可以人工的切换到从服务器继续提供服务,此时服务器的数据和宕机时的数据几乎完全一致。
复制功能也可用作数据备份,但是如果人为的执行drop,delete等语句删除,那么从库的备份功能也就失效了.

主从机制实现原理

(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events); 
(2) slave将master的binary log events拷贝到它的中继日志(relay log); 
(3) slave重做中继日志中的事件,将改变反映它自己的数据。

master主库配置

#查看数据库状态
systemctl status mariadb
#停mariadb
systemctl stop mariadb

#修改配置文件
vim /etc/my.cnf
#修改内容
#解释:server-id服务的唯一标识(主从之间都必须不同);log-bin启动二进制日志名称为mysql-bin

  [mysqld]
  server-id=1
  log-bin=mysql-bin

#重启mariadb
systemctl start mariadb

master主库添加从库账号

1.新建用于主从同步的用户chaoge,允许登录的从库是'192.168.178.130'
create user 'chaoge'@'192.168.178.130' identified by 'redhat';

2.#题外话:如果提示密码太简单不复合策略加在前面加这句
mysql> set global validate_password_policy=0;

3.给从库账号授权,说明给chaoge从库复制的权限,在192.168.178.130机器上复制
grant replication slave on *.* to 'chaoge'@'192.168.178.130';
#检查主库创建的复制账号
select user,host from mysql.user;
#检查授权账号的权限
show grants for chaoge@'192.168.178.130';

实现对主数据库锁表只读,防止数据写入,数据复制失败
flush table with read lock;

4.检查主库的状态

MariaDB [(none)]> show master status
-> ;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 575 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

File是二进制日志文件名,Position 是日志开始的位置。后面从库会用到 后面从库会用到 后面从库会用到!!!!!!

 

5.锁表后,一定要单独再打开一个SSH窗口,导出数据库的所有数据,

[root@oldboy_python ~ 19:32:45]#mysqldump -uroot -p --all-databases > /data/all.sql 

6.确保数据导出后,没有数据插入,完毕再查看主库状态

show master status;

7.导出数据完毕后,解锁主库,恢复可写;

unlock tables;

8.将备份导出的数据scp至Slave数据库

scp /data/all.sql root@192.168.178.130:/data/

slave从库配置

1.设置server-id值并关闭binlog功能参数
数据库的server-id在主从复制体系内是唯一的,Slave的server-id要与主库和其他从库不同,并且注释掉Slave的binlog参数。
2.因此修改Slave的/etc/my.cnf,写入
[mysqld]
server-id=3
3.重启数据库
systemctl restart mariadb
4.检查Slava从数据库的各项参数
show variables like 'log_bin';
show variables like 'server_id';
5.恢复主库Master的数据导入到Slave库
导入数据(注意sql文件的路径)
mysql>source /data/all.sql;
方法二:
#mysql -uroot -p < abc.sql
6.配置复制的参数,Slave从库连接Master主库的配置
mysql > change master to master_host='192.168.178.129',
master_user='chaoge',
master_password='redhat',
master_log_file='mysql-bin.000001',
master_log_pos=575;
7.启动从库的同步开关,测试主从复制的情况
start slave;
8.查看复制状态
show slave status\G;

 检查主从复制是否成功的关键在于

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.119.10
                  Master_User: chaoge
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1039
               Relay_Log_File: slave-relay-bin.000002
                Relay_Log_Pos: 537
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

tip:

注意此处还未配置从库的只读模式,只需在slave服务器上配置/etc/my.cnf,加上以下配置,并且在slave上创建普通用户,使用普通用户主从同步即可达到只读的效果

如果用root用户,无法达到readonly,这是一个坑

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.log
server-id=3
read-only=true
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

参考博客:https://www.cnblogs.com/pyyu/p/9467289.html

二、Python编译安装

centos7默认是装有python的,咱们先看一下

#检查python版本
[root@oldboy_python ~ 17:23:54]#python -V
Python 2.7.5

再放一张图,《震惊,python2.7不再维护!》

centos7安装python3 以及tab补全功能

1.安装python3

1.1下载python源码包

网址:https://www.python.org/downloads/release/python-362/

下载地址:https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz

1.1.1安装python前的库环境,非常重要

yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y

1.2下载,解压安装源码包

1.2.1  configure

这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码:

./configure --prefix=/usr

上面的意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share)。

同时一些软件的配置文件你可以通过指定 --sys-config= 参数进行设定。有一些软件还可以加上 --with、--enable、--without、--disable 等等参数对编译加以控制,你可以通过允许 ./configure --help 察看详细的说明帮助。

1.2.2  make

这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或python编写的软件需要调用perl或python来进行编译)。

如果 在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。

make 的作用是开始进行源代码编译,以及一些功能的提供,这些功能由他的 Makefile 设置文件提供相关的功能,比如 make install 一般表示进行安装,make uninstall 是卸载,不加参数就是默认的进行源代码编译。

make 是 Linux 开发套件里面自动化编译的一个控制程序,他通过借助 Makefile 里面编写的编译规范进行自动化的调用 gcc 、ld 以及运行某些需要的程序进行编译的程序。一般情况下,他所使用的 Makefile 控制代码,由 configure 这个设置脚本根据给定的参数和系统环境生成。

1.2.3   make install

这条命令来进行安装(当然有些软件需要先运行 make check 或 make test来进行一些测试),这一步一般需要你有 root 权限(因为要向系统写入文件)

wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz
xz -d Python-3.6.7.tar.xz
tar -xf Python-3.6.7.tar
#yum install gcc -y
./configure --prefix=/opt/python make && make install
---------------------
用python查看默认安装路径
>>> import sys
>>> sys.path
['', '/usr/local/lib/python36.zip', '/usr/local/lib/python3.6',
'/usr/local/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/site-packages']
--------------------
python3.4默认没添加path
在/etc/profile最后一行添加
export PATH=$PATH:/opt/python/bin
然后
source /etc/profile

#python快捷path就被改了,yum用的python2,麻烦

1.2.4 牛逼的python Tab自动补全

下载setuptool 3.4以上已经默认安装了easy_install-3.4

下载地址:
https://pypi.python.org/pypi/setuptools/36.2.7
下载命令:
wget https://pypi.python.org/packages/07/a0/11d3d76df54b9701c0f7bf23ea9b00c61c5e14eb7962bb29aed866a5844e/setuptools-36.2.7.zip#md5=b9e6c049617bac0f9e908a41ab4a29ac
解压:
unzip setuptools-36.2.7.zip
编译:
python3 setup.py build
python2 setup.py build
无误后安装:
python3 setup.py install
python2 setup.py install
View Code

下载readline

#yum install -y readline-devel -y 
#pip install readline
tab补全
#python startup file
import readline,rlcompleter
#tab completion
readline.parse_and_bind('tab:complete')
----------------------------
python历史记录
#history file
import os
history_file = os.path.join(os.environ["HOME"],".pythonhistory")
[root@mm_local ~]# echo "export PYTHONSTARTUP='/root/.pythonstartup'" >> /root/.bashrc   
[root@mm_local ~]# source /root/.bashrc  
[root@mm_local ~]# cat /root/.pythonstartup   
import os  
import readline  
import rlcompleter  
import atexit  
  
  
#tab completion  
readline.parse_and_bind("tab: complete")  
  
  
#history file  
history_file = os.path.join(os.environ["HOME"],".pythonhistory")  
try:  
    readline.read_history_file(history_file)  
except IOError:  
    pass  
atexit.register(readline.write_history_file,history_file)  
  
  
del os,history_file,readline,rlcompleter  
[root@mm_local ~]# python  
Python 2.7.3 (default, Jun  5 2013, 22:40:26)   
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2  
Type "help", "copyright", "credits" or "license" for more information.  
>>> import sys  
>>> sys.path<tab> #按tab键就可以自动补全了  
  
[root@mm_local ~]# python  
>>>  
>>> sys.path #按上下方向键即可找到历史命令 
整体代码

 加入python的启动环境变量,永久生效自动补全

只需要启动时执行一条命令即可

import rlcompleter, readline
readline.parse_and_bind('tab:complete')
可以将上述的代码存于~/.pythonrc.py文件中。

然后,在~/.bashrc中设置

export PYTHONSTARTUP=~/.pythonrc.py
这样,每次启动终端,bash就会设置PYTHONSTARTUP这个环境变量,然后,python启动时就会使用这个变量指定的文件中的初始化代码。

在python解释器中,输入一个变量的一部分,或者变量后面加句点,再按TAB键就可以看到自动补全的威力

 参考博客:https://www.cnblogs.com/pyyu/p/7402145.html

三、Python之Linux下的virtualenv

在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题;

亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难。

此时,我们需要对于不同的工程使用不同的虚拟环境来保持开发环境以及宿主环境的清洁。

这里,就要隆重介绍 virtualenv,一个可以帮助我们管理不同 Python 环境的绝好工具。

virtualenv 可以在系统中建立多个不同并且相互不干扰的虚拟环境。

(一)、Linux下安装、配置virtualenv

#指定清华源下载pip的包
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv
#升级pip工具
pip3 install --upgrade pip
1.安装virtualenv
pip3 install virtualenv 

2.创建目录 mkdir Myproject cd Myproject 3.创建独立运行环境-命名 virtualenv --no-site-packages --python=python3 venv#得到独立第三方包的环境,并且指定解释器是python3 4.进入虚拟环境 source venv/bin/activate#此时进入虚拟环境(venv)Myproject 5.安装第三方包 (venv)Myproject: pip3 install django==1.9.8 #此时pip的包都会安装到venv环境下,venv是针对Myproject创建的 6.退出venv环境 deactivate命令 7. virtualenv是如何创建“独立”的Python运行环境的呢?原理很简单,就是把系统Python复制一份到virtualenv的环境,用命令source venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境。

(二)、确保开发环境的一致性

1.假设我们在本地开发环境,准备好了项目+依赖包环境
2.现在需要将项目上传至服务器,上线发布
3.那么就要保证服务器的python环境一致性
解决方案:
1.通过命令保证环境的一致性,导出当前python环境的包
pip3 freeze > requirements.txt   

这将会创建一个 requirements.txt 文件,其中包含了当前环境中所有包及 各自的版本的简单列表。
可以使用 “pip list”在不产生requirements文件的情况下, 查看已安装包的列表。 2.上传至服务器后,在服务器下创建virtualenv,在venv中导入项目所需的模块依赖 pip3 install -r requirements.txt

 (三)、虚拟环境之virtualenvwrapper

virtualenv 的一个最大的缺点就是:

每次开启虚拟环境之前要去虚拟环境所在目录下的 bin 目录下 source 一下 activate,这就需要我们记住每个虚拟环境所在的目录。

并且还有可能你忘记了虚拟环境放在哪。。。

  • 一种可行的解决方案是,将所有的虚拟环境目录全都集中起来,例如/opt/all_venv/,并且针对不同的目录做不同的事。
  • 使用virtualenvwrapper管理你的虚拟环境(virtualenv),其实他就是统一管理虚拟环境的目录,并且省去了source的步骤。

步骤1:安装virtualenvwrapper

pip3 install virtualenvwrapper

步骤2:设置Linux的环境变量,每次启动就加载virtualenvwrapper

把下面两行代码添加到 ~/.bashrc文件中
打开文件
vim ~/.bashrc
写入以下两行代码
export WORKON_HOME=~/Envs   #设置virtualenv的统一管理目录
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'   #添加virtualenvwrapper的参数,生成干净隔绝的环境
export VIRTUALENVWRAPPER_PYTHON=/opt/python347/bin/python3     #指定python解释器
source /opt/python34/bin/virtualenvwrapper.sh #执行virtualenvwrapper安装脚本
读取文件,使得生效,此时已经可以使用virtalenvwrapper
source ~/.bashrc

步骤3:基本使用virtualenvwrapper

创建一个虚拟环境:
$ mkvirtualenv my_django115
这会在 ~/Envs 中创建 my_django115 文件夹。

在虚拟环境上工作:激活虚拟环境my_django115
$ workon my_django115


再创建一个新的虚拟环境
$ mkvirtualenv my_django2

virtualenvwrapper 提供环境名字的tab补全功能。
当有很多环境, 并且很难记住它们的名字时,这就显得很有用。

workon还可以任意停止你当前的环境,可以在多个虚拟环境中来回切换
workon django1.15

workon django2.0

也可以手动停止虚拟环境
deactivate

删除虚拟环境,需要先退出虚拟环境
rmvirtualenv my_django115

步骤四:常用其他命令

lsvirtualenv
列举所有的环境。
cdvirtualenv
导航到当前激活的虚拟环境的目录中,比如说这样您就能够浏览它的 site-packages 。
cdsitepackages
和上面的类似,但是是直接进入到 site-packages 目录中。
lssitepackages
显示 site-packages 目录中的内容。

完整官网介绍:https://virtualenvwrapper.readthedocs.io/en/latest/command_ref.html

图解

Mac下创建pycharm

 

第二步:

第三步:此时这里的Django环境是虚拟环境的版本

第四步:检查venv下的django版本

第五步:添加已创建的虚拟环境venv的python解释器,至pycharm,用于创建1.98指定版本的django

第六步:成功启动1.98版本的django

参考博客:https://www.cnblogs.com/pyyu/p/9015317.html

四、Ipython解释器

Mac下安装ipython与jupyter

IPython从Python发展而来,更倾向于科学计算。互联网数据分析更喜欢用。

首先切换root用户:

sudo su -

pip3自动安装ipython

yuchaodeMacBook-Pro:~ root# pip3 install ipython

自动安装完成后建立软连接,方便使用

yuchaodeMacBook-Pro:bin root# ln -s /Library/Frameworks/Python.framework/Versions/3.6/bin/ipython /usr/local/bin/

成功安装,执行使用

yuchaodeMacBook-Pro:bin root# ipython 
Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: name = 'chaoge'

In [2]: name
Out[2]: 'chaoge'

In [3]: 

 安装jupyter notebook

1.激活虚拟环境venv
2. pip3 install ipython
  pip3 install jupyter
3. ipython进入
  from IPython.lib import passwd
  passwd()#生成密码
4.jupyter notebook --generate-config --allow-root

c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.password = 'sha1:4d75995b2f75:c08ada6f31047fe429d0b24652f8fbc81ec32a7c'
c.NotebookApp.port = 8000

5.jupyter notebook  --allow-root  #启动notebook

参考博客:https://www.cnblogs.com/pyyu/p/8467239.html

五、Web服务基础

用户访问网站的基本流程

我们每天都会用web客户端上网,浏览器就是一个web客户端,例如谷歌浏览器,以及火狐浏览器等。
当我们输入www.oldboyedu.com/时候,很快就能看到老男孩教育的官网了,这一切看起来很平淡无奇,背后又是什么道理呢?
普通人可以不知道,但是咱们作为it开发人员,必须得掌握清楚背后的技术。

用户访问网站的基本流程

  1. 老男孩教育某python总监,讲了一天课感觉很累,下了班躺床上打开他的macbook pro,双击浏览器,输入www.pornhub.com网址后,系统首先会查找本地的DNS缓存以及hosts文件信息,确定是否存在www.pornhub.com域名对应的ip解析记录,如果有就直接获取ip进行访问服务器,第一次请求时,dns缓存是没有解析记录的,hosts文件多数是开发临时测试用
  2. 如果本地dns缓存和hosts文件都没有域名解析记录,系统就会把某python总监访问的网址解析请求发送给客户端设置的DNS服务器去解析,也叫做Local DNS,如果LDNS服务器的本地缓存有对应的解析记录就会直接返回给客户端IP地址,如果没有LDNS就会继续请求其他的DNS服务器
  3. LDNS继续从DNS系统的"."(根)开始请求www.pornhub.com域名的解析,并且根据每个层级的DNS服务器系统进行系列的查找,最终在DNS网络上找到www.pornhub.com域名对应的授权DNS服务器。这个授权DNS服务器就是企业(个人)购买域名时用于管理域名解析的服务器,服务器上有对应的域名(IP)解析。
  4. 此时授权的DNS服务器就会把www.pornhub.com对应的IP解析记录,例如(1.1.1.1)发送给LDNS
  5. 此时LDNS会把解析记录发给浏览器,并且缓存域名和IP的解析记录,便于下一次更快的返回请求
  6. 浏览器获得ip,请求对应的服务器,网站服务器接收到客户端的请求开始响应处理,将内容返回给浏览器,然后某python总监拿出了一盒清风牌抽纸。。。。

图解dns解析

HTTP协议

Http协议,全称是HyperText Tansfer Protocol,中文叫超文本传输协议,是互联网最常见的协议。Http最重要的是www(World Wide Web)服务,也叫web服务器,中文叫“万维网”。
web服务端口默认是80,另外一个加密的www服务应用https默认端口是443,主要用于支付,网银相关业务

版本

http协议诞生以来有若干个版本,主要是http/1.0 http/1.1

http/1.0规定浏览器和服务器只能保持短暂的连接,浏览器的每次请求都需要和服务器建立一个TCP连接,服务器完成请求后即断开TCP连接,服务器不跟踪每个链接,也不记录请求

http/1.1是对HTTP的缺陷进行重点修复,从可扩展性,缓存,带宽优化,持久连接,host头,错误通知等访问改进。
http/1.1支持长连接,增加了更多的请求头和响应头信息,例如配置请求头的Connection的值为keep-alive,表示请求结果返回后保持连接

Http请求方法

在HTTP通信中,每个请求报文都包含一个方法,以告诉web服务器端需要执行哪些操作,这些动作被称为HTTP的请求方法
1    GET    请求指定的页面信息,并返回实体主体。
2    HEAD    类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3    POST    向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4    PUT    从客户端向服务器传送的数据取代指定的文档的内容。
5    DELETE    请求服务器删除指定的页面。
6    CONNECT    HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7    OPTIONS    允许客户端查看服务器的性能。
8    TRACE    回显服务器收到的请求,主要用于测试或诊断。

HTTP状态码

HTTp状态码表示web服务器响应http请求状态的数字代码
常见状态码以及作用是
1**    信息,服务器收到请求,需要请求者继续执行操作
2**    成功,操作被成功接收并处理
3**    重定向,需要进一步的操作以完成请求
4**    客户端错误,请求包含语法错误或无法完成请求
5**    服务器错误,服务器在处理请求的过程中发生了错误

HTTP状态码的命令查看

curl -I www.oldboyedu.com
Server: OES Date: Sun, 12 Aug 2018 04:18:24 GMT Content-Type: text/html Content-Length: 152 Connection: keep-alive Location: https://www.oldboyedu.com/

Http报文

什么是HTTP请求报文

HTTP请求由请求行,请求头部,空行,请求报文主体几个部分组成

HTTP报文:它是HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文都是在客户端、服务器和代理之间流动。

请求报文的格式:
起始行: <method> <request-URL> <version>

头部:   <headers>

主体:   <entity-body>

GET请求报文示例

 GET /books/?sex=man&name=Professional HTTP/1.1

 Host: www.example.com  主机名
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)Gecko/20050225 Firefox/1.0.1  客户端类型
Accept-Encoding:gzip,deflate    支持压缩
Accept-Language:zh-cn  支持语言类型
Connection: Keep-Alive  长链接

请求行

请求报文第一行,表示客户端想要什么
由请求方法 url    协议版本   组成

请求头部

请求头由    
关键字    :    值    组成
通过客户端把请求相关信息告诉服务器

空行

请求头信息之后是一个空行,发送回车和换行符,通知web服务器以下没有请求头信息了

请求报文主体

 POST / HTTP/1.1
 Host: www.example.com
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
 Gecko/20050225 Firefox/1.0.1
 Content-Type: application/x-www-form-urlencoded
 Content-Length: 40
 Connection: Keep-Alive

 sex=man&name=Professional  
请求体中包含了要发送给web服务器的数据信息,请问报文主体不用于get方法,而是用于post方法。
post方法适用于客户端填写表单的场合。

HTTP响应报文

HTTP 响应与 HTTP 请求相似,HTTP响应也由3个部分构成,分别是:

  • 状态行
  • 响应头(Response Header)
  • 响应正文

状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。

状态行,用来说明服务器响应客户端的状况,一般分为协议版本号,数字状态码,状态情况
响应头部
常见响应头信息
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Mon, 13 Aug 2018 06:06:54 GMT
Expires: Mon, 13 Aug 2018 06:06:54 GMT
空白行
通知客户端空行以下没有头部信息了
响应报文主体
主要包含了返回给客户端的数据,可以是文本,二进制(图片,视频)

HTTP响应例子

HTTP/1.1 200 OK

Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112

<html>...

URl介绍

url中文叫“统一资源标识符”,是一个用于标识某一互联网资源名称的字符串,在世界范围内标识定位某一个唯一信息资源。

例如

#访问一张郭达的照片
http://www.pythonav.cn/man.jpg

url主要用在各种www客户端和服务器程序上,url可以用一种统一的格式来描述各种信息资源,包括文件,服务器地址和目录等

url组成

  1. 协议  
  2. 主机ip或域名
  3. 主机资源具体地址

第一部分用"://"隔开,第二部分用"/"符号隔开

静态网页资源

在网页设计中,纯HTMl格式的网页(包含图片,视频,JS,CSS等样式)通常被称作“静态网页”。

静态网页是相对于动态网页而言的,是指没有后台数据库,不包含程序,不可交互的网页。

静态网页的特点
开发人员写了什么,显示就是什么,一旦编写完成,就不会有任何改变。静态网页一般适用于更新较少的展示型网页,例如(酒水,家具,水果等宣传页),是很多中小网站的展示方式。

静态网页资源对应文件扩展名为

  • 纯文本文件,如.htm .html .xml  .js   .css
  • 图片或数据文档,如 .jpg  .gif  .bmp  .txt  .ppt
  • 视频类文件  .mp4  .avi  .flv  等

静态网页重要特性

  • 每个页面有一个固定的url地址,url地址不含有问号"?"或"&"等符号
  • 网页一经发布到服务器,网页内容是保存在服务器文件系统上的,每个网页都是独立的一个文件
  • 网页内容固定不变,容易被搜索引擎收录(优点)
  • 网页没有数据库支撑,在网站制作和维护上工作量很大(缺点)
  • 网页的交互性很差,缺少程序的功能实现(缺点)
  • 客户端解析网址时,由于不需要读取数据库,因此服务器端可以接受更高的并发访问。请求到来时,直接从磁盘上返回数据。(优点)

举例(吃火锅,现成的蔬菜)

有关高并发架构思想

在高并发,高访问量的场景下做架构优化时,比较关键的就是把动态网页转化成静态网页,而不是直接请求数据库和动态服务器,并且可以吧静态内容推到缓存中,这样就提升用户体验,节约服务器压力成本。

动态网页资源

动态网页是和静态网页相对而言的,动态网页的url后缀一般是.asp  .aspx  .php .js .cgi 
并且动态网页都有标志性的符号"? &",后端都有数据库的支持。

动态网页地址

添加新随笔
https://i.cnblogs.com/EditPosts.aspx?opt=1

动态网页资源特点

  1. 网页以数据库技术为支撑,大大降低网站维护的工作量
  2. 动态网页技术的网站可以实现更多的功能,如用户注册,用户登录,投票,用户管理,博客管理等
  3. 动态网页不是独立存在服务器上的网页文件,用户请求动态程序时,服务器解析程序并且可能读取数据库返回一个完整的网页内容
  4. 搜索引擎(爬虫)一般不会抓取网址中的“?”后面的内容,因此企业都会做伪静态技术页面

举例(饭店炒菜,现做)

网站流量术语

网站统计一般以数值较大的IP,PV统计,比较好看

IP

IP即Internet Protocol,这里是指独立ip数,不同的ip地址的计算机访问网站时被计算的总次数。独立ip数是网站流量的一个重要指标。一般相同ip地址的客户端访问网站页面一天内只会被计算一次。
这里的ip指的是是固定的公网ip

PV

pv(Page View)即是页面浏览量,不管客户端是不是相同,也不管ip是否相同,用户只要访问网站页面就会被计算PV,一次计算一个PV。
pv的度量方法就是客户端从浏览器发出一个web请求(request),服务器接收请求返回一个页面给客户端,这样就产生一个pv。
pv是衡量网站被访问的一个标准,但并不准确有多少人访问了网站。

举例

例如武佩奇去访问百合网想找一个知心朋友,你觉得他能产生多少PV?
答案可能是十几个到几十个。一个用户的访问PV量和网站的业务成正比的,武佩奇可能点击18岁左右的女性,28岁左右的女性,也可能点击18岁的小伙子。。。。因此他访问的页面会很多,自然pv也会增多

UV

UV即unique visitor,同一个客户端(pc或移动端)访问网站被计算为一个访客。
一天内相同的客户端访问同一个网站只计一次uv,uv是以cookie等技术为统计依据,实际统计存在误差。
一台计算机可能有多人使用,因此uv也不是最准确的。

并发数

并发数指系统同时能处理的请求数量,也反应了系统的负载能力

响应时间

响应时间是指执行一个请求从开始到最后收到响应数据所花费的总体时间。

QPS

Query Per Second
每秒查询数
服务器在一秒内处理了多少个请求,显然数字越大代表服务器的负载越高,处理能力越强。

流量术语讲解博客地址:https://fashengba.com/post/web-sites-nouns.html

Web服务软件

互联网主流web服务软件

  1. Apache
  2. IIS
  3. Nginx
  4. Tengine
  5. Tomcat
  6. Lighthttpd

主流web服务软件说明

  • Apache  中小型 web服务器的老大哥
  • Nginx        大型网址web服务,其分支Tengine也在飞速发展
  • Lighthttpd    nginx流行前的一款web软件

提供动态服务的软件

  • php(fastcgi)  大中小的公司都会使用,动态网页语言php程序的解析容器,常配合apache解析动态程序
  • tomcat   中小企业动态web服务,互联网java容器主流
  • IIS              微软下的web服务软件

题目

1.简述dns系统的解析原理
2.简述http协议的工作原理
4.请说出状态码200,301,403,404,500,504的含义
5.请简述什么是动态网页,静态网页
6.简述http报文有哪些部分

参考博客: https://www.cnblogs.com/pyyu/p/9467256.html

 

六、Saltstack

对于运维人员来说,反复复杂的工作很烦,效率低,还容易出错。而传统运维也想着自动化运维的方向进行发展,

而saltstack则是在自动化运维上非常好用的工具,saltstack是python开发的一款自动化运维工具,可以批量管理操作主机,

远程执行脚本等功能。完全开源,还可以设置web管理界面,更简单的管理大量服务器。

saltstack高效运维

salt介绍

saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。

salt强大吗

系统管理员日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等等。如果主机数量庞大,单靠人工维护实在让人难以忍受。

  早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护。系统管理员面临的问题主要是1、系统配置管理,2、远程执行命令,因此诞生了很多开源软件,系统维护方面有fabric、puppet、chef、ansible、saltstack等,这些软件擅长维护系统状态或方便的对大量主机进行批量的命令执行。

  salt灵活性强大,可以进行大规模部署,也能进行小规模的系统部署。salt的设计架构适用于任意数量的服务器,从少量本地网络系统到跨越数个数据中心,拓扑架构都是c/s模型,配置简单。

  不管是几台、几百台、几千台服务器,都可以使用salt在一个中心节点上进行管控,灵活定位任意服务器子集来运行命令。 

  Salt是python编写的,支持用户通过python自定义功能模块,也提供了大量的python API接口,用户可以根据需要进行简单快速的扩展。

saltstack的运行方式

  • Local  本地运行,交付管理
  • Master/Minion   <<<   常用方式   
  • Salt SSH   不需要客户端

salt部署基本架构

在安装salt之前,先理解salt架构中各个角色,主要区分是salt-master和salt-minion,顾名思义master是中心控制系统,minion是被管理的客户端。

salt架构中的一种就是master > minion。

在远程执行系统中,salt用python通过函数调用完成任务。

运行salt依赖包

python
zeromq
pyzmp
pycrypto
msgpack-python
yaml
jinja2

解决依赖包最简单的办法就是用安装包管理器,yum工具

服务器环境准备

服务器环境 centos7(master) centos7(master)

ip地址

192.168.178.131 192.168.178.132

身份

master slave

软件包

salt-master salt-minion

修改虚拟机ip地址为静态地址,并且确保可上网

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="7d4f9ede-810f-4976-a01b-250b845c99cc"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.11.131
NETMASK=255.255.255.0
GATEWAY=192.168.11.1
DNS1=119.29.29.29
master网卡配置
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="f9fc5929-8594-466e-a041-34caee8c1e32"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.11.132
NETMASK=255.255.255.0
GATEWAY=192.168.11.1
DNS1=119.29.29.29
slave网卡配置
# Generated by NetworkManager
nameserver 119.29.29.29
dns配置文件
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.11.132  slave
192.168.11.131  master
/etc/hosts/

 

关闭服务器安全策略

关闭firewalld
systemctl disable firewalld
systemctl stop firewalld

关闭iptables
iptables -F

关闭selinux
关闭安全策略

安装saltstack

 salt软件包需要epel源的支持,那么下载

EPEL的全称叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all #清空缓存
yum makecache #生成yum缓存

 安装好epel源就可以开始安装salt了

查看salt包
yum list salt

安装salt-master yum install salt-master -y
安装salt-minion
yum install salt-minion -y

salt端口

安装好salt之后开始配置,salt-master默认监听两个端口:

4505   publish_port 提供远程命令发送功能
4506   ret_port     提供认证,文件服务,结果收集等功能
确保客户端可以通信服务器的此2个端口,保证防火墙允许端口通过。因此在测试环境直接关闭防火墙。

配置文件

salt-master的配置文件是/etc/salt/master
salt-minion的配置文件是/etc/salt/minion
配置文件中包含了大量可调整的参数,这些参数控制master和minion各个方面

配置salt-master

# salt运行的用户,影响到salt的执行权限
user: root

#s alt的运行线程,开的线程越多一般处理的速度越快,但一般不要超过CPU的个数
worker_threads: 10

# master的管理端口
publish_port : 4505

# master跟minion的通讯端口,用于文件服务,认证,接受返回结果等
ret_port : 4506

# 如果这个master运行的salt-syndic连接到了一个更高层级的master,那么这个参数需要配置成连接到的这个高层级master的监听端口
syndic_master_port : 4506

# 指定pid文件位置
pidfile: /var/run/salt-master.pid
常用配置解析

超哥的salt-master文件

[root@master ~]# grep -v ^# /etc/salt/master|grep -v ^$
interface: 0.0.0.0  #绑定到本地的0.0.0.0地址
publish_port: 4505  #管理端口,命令发送
user: root      #运行salt进程的用户
worker_threads: 5  #salt运行线程数,线程越多处理速度越快,不要超过cpu个数
ret_port: 4506  #执行结果返回端口
pidfile: /var/run/salt-master.pid #pid文件位置
log_file: /var/log/salt/master  #日志文件地址

#自动接收minion的key
auto_accept: False
# minion的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
id: slave
 
# salt运行的用户权限
user: root
 
# master的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
master : master
 
# master通信端口
master_port: 4506
 
# 备份模式,minion是本地备份,当进行文件管理时的文件备份模式
backup_mode: minion
 
# 执行salt-call时候的输出方式
output: nested
 
# minion等待master接受认证的时间
acceptance_wait_time: 10
 
# 失败重连次数,0表示无限次,非零会不断尝试到设置值后停止尝试
acceptance_wait_time_max: 0
 
# 重新认证延迟时间,可以避免因为master的key改变导致minion需要重新认证的syn风暴
random_reauth_delay: 60
 
# 日志文件位置
log_file: /var/logs/salt_minion.log
salt-minion常用配置

超哥的satl-minion文件

[root@slave ~]# grep -v ^# /etc/salt/minion|grep -v ^$
master: master
master_port: 4506
user: root
id: slave
acceptance_wait_time: 10
log_file: /var/log/salt/minion

 启动salt-master和salt-minion

systemctl start salt-minion
systemctl start salt-master

#检查salt状态
systemctl status salt-minion
systemctl status salt-master

在master上接收minion秘钥

在minion启动后连接master会请求master为其签发证书,等待证书签发完成后,master可以信任minion,并且minion和master之间的通信是加密的。

在salt-master执行

salt-key命令用于管理mionion秘钥

[root@master ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
slave    #此时已经出现slave
Rejected Keys:

此时slave已经出现在unaccepted keys中,说明minion已经和master联系,并且master已经获取了minion的公钥,等待下一步指令。

检查master和minion的秘钥匹配

在master上执行

[root@master ~]# salt-key -f slave
Unaccepted Keys:
slave:  0a:b9:97:b5:9a:65:b8:49:a1:50:a5:6a:66:ce:33:ea

然后可以在minion上获取minion的秘钥

[root@slave ~]# salt-call --local key.finger
local:
    0a:b9:97:b5:9a:65:b8:49:a1:50:a5:6a:66:ce:33:ea

因此可确认秘钥匹配,在master上接收秘钥

[root@master ~]# salt-key -a slave
The following keys are going to be accepted:
Unaccepted Keys:
slave
Proceed? [n/Y] y
Key for minion slave accepted.

确认接收秘钥后,检验minion秘钥是否被接收

[root@master ~]# salt-key -L
Accepted Keys:
slave
Denied Keys:
Unaccepted Keys:
Rejected Keys:

秘钥接收完成后,就可以执行第一条salt啦

salt-key

只有Master接受了Minion Key后,才能进行管理。具体的认证命令为salt-key常用的有如下命令。

[root@linux-node1 ~]# salt-key -L
Accepted Keys:  #已经接受的key
Denied Keys:    #拒绝的key
Unaccepted Keys:#未加入的key
Rejected Keys:#吊销的key

#常用参数
-L  #查看KEY状态
-A  #允许所有
-D  #删除所有
-a  #认证指定的key
-d  #删除指定的key
-r  #注销掉指定key(该状态为未被认证)

#在master端/etc/salt/master配置
auto_accept: True   #如果对Minion信任,可以配置master自动接受请求

salt-key的使用

#列出当前所有的key
[root@salt0-master ~]# salt-key 
Accepted Keys:
salt1-minion.example.com
salt2-minion.example.com
salt3-minion.example.com
salt4-minion.example.com
Denied Keys:
Unaccepted Keys:
Rejected Keys:

#添加指定minion的key
[root@salt0-master ~]# salt-key  -a salt1-minion.example.com -y
#添加所有minion的key
[root@salt0-master ~]# salt-key  -A  -y

#删除指定的key
[root@salt0-master ~]# salt-key -d salt1-minion.example.com -y
#删除所有的key
[root@salt0-master ~]# salt-key -D -y

 

日常命令参数

首先知道master和minion都安装了什么文件,然后才知道怎么操作

master端

rpm -ql salt-master
/etc/salt/master      # salt master主配置文件
/usr/bin/salt           #salt master 核心操作命令
/usr/bin/salt-cp       #salt 文件传输命令
/usr/bin/salt-key    #salt证书管理
/usr/bin/salt-master    #salt master 服务命令
/usr/bin/salt-run          #salt master runner命令

slave端

[root@slave  ~]$rpm -ql salt-minion
/etc/salt/minion     #minion配置文件
/usr/bin/salt-call    #拉取命令
/usr/bin/salt-minion   #minion服务命令
/usr/lib/systemd/system/salt-minion.service   #minion启动脚本

第一条salt命令

[root@master ~]# salt '*' test.ping
slave:
    True

# salt 是一个命令
# * 表示目标主机, 在这里代表所有目标主机
# test.ping是salt远程执行的一个模块下面的方法。

这是条很简单的探测minion主机存活命令,也是远程执行命令,我们通过master发送消息给"*"所有的minion,并且告诉他们运行salt内置的命令(也是python模块中的一个函数),返回true表示slave机器监控存活。

test模块实际上还有许多其他的函数

[root@master 192.168.199.155 ~]$salt '*' sys.list_functions test
slave:
    - test.arg
    - test.arg_repr
    - test.arg_type
    - test.assertion
    - test.attr_call
    - test.collatz
    - test.conf_test
    - test.cross_test
    - test.echo
    - test.exception
    - test.fib
    - test.get_opts
    - test.kwarg
    - test.module_report
    - test.not_loaded
    - test.opts_pkg
    - test.outputter
    - test.ping
    - test.provider
    - test.providers
    - test.rand_sleep
    - test.rand_str
    - test.retcode
    - test.sleep
    - test.stack
    - test.try_
    - test.tty
    - test.version
    - test.versions_information
    - test.versions_report
test其他函数

测试下test.echo

[root@master 192.168.199.155 ~]$salt '*' test.echo 'chaoge nb666'
slave:
    chaoge nb666

test.fib生成斐波那契数列

菲波那切数列定义是第0项是0,第1项是1,数列从第3项开始,每一项等于前两项之和。

[root@master 192.168.199.155 ~]$salt '*' test.fib 50
slave:
    |_
      - 0
      - 1
      - 1
      - 2
      - 3
      - 5
      - 8
      - 13
      - 21
      - 34
    - 1.09672546387e-05

小结

此前在机器上安装了salt minion和salt master,进行了最简单的连接,然后master接受了minion的秘钥,运行了第一条test.ping命令

salt命令组成结构

在命令行输入的命令都是     执行模块

等到命令写入到文件中,             就叫做状态模块

salt --help #即可查看salt帮助

[root@master 192.168.199.155 ~]$salt --help
Usage: salt [options] '<target>' <function> [arguments]

salt命令 参数 目标 salt模块的函数 远程执行的参数

完整的五部分命令

#--summary参数显示salt命令的概要
[root@master 192.168.199.155 ~]$salt --summary '*' cmd.run 'hostname' slave: slave ------------------------------------------- Summary ------------------------------------------- # of Minions Targeted: 1 # of Minions Returned: 1 # of Minions Did Not Return: 0 -------------------------------------------

列出所有salt的sys模块

#与系统交互的sys模块
[root@master 192.168.11.72 ~]$salt 'slave' sys.list_modules

远程执行命令模块

cmd是超级模块,所有shell命令都能执行

[root@master 192.168.11.72 ~]$salt 'slave' cmd.run 'ps -ef|grep python'
slave:
    root        905      1  0 07:31 ?        00:00:02 /usr/bin/python -Es /usr/sbin/tuned -l -P
    root       3843      1  0 11:05 ?        00:00:00 /usr/bin/python /usr/bin/salt-minion
    root       3846   3843  0 11:05 ?        00:00:01 /usr/bin/python /usr/bin/salt-minion
    root       4031      1  0 11:31 ?        00:00:00 /usr/bin/python /usr/bin/salt-minion
    root       4032   4031  0 11:31 ?        00:00:00 /bin/sh -c ps -ef|grep python
    root       4034   4032  0 11:31 ?        00:00:00 grep python

远程安装nginx

#在minion上安装nginx
[root@master 192.168.11.72 ~]$salt 'slave' pkg.install "nginx"
#卸载minion上的nginx
[root@master 192.168.11.72 ~]$salt 'slave' pkg.remove "nginx"
#检查pkg包的版本
[root@master 192.168.11.72 ~]$salt 'slave' pkg.version "nginx"

远程管理服务模块

管理服务是系统管理员的重要任务,通过salt管理minion服务会很简单,使用service模块

[root@master 192.168.11.72 ~]$salt 'slave' service.start "nginx"
slave:
    True
[root@master 192.168.11.72 ~]$salt 'slave' service.status "nginx"
slave:
    True
[root@master 192.168.11.72 ~]$salt 'slave' service.stop "nginx"
slave:
    True

与标准的Linux命令一样,salt的命令一样用法

--out控制salt命令结果输出的格式

JSON

[root@master 192.168.199.155 ~]$salt --out=json '*' cmd.run_all 'hostname'
{
    "slave": {
        "pid": 2268,
        "retcode": 0,
        "stderr": "",
        "stdout": "slave"
    }
}

YAML

[root@master 192.168.199.155 ~]$salt --out=yaml '*' cmd.run_all 'hostname'
slave:
  pid: 2289
  retcode: 0
  stderr: ''
  stdout: slave

YAML讲解

在学习saltstack过程中,第一要点就是States编写技巧,简称SLS文件。这个文件遵循YAML语法。初学者看这玩意很容易懵逼,来,超哥拯救你学习YAML语法
json xml yaml 数据序列化格式
yaml容易被解析,应用于配置文件

salt的配置文件是yaml配置文件,不能用tab
saltstack,k8s,ansible都用的yaml格式配置文件


语法规则
    大小写敏感
    使用缩进表示层级关系   
    缩进时禁止tab键,只能空格
    缩进的空格数不重要,相同层级的元素左侧对其即可
    # 表示注释行
yaml支持的数据结构
    对象: 键值对,也称作映射 mapping 哈希hashes 字典 dict    冒号表示 key: value   key冒号后必须有
    数组: 一组按次序排列的值,又称为序列sequence 列表list     短横线  - list1
    纯量: 单个不可再分的值

对象:键值对
yaml
    first_key:
      second_key:second_value

python
    {
        'first_key':{
            'second_key':'second_value',
        }
    }
YAML是YAML Ain't Markup Language的首字母缩写,YAML的语法简单,
结构体通过空格展示
项目使用 '-' 代表
键值对通过 ':' 分割
YAML语法遵循固定的缩进风格,表示数据层级结构关系,saltstack需要每个缩进级别由2个空格组成,禁止用tabs!!!
Python中的字典是简单的键值对,go语言中称作哈希表map
字典的key通过冒号分割

key在YAML中表现形式是一个冒号结果的字符串
my_key: my_value
转化到python语法中,上述命令为
{'my_key':'my_value'}

value还可以通过缩进和key关联,四个空格!!
my_key:
my_value
转化为python语法同样的
{'my_key':'my_value'}

YAML语法中字典是可以嵌套的
one_dict_key:
two_dict_key:value_dict
转化为python语法

{
  'one_dict_key':{
    'two_dict_key':'value_dict'
  }
}

短横杠
YAML语法表示列表,使用一个横杠加一个空格
多个项使用同样的缩进级别作为同一个列表的部分
- list_value_one
- list_value_two
- list_value_three
列表可以作为一个键值对的value,例如一次性要安装多个软件
my_dict:
- l1
- l2
- l3
转化为python代码理解就是

{
  'my_dict':['l1','l2',;l3]
}

 目标定位字符串

  之前的salt命令我们都是使用 salt '*'控制所有minion,并且我们只有一个“slave”,但是生产环境的服务器很可能是成千上百的minion,因此需要灵活地定位所需的服务器并且执行远程命令。

 

1.全局匹配
[root@master 192.168.11.72 ~]$salt '*' test.ping
slave:
    True
Linux通配符
*               代表任意字符,或空字符串
?               代表一个字符,不可以为空
[a-z] [0-9]     代表任何一个小写字母

[root@master 192.168.11.72 ~]$salt 'slav?' test.ping
slave:
    True

[root@master 192.168.11.72 ~]$salt '[a-z]lave' test.ping
slave:
    True            
salt海支持python的re正则表达式

state模块定义主机状态

之前执行的远程命令,都是一个过程式的,类似一段shell或者python脚本执行,执行一次触发一次相同的功能。

那么大量的minion上运行远程命令就必须使用salt提供的“状态管理”了,状态是对minion的一种描述和定义,运维不需要关心部署是如何完成的,只需要描述minion需要达到什么状态。

接下来通过state模块部署nginx

master端

vim /etc/salt/master 
#打开注释,写入以下,必须严格遵循语法,空格 file_roots: base: - /srv/salt/base dev: - /srv/salt/dev test: - /srv/salt/test prod: - / srv/salt/prod

#此步骤在master和minion都需要执行,都需要文件夹,和nginx.sls文件
[root@master  ~]$mkdir -p /srv/salt/{base,dev,test,prod}

[root@slave   ~]$mkdir -p /srv/salt/{base,dev,test,prod}

#这个nginx.sls状态文件,在master和minion上都得有
[root@master /srv/salt/base]$cat nginx.sls nginx-install: pkg.installed: - name: nginx nginx-service: service.running: - name: nginx - enable: True
解释下nginx.sls描述文件
sls配置文件都遵循YAML语言描述 第一条命令使用了pkg.install安装命令,相对于运行了yum install,而此时state模块会判断nginx是否安装了,如果没有安装就进行安装,安装了就什么都不做。 状态描述都会遵循这个原则,只有检测到真实状态和所需状态不一就会执行此功能,这种性质叫做幂等性。

此时用state模块部署nginx软件,通过我们编写的nginx.sls描述性配置文件,命令行调用state模块的sls函数。

#启动命令,此时slave已经安装且存活了nginx,进行状态管理
[root@master  /srv/salt/base]$salt 'slave' state.sls nginx

可以去slave测试关闭nginx,删除nginx,重新执行命令,一样可以安装启动nginx

通过master检查slave的nginx状态

[root@master 192.168.199.155 /srv/salt/base]$salt 'slave' cmd.run 'ps -ef|grep nginx'
slave:
    root       8543      1  0 Sep14 ?        00:00:00 nginx: master process /usr/sbin/nginx
    nginx      8544   8543  0 Sep14 ?        00:00:00 nginx: worker process
    root       8592   8591  0 00:03 ?        00:00:00 /bin/sh -c ps -ef|grep nginx
    root       8594   8592  0 00:03 ?        00:00:00 /bin/sh -c ps -ef|grep nginx

Salt采集静态信息之Grains

如果你入职了,你的老板让你收集公司300台服务器的相关硬件信息,你是一台台登录呢?还是选择用salt收集呢?又或者用python的salt-api写脚本呢

Grains 是saltstack组件中非常重要之一,在配置部署时候回经常使用,Grains记录minion的静态信息,比如常用属性,CPU、内存、磁盘、网络信息等。
Minions的Grains信息是Minion启动时采集汇报给Master的
Grains是以 key value形式存储的数据库,可以看做Host的元数据(metadata)
Grains保存着收集到的客户端的详细信息
如果slave机器数据变化,grains就过期了 在生产环境中需要自定义Grains,可以通过 Minion配置文件 Grains相关模块定义 Python脚本定义

salt 'slave' sys.doc grains#查看grains的命令用法

Grains

Grains人为是描述minion本身固有的静态属性数据,列出主机所有Grains数据

[root@master 192.168.11.72 ~]$salt 'slave' grains.items
slave:
----------
SSDs:
biosreleasedate:
05/19/2017
biosversion:
6.00  

信息过长,已经省略

salt 'slave' grains.ls  #列出所有grains方法

检索某些数据

[root@master 192.168.11.72 ~]$salt 'slave' grains.item os id host
slave:
    ----------
    host:
        slave
    id:
        slave
    os:
        CentOS

利用Grains静态信息定位主机

超哥以前公司有100+的redhat操作系统,80+的centos,在不知道salt之前很是懵逼。。

除了系统的不同,还有不同的系统版本,redhat6.x centos6.x..

两种写法:
salt '*' grains.item key1 key2 key3
salt '*' -G

#定位Cenots的机器
[root@master 192.168.11.72 ~]$salt -G 'os:CentOS' test.ping slave: True
#定位操作系统系统是7系列的机器

[root@master 192.168.11.72 ~]$salt -G 'osrelease:7*' test.ping
slave:
True

#找出ip地址

salt '*' grains.item fqdn_ip4

因此用grains.items列出所有的数据匹配主机,以及根据单一信息定位数据,Grains还可以自定义来满足不同的需求。

自定义设置Grains数据

#设置数据
[root@master 192.168.11.72 ~]$salt 'slave' grains.setval cpu_num 8 slave: ---------- cpu_num: 8
#查询数据
[root@master 192.168.11.72 ~]$salt 'slave' grains.item cpu_num slave: ---------- cpu_num: 8

在master端设置Grains静态数据,原理会将此数据添加到minion服务器的配置文件的/etc/salt/grains

[root@slave 192.168.11.71 ~]$cat /etc/salt/grains
cpu_num: 8

对于复杂的数据结构,可以添加灵活的JSON语法

[root@master 192.168.11.72 ~]$salt 'slave' grains.setval cpu_info '["Intel","Xeon","10"]'
slave:
    ----------
    cpu_info:
        - Intel
        - Xeon
        - 10
[root@master 192.168.11.72 ~]$salt 'slave' grains.item cpu_info
slave:
    ----------
    cpu_info:
        - Intel
        - Xeon
        - 10

此时可以检查minion服务器上的grains文件

[root@slave 192.168.11.71 ~]$cat /etc/salt/grains
cpu_info:
- Intel
- Xeon
- '10'
cpu_num: 8

因此Grains数据写入配置文件后,重启salt-minion服务,数据也不会丢失

想要删除可以通过grains.delval命令删除,或者去minion的配置文件删除配置一样完成操作(或者删除文件)

1.方法一,清空值
[root@master 192.168.11.72 ~]$salt 'slave' grains.delval cpu_info
slave:
    None
[root@master 192.168.11.72 ~]$salt 'slave' grains.delval cpu_num
slave:
    None

2.方法二 删除minion的grains配置文件,重启服务

[root@slave 192.168.11.71 ~]$rm -rf /etc/salt/grains
[root@slave 192.168.11.71 ~]$!sys
systemctl restart salt-minion

检查结果删除成功

 数据管理中心之Pillar组件

Pillar也是saltstack组件中非常重要的组件之一,称作数据管理中心,经常配合states在大规模的配置管理中使用。

Pillar是动态的,存储在master端,提供和给minion端

Pillar在SaltStack中主要的作用是存储和定义配置管理中需要的一些数据,比如软件版本号,用户账号密码等,保证敏感数据不被其他minion看到

存储格式与Grains类似,都是YAML格式

在master配置文件中有一段Pillar settings选项专门定义Pillar的参数

 

cat /etc/salt/master  
#此配置代表pillar的工作根目录,在/srv/pillar下,然后可以新建sls文件 #pillar_roots: # base: # - /srv/pillar

默认pillar的工作目录在/srv/pillar目录下,执行如下代码

mkdir -p /srv/pillar
#指定环境,标记,引用packages.sls和services.sls
vim /srv/pillar/top.sls
base:
  '*':
      - packages
      - services
vim /srv/pillar/packages.sls nginx: packages-name: nginx version: 1.12.2 vim /srv/pillar/packages.sls nginx: port: 80 user: root

检查我们设置的pillar值

[root@master 192.168.199.155 /srv/pillar]$salt '*' pillar.item nginx
slave:
    ----------
    nginx:
        ----------
        packages-name:
            nginx
        port:
            80
        user:
            root
        version:
            1.12.2

Pillar与Grains对比

pillar与Grains对比

类型     数据采集方式   应用场景                   定义位置
Grains   静态         minion启动时收集  数据查询  目标选择  配置管理   minion
Pillar   动态         master进行自定义  目标选择  配置管理  敏感数据   master

Python API调用SaltStack

SaltStack本身提供salt(usr/bin/salt)来交互管理,但是去服务器上敲命令肯定不是一个长远之计,这时候python就体现了nb的功能。

Python API就是给Python提供的API使用,需要在SaltStack master上运行

实例代码

[root@master  ~]$python
Python 2.7.5 (default, Jul 13 2018, 13:06:57)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import salt.client
>>> local = salt.client.LocalClient()  #<salt.client.LocalClient object at 0x7f886dbdd850>
>>> local.cmd('*','cmd.run',['hostname'])#向所有minion发送命令
{'slave': 'slave'}

因此python API就是提供了向saltstack发送命令的入口。

通过API获取saltstack的配置文件

获取master配置文件

>>> import salt.config #导入salt配置模块
>>> m_opts=salt.config.client_config('/etc/salt/master') #读取salt配置文件,得到一个字典数据

获取minion配置文件

Python 2.7.5 (default, Jul 13 2018, 13:06:57)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import salt.client
>>> salt.config.minion_config('/etc/salt/minion') #读取minion配置文件,得到字典数据,通过字典方法可以查看信息

Python API介绍

/usr/bin/salt默认使用的接口是LocalClient,该接口只能在salt master上使用
[root@master  ~]$python
Python 2.7.5 (default, Jul 13 2018, 13:06:57)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import salt.client
>>> local = salt.client.LocalClient()  #<salt.client.LocalClient object at 0x7f886dbdd850>
>>> local.cmd('*','cmd.run',['hostname'])#向所有minion发送命令
{'slave': 'slave'}

逐条返回结果,local.cmd_iter()

>>> ret=local.cmd_iter('*','test.ping')
>>> ret
<generator object cmd_iter at 0x7f886d455c80>
>>> for i in ret:
...     print i
...
{'slave': {'retcode': 0, 'ret': True}}

菲波那切数列

>>> local.cmd('*','test.fib',[10])
{'slave': [[0, 1, 1, 2, 3, 5, 8], 2.1457672119140625e-06]}

检查minion服务器信息

>>> local.cmd('*','cmd.run',['hostname'])
{'slave': 'slave'}
>>> local.cmd('*','cmd.run',['ifconfig'])
>>> local.cmd('*','cmd.run',['crontab -l'])
>>> local.cmd('*','cmd.run',['df -h'])

启停minion的服务,如nginx

>>> local.cmd('*','service.stop',['nginx'])
{'slave': True}
>>> local.cmd('*','service.status',['nginx'])
{'slave': False}
>>> local.cmd('*','service.start',['nginx'])
{'slave': True}

参考博客: https://www.cnblogs.com/pyyu/p/9465608.html

posted on 2019-11-29 08:31  始终不够啊  阅读(491)  评论(0编辑  收藏  举报