• 4、saltstack的使用



    官方文档地址:http://repo.saltstack.com/#rhel

    4.1、saltstatck介绍:

    用户要一致,这里使用的是root用户;

    用于批量管理成百上千的服务器;

    并行的分发,使用python开发,提供丰富的api接口;

    Saltstack的master端监听4505与4506端口,4505为master和minion认证通信端口,4506为master用来发送命令或者接收minion的命令执行返回信息;

    当客户端启动后,会主动连接master端注册,然后一直保持该TCP连接,而master通过这条TCP连接对客户端进行控制。如果连接断开,master对客户端

    将不能进行控制,但是当客户端检查到连接断开后,会定期向master端请求注册连接;

    1、saltstack运行方式:

    ①Local②Master/Minion③master④Salt SSH

    2、saltstack三大功能:

    ①远程执行②配置管理③云管理

    3、saltstack数据系统:

    ①Grains (静态数据)②pillar (动态数据)

    4、saltstack配置管理:

    ①SLS(YAML、Jinja)②Highstate③States Mod

    5、Saltstack几个重要的组件:

    (1)grains:

    grains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型、网卡ip等静态信息。grains的信息是静态的,并不会时时变更,

    它只是在 minion 启动时收集到的;

    (2)pillar:

    pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,

    还可以定义变量等;

    (3)state:

    它是saltstack的最核心功能,通过预先指定好的sls文件对被控主机进行管理:包/文件/网络配置/系统服务/系统用户等;

    6、服务器分配:

    本实验用的是saltstack的Master/Minion模式;


    服务器名称

    ip地址

    controller-node1(主)

    172.16.1.90

    slave-node1(从)

    172.16.1.91




    4.2、软件安装:

    1、安装saltstack yum源,主从一致:

    [root@controller-node1 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm

    2、主节点安装salt-master:

    [root@controller-node1 ~]# yum install salt-master

    3、从节点安装slat-minion:

    [root@slave-node1 ~]# yum install salt-minion

    4.3、saltstack配置文件配置:

    1、主节点:

    [root@controller-node1 ~]# grep -Ev "^#|^$" /etc/salt/master

    interface: 172.16.1.90

    publish_port: 4505

    #默认值;

    user: root

    #默认值;

    ret_port: 4506

    #默认值;

    timeout: 15

    #saltstack执行命令的超时时间,默认是5秒;

    state_top: top.sls

    #默认值;

    file_roots:

    base:

    - /srv/salt/base

    dev:

    - /srv/salt/dev

    test:

    - /srv/salt/test

    prod:

    - /srv/salt/prod

    pillar_roots:

    base:

    - /srv/pillar/base

    dev:

    - /srv/pillar/dev

    test:

    - /srv/pillar/test

    prod:

    - /srv/pillar/prod

    [root@controller-node1 ~]# mkdir -p /srv/salt/{base,dev,test,prod}

    [root@controller-node1 ~]# tree /srv/salt/

    /srv/salt/

    ├── base

    ├── dev

    ├── prod

    └── test

    4 directories, 0 files

    [root@controller-node1 ~]# mkdir -p /srv/pillar/{base,dev,test,prod}

    [root@controller-node1 ~]# tree /srv/pillar/

    /srv/pillar/

    ├── base

    ├── dev

    ├── prod

    └── test

    4 directories, 0 files

    2、从节点:

    [root@slave-node1 ~]# grep -Ev "^#|^$" /etc/salt/minion

    master: 172.16.1.90

    master_port: 4506

    #默认值;

    user: root

    #默认值;

    id: 172.16.1.91

    4.4、启动saltstack服务并加入到开机自启动:

    1、主节点:

    [root@controller-node1 ~]# systemctl start salt-master

    [root@controller-node1 ~]# systemctl enable salt-master

    [root@controller-node1 ~]# netstat -tunlp | grep "45"

    tcp 0 0 172.16.1.90:4505 0.0.0.0:* LISTEN 1962/python

    tcp 0 0 172.16.1.90:4506 0.0.0.0:* LISTEN 1968/python

    [root@controller-node1 ~]# lsof -ni:4505

    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

    salt-mast 12990 root 16u IPv4 64670 0t0 TCP 172.16.1.90:4505 (LISTEN)

    salt-mast 12990 root 18u IPv4 68274 0t0 TCP 172.16.1.90:4505->172.16.1.91:60502 (ESTABLISHED)

    2、从节点:

    [root@slave-node1 ~]# systemctl start salt-minion.service

    [root@slave-node1 ~]# systemctl enable salt-minion.service

    [root@slave-node1 ~]# netstat -tunlp

    Active Internet connections (only servers)

    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1052/sshd

    tcp6 0 0 :::22 :::* LISTEN 1052/sshd

    [root@slave-node1 ~]# lsof -ni:4505

    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

    salt-mini 1888 root 21u IPv4 29671 0t0 TCP 172.16.1.91:60502->172.16.1.90:4505 (ESTABLISHED)

    4.5、将从节点加入到主节点:

    1、列出saltstack当前节点状况:

    [root@controller-node1 ~]# salt-key -l all

    Accepted Keys:

    Denied Keys:

    Unaccepted Keys:

    172.16.1.91

    Rejected Keys:

    2、将从节点加入:

    [root@controller-node1 ~]# salt-key -a 172.16.1.91 #支持通配符,比如 salt-key -a 172.*

    The following keys are going to be accepted:

    Unaccepted Keys:

    172.16.1.91

    Proceed? [n/Y] y

    Key for minion 172.16.1.91 accepted.

    [root@controller-node1 ~]# salt-key -l all

    Accepted Keys:

    172.16.1.91

    Denied Keys:

    Unaccepted Keys:

    Rejected Keys:

    3、补充:

    1、saltstack salt-key动作命令(支持通配符):

    [root@controller-node1 ~]# salt-key --help

    -l ARG:列出公钥;

    pre、un和unaccepted将列出未接受公钥的minion;

    acc或accepted将列出已接受公钥的minion;

    rej或rejected将列出被拒绝接收公钥的minion;

    den或denied将列出被拒绝接收公钥的minion;

    all将列出所有键;

    -L: --list-all列出所有公钥;

    -a ACCEPT:接受指定minion的公钥,默认范围是Unaccepted Keys;

        --include-rejected

        --include-denied

    -A:接受所有minion为未接受的公钥,默认范围是Unaccepted Keys;

    --include-all #包括rejected和denied、unaccepted;

        --include-rejected

        --include-denied

    -r REJECT:拒绝接受指定minion的公钥,默认范围是Unaccepted Keys;

    --include-accepted

      --include-denied

    -R:拒绝所有minion的公钥,默认范围是Unaccepted Keys;

      --include-all #包括accepted和denied、unaccepted;

        --include-accepted

        --include-denied

    -p PRINT: 打印指定的minion的公钥,默认范围是所有区域;

    -P:打印所有minion的公钥,默认范围是所有区域;

    -d:DELETE:删除指定的minion的公钥,默认范围是所有区域;

    -D:删除所有minion的公钥,默认范围是所有区域;

    #删除的minion公钥会被放到Unaccepted Keys区域下;

    2、saltstack master和minion的认证过程:

    (1)master在第一次启动时会在/etc/salt/pki/(空目录)目录下生成master、minion两个目录,在master目录下会生成

    master.pem(私钥)和master.pub(公钥)秘钥对和其它的目录;

    (2)minion在第一次启动时会在/etc/salt/pki/(空目录)目录下生成master、minion两个目录,在minion目录下会生成

    minion.pem(私钥)和minion.pub(公钥)秘钥对和其它的目录,并将自己的公钥发送给master;

    (3)在未将minion注册到master时,minion的公钥会被放在master端的/etc/salt/pki/minions_pre/目录下并以

    在minion配置文件中配置的id为名称,当minion加入到master后,minion的公钥会被放在master端的

    /etc/salt/pki/minions/目录下,并将自己的公钥发送给minion,存放在minion的/etc/salt/pki/minion/目录下,这样便完

    成了master和minion的认证,master和minion使用公钥和私钥进行加密,使用的是aes(高级加密标准)的加密算法,非常的

    安全;

    (4)如果minion配置文件中的id需要改变的解决办法:

    1)停止minion服务;

    2)在master端使用'salt-key -d <name>'删除公钥在master上;

    提示:如果没有执行上面一步,即使删除了minion的公钥,那么minion也会将公钥发送给master

    这样就会导致删不掉minion的公钥;

    3)删除minion /etc/salt/pki/目录下的所有内容;

    4)修改minion配置文件中的id;

    5)启动minion服务;

    (5)master和minion认证目录:

    1)master:

    [root@controller-node1 ~]# tree /etc/salt/pki/

    /etc/salt/pki/

    ├── master

    │   ├── master.pem

    │   ├── master.pub

    │   ├── minions

    │   │   └── 172.16.1.91

    │   ├── minions_autosign

    │   ├── minions_denied

    │   ├── minions_pre

    │   └── minions_rejected

    └── minion

    2)minion:

    [root@slave-node1 ~]# tree /etc/salt/pki/

    /etc/salt/pki/

    ├── master

    └── minion

    ├── minion_master.pub

    ├── minion.pem

    └── minion.pub

    (6)根据master和minion的认证原理,可以对master的/etc/salt/目录和/srv/目录进行备份,如果

    出现master服务器损坏的情况下可以进行还原,还原步骤如下:

    1)关闭salt-master服务:

    [root@controller-node1 ~]# systemctl stop salt-master.service

    2)还原备份的目录,在还原之前需要对现有的目录进行备份;

    3)启动salt-master服务:

    [root@controller-node1 ~]# systemctl start salt-master.service

    3)忽略salt-master监听总线;

    [root@controller-node1 ~]# salt '*' cmd.run 'uptime' --async

    4)还原成功,可以正常使用;

    4.6、常用远程执行命令;

    1、远程命令格式:

    命令 目标 模块 参数

    2、常用命令:

    (1)远程测试:

    [root@controller-node1 ~]# salt '*' test.ping

    #单引号表示转义,也可以使用*或"*"

    (2)cmd密令:

    [root@controller-node1 ~]# salt '*' cmd.run 'uptime'

    #cmd命令可以执行linux中一切的命令;

    (3)软件安装命令:

    [root@controller-node1 ~]# salt '*' pkg.install 'httpd'

    (4)网络命令:

    [root@controller-node1 ~]# salt '*' network.active_tcp

    [root@controller-node1 ~]# salt '*' network.arp

    [root@controller-node1 ~]# salt '*' network.connect 172.16.1.91 80

    [root@controller-node1 ~]# salt '*' network.get_hostname

    [root@controller-node1 ~]# salt '*' network.default_route

    (4)服务命令:

    [root@controller-node1 ~]# salt '*' service.get_enabled

    [root@controller-node1 ~]# salt '*' service.get_disabled

    [root@controller-node1 ~]# salt '*' service.start 'httpd'

    [root@controller-node1 ~]# salt '*' service.reload 'httpd'

    [root@controller-node1 ~]# salt '*' service.stop 'httpd'

    [root@controller-node1 ~]# salt '*' service.status 'httpd'

    (2)查看top.sls中使用的sls,只能查看/srv/salt/base/目录下的sls;

    [root@controller-node1 ~]# salt '*' state.show_top

    (3)远程拷贝命令:

    [root@controller-node1 ~]# salt-cp '*' /etc/passwd /tmp/

    4.7、配置管理:

    1、yaml语法说明:

    (1)yaml类似于xml文件;

    (2)缩进:除第一层不用缩进外,每层之间是两个空格的缩进,不能使用tab键;

    (3)冒号:除以冒号结尾或路径外,后面必须要有一个空格;

    (4)短横线:表示列表,短横线后面必须要有一个空格;

    (5)井号:表示注释;

    2、编写安装apache服务的描述文件:

    缺点:不自动化,执行时还需要通知哪台机器执行;

    [root@controller-node1 ~]# mkdir /srv/salt/base/web/ -p

    [root@controller-node1 ~]# vim /srv/salt/base/web/apache.sls

    apache-install:

    #id,随便写,但是必须要唯一;

    pkg.installed:

    #远程执行软件安装命令;

    - name: httpd

    #安装的软件名称;


    apache-service:

    service.running:

    #远程执行软件服务命令;

    - name: httpd

    #启动httpd;

    - enable: True

    #将软件加入到开机自启动

    #说明,以上配置从上到下依次执行,如果服务已完成则行;

    [root@controller-node1 ~]# salt '172.16.1.91' state.sls web.apache

    #默认环境是base,换环境需要加saltenv=prod;

    3、编写自动化配置:

    说明:使用top.sls自动化文件进行配置,该配置文件必须在/srv/salt/base/下面;

    [root@controller-node1 ~]# vim /srv/salt/base/top.sls

    base:

    #调用base环境下的sls;

    '172.16.1.91':

    #允许哪些机器执行操作,支持通配符;

    - web.apache

    #sls的名称;

    [root@controller-node1 ~]# salt '*' state.highstate

    #虽然说是让所有的节点执行工作,但是如果top.sls中没有定义一些节点的执行内容,那么该节就不会执行命令,最小化原则;

    4、配置文件执行测试(test=True):

    它会告诉你它会干什么,但是不会具体实施,颜色会不同;

    [root@controller-node1 ~]# salt '172.16.1.91' state.sls web.apache test=True

    [root@controller-node1 ~]# salt '*' state.highstate test=True

    4.8、saltstack的数据存储系统Grains和pillar:

    1、Grains和pillar的区别:


    数据存储类型

    存储位置

    类型

    采集方式

    场景

    Grains

    minion

    静态

    minion启动时,可以手动刷新生效

    1、获取信息 2、匹配

    pillar

    master

    动态

    指定,实时生效

    1、敏感数据配置 2、匹配





    2、Grains(谷粒):

    Grains存放着salt-minion启动时收集的信息,是静态的信息,在minion上设置,以key-value的形式保存且为明

    文,用来保存隐秘的数据是不安全的,设置后需要同步minion上的grains才能生效,Grains应用场景为信息查询;

    (1)获取所有的grains信息:

    [root@controller-node1 ~]# salt '172.16.1.91' grains.items

    (2)获取指定grains信息:

    [root@controller-node1 ~]# salt '172.16.1.91' grains.get 'ip4_interfaces:eth1'

    172.16.1.91:

    - 172.16.1.91

    [root@controller-node1 ~]# salt '*' grains.get 'serialnumber'

    172.16.1.91:

    VMware-56 4d df f4 02 29 4e 45-6f c7 af 78 9d ef a2 44

    [root@controller-node1 ~]# salt '*' grains.get 'osrelease'

    172.16.1.91:

    7.5.1804

    (3)远程执行中匹配目标,使用grains匹配minion(缺点:不能指定多个条件且不可控):

    [root@controller-node1 ~]# salt -G 'os:CentOS' cmd.run 'uptime'

    172.16.1.91:

    13:54:02 up 3:50, 1 user, load average: 0.00, 0.01, 0.05

    #在所有的minion中grains值为'os:CentOS'的minion执行uptime命令;

    (4)在top.sls中匹配使用:

    [root@controller-node1 ~]# cat /srv/salt/base/top.sls

    base:

    'os:CentOS':

    - match: grain

    - web.apache

    (5)grains的自定义需求:

    1)在minion上创建grains文件:

    [root@controller-node1 ~]# salt '172.16.1.91' cmd.run 'touch /etc/salt/grains'

    2)在minion的grains文件中定义item项:

    [root@controller-node1 ~]# salt '172.16.1.91' cmd.run 'echo "ip_eth1: 172.16.1.91" >/etc/salt/grains'

    3)同步minion的grains:

    [root@controller-node1 ~]# salt '172.16.1.91' saltutil.sync_grains

    4)获取minion中自定义的item项:

    [root@controller-node1 ~]# salt '172.16.1.91' grains.get 'ip_eth1'

    172.16.1.91:

    172.16.1.91

    3、Pillar(柱):

    pillar和grains一样是saltstack一个重要的数据存储系统,以key-value形式保存数据,对数据进行了加密,很安全,

    主要放一些敏感的数据,比如密码、变量,且只能在top.sls中使用,pillar是在master上设置的,且是针对minion定

    义的一些信息,设置后立即生效;

    (1)获取minion所有的pillar:

    [root@controller-node1 ~]# salt '172.16.1.91' pillar.items

    172.16.1.91:

    ----------

    #默认没有是因为master的配置文件中'#pillar_opts: False'选项是没有开启的,不推荐打开;

    (2)如何设置pillar:

    1)编写pillar安装文件(minion分类):

    [root@controller-node1 ~]# cat /srv/pillar/base/apache.sls

    {% if grains['os'] == 'CentOS' %}

    #在pillar中引入grains进行参数判断;

    apache: httpd

    #key:apache,value:httpd(要安装的软件名称);

    {% elif grains['os'] =='Debian' %}

    apache: apache2

    {% endif %}

    2)编写top.sls文件(minion范围):

    [root@controller-node1 ~]# cat /srv/pillar/base/top.sls

    base:

    '172.16.1.91':

    - apache

    3)获取设置的pillar:

    [root@controller-node1 ~]# salt '*' pillar.items

    172.16.1.91:

    ----------

    apache:

    httpd

    4)在状态文件中引用pillar(安装):

    [root@controller-node1 ~]# cat /srv/salt/base/web/apache.sls

    apache-install:

    pkg.installed:

    - name: {{ pillar['apache'] }}


    apache-service:

    service.running:

    - name: {{ pillar['apache'] }}

    - enable: True

    5)修改/srv/salt/base/top.sls(自动化):

    [root@controller-node1 ~]# cat /srv/salt/base/top.sls

    base:

    '*':

    - web.apache

    6)执行

    [root@controller-node1 ~]# salt '*' state.highstate

    7)说明:

    test=True和top.sls中的grains匹配在pillar中正常使用;

    4.9、将saltstack的返回值写到数据库:

    1、在master上安装数据库:

    [root@controller-node1 ~]# yum install -y mariadb-server

    [root@controller-node1 ~]# systemctl start mariadb

    [root@controller-node1 ~]# systemctl enable mariadb

    2、配置slatstack库:

    (1)创建库和表:

    参考文档:https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.mysql.html

    [root@controller-node1 ~]# mysql -uroot -p123456

    MariaDB [(none)]>


    CREATE DATABASE salt DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;


    USE salt;


    CREATE TABLE `jids` (

    `jid` varchar(255) NOT NULL,

    `load` mediumtext NOT NULL,

    UNIQUE KEY `jid` (`jid`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    CREATE TABLE `salt_returns` (

    `fun` varchar(50) NOT NULL,

    `jid` varchar(255) NOT NULL,

    `return` mediumtext NOT NULL,

    `id` varchar(255) NOT NULL,

    `success` varchar(10) NOT NULL,

    `full_ret` mediumtext NOT NULL,

    `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    KEY `id` (`id`),

    KEY `jid` (`jid`),

    KEY `fun` (`fun`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    CREATE TABLE `salt_events` (

    `id` BIGINT NOT NULL AUTO_INCREMENT,

    `tag` varchar(255) NOT NULL,

    `data` mediumtext NOT NULL,

    `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    `master_id` varchar(255) NOT NULL,

    PRIMARY KEY (`id`),

    KEY `tag` (`tag`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    MariaDB [salt]> show tables;

    +----------------+

    | Tables_in_salt |

    +----------------+

    | jids |

    | salt_events |

    | salt_returns |

    +----------------+

    3 rows in set (0.00 sec)

    3、给库进行授权:

    MariaDB [salt]> grant all on salt.* to salt@'172.16.1.%' identified by '123456';

    MariaDB [salt]> flush privileges;

    4、安装mysql的python模块:

    [root@controller-node1 ~]# yum install -y MySQL-python

    5、在master的配置文件中添加连接数据库的配置:

    [root@controller-node1 ~]# vim /etc/salt/minion #部分配置修改;

    cachedir: /var/cache/salt/master

    #cache存储路径;

    keep_jobs: 12

    #mysql返回cache保存的时间,默认是24小时,建议改小,不然saltstack会占用磁盘;

    #return: mysql

    master_job_cache: mysql

    mysql.host: '172.16.1.90'

    mysql.user: 'salt'

    mysql.pass: '123456'

    mysql.db: 'salt'

    mysql.port: 3306

    6、重启salt-master:

    [root@controller-node1 ~]# systemctl restart salt-master.service

    7、测试:

    [root@controller-node1 ~]# salt '172.16.1.91' cmd.run 'uptime' -v

    Executing job with jid 20190729112956524977

    -------------------------------------------


    172.16.1.91:

    11:29:56 up 1:09, 1 user, load average: 0.00, 0.01, 0.05

    [root@controller-node1 ~]# salt-run jobs.lookup_jid 20190729112956524977

    172.16.1.91:

    11:29:56 up 1:09, 1 user, load average: 0.00, 0.01, 0.05

    [root@controller-node1 ~]# mysql -uroot -p123456

    MariaDB [salt]> select * from salt_returnsG;

    *************************** 1. row ***************************

    fun: cmd.run

    jid: 20190729112956524977

    return: " 11:29:56 up 1:09, 1 user, load average: 0.00, 0.01, 0.05"

    id: 172.16.1.91

    success: 1

    full_ret: {"fun_args": ["uptime"], "jid": "20190729112956524977", "return": " 11:29:56 up 1:09, 1 user,

    load average: 0.00, 0.01, 0.05", "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2019-07-29T03:29:56.836808",

    "fun": "cmd.run", "id": "172.16.1.91"}alter_time: 2019-07-29 11:29:56

    8、补充:

    (1)以上的mysql返回方法是master的返回,常用;

    (2)在minion配置mysql返回,不常用:

    1)在minion上安装MySQL-python:

    [root@controller-node1 ~]# salt '*' pkg.install 'MySQL-python'

    2)在minino的配置文件中添加如下参数:

    [root@slave-node1 ~]# vim /etc/salt/minion

    #return: mysql

    mysql.host: '172.16.1.90'

    mysql.user: 'salt'

    mysql.pass: '123456'

    mysql.db: 'salt'

    mysql.port: 3306

    2)在命令行使用'--return mysql参数指定返回':

    [root@controller-node1 ~]# salt '172.16.1.91' cmd.run 'uptime' --return mysql

    4.10、



















  • 相关阅读:
    Java可变参数
    为什么static方法中不可以调用非static方法
    用注解@DelcareParents实现引用增强
    在SpringBoot中用SpringAOP实现日志记录功能
    梳理一下我理解的aop
    包裹iframe的div与iframe存在高度差的问题解决方案
    非跨域情况下iframe 高度自适应的问题解决(一)
    flex布局较之float布局的优点新发现
    webpack4 动态导入文件 dynamic-import 报错的解决方法
    vue chrome 浏览器调试工具devtools插件安装
  • 原文地址:https://www.cnblogs.com/LiuChang-blog/p/12324212.html
Copyright © 2020-2023  润新知