zoukankan      html  css  js  c++  java
  • saltstack高效运维

    salt介绍

    saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。在市面上,如同salt的批量管理工具ansible、fabric、puppet、chef、ansible。

    saltstack的运行方式

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

    salt部署基本架构

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

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

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

    服务器环境准备

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

    ip地址

    192.168.11.92 192.168.11.231

    身份

    master slave

    软件包

    salt-master salt-minion

    关闭服务器安全策略

    关闭firewalld
    systemctl disable firewalld
    systemctl stop firewalld
    
    关闭iptables
    iptables -F
    
    关闭selinux

    安装saltstack

    在master机器安装
    yum install salt-master
    在minion机器安装 yum install salt
    -minion

    两台机器的环境配置

    1.确保机器通信
    2.修改两台机器的/etc/hosts强制解析(公司会搭建一个私有dns服务器,dnsmasq)

    master
    /etc/hosts
    192.168.11.231  slave
    
    slave
    /etc/hosts
    192.168.11.92 master

    3.关闭两台机器的防火墙策略

    准备master和minion的配置文件

    master

    [root@master ~]# cat /etc/salt/master
    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  #日志文件地址

    slave

    [root@localhost yum.repos.d]# cat /etc/salt/minion 
    master: master
    master_port: 4506
    user: root # salt运行的用户,影响到salt的执行权限
    id: bbn
    acceptance_wait_time:
    10
    log_file:
    /var/log/salt/minion

    注意光标大小一致,不一致会导致启动失败!!!

    分别启动这两个服务端

    systemctl start salt-master
    systemctl start salt-minion

    在master上接收minion秘钥

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

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

    如果不能正常出现Unaccepted Keys,多重启几遍服务

    检查master和slave的秘钥匹配

    主人机器输入:
    salt-key -f  qishiminion
    儿子机器输入:
    salt-call --local key.finger

    初次通信,在master节点上,接受minion的秘钥

    salt-key -a  bbn  #这个命令,是单独接受秘钥

    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自动接受请求

    日常命令参数

    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端

    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机器监控存活

    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' bbn: slave ------------------------------------------- Summary ------------------------------------------- # of Minions Targeted: 1 # of Minions Returned: 1 # of Minions Did Not Return: 0 -------------------------------------------

    列出所有salt的sys模块

    [root@master 192.168.11.72 ~]$salt 'bbn' sys.list_modules

    远程执行命令模块

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

     

    [root@master 192.168.11.72 ~]$salt 'bbn' 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 'bbn' pkg.install "nginx"
    #卸载minion上的nginx
    [root@master 192.168.11.72 ~]$salt 'bbn' pkg.remove "nginx"
    #检查pkg包的版本
    [root@master 192.168.11.72 ~]$salt 'bbn' pkg.version "nginx"

    远程管理服务模块

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

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

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

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

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

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

    目标定位字符串

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

    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正则表达式

    Salt采集静态信息之Grains

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

    Grains

    Grains人为是描述minion本身固有的静态属性数据,列出主机所有Grains数据
    
    
    [root@master 192.168.11.72 ~]$salt 'bbn' grains.items
    slave:
        ----------
        SSDs:
        biosreleasedate:
            05/19/2017
        biosversion:
            6.00  
    信息过长,已经省略
    salt 'bbn' grains.ls  #列出所有grains方法

    检索某些数据

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

    利用Grains静态信息定位主机

    两种写法:
    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数据

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

    在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

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

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

    1.方法一,清空值
    [root@master 192.168.11.72 ~]$salt 'bbn' grains.delval cpu_info
    slave:
        None
    [root@master 192.168.11.72 ~]$salt 'bbn' 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
    检查结果删除成功

    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}
     
  • 相关阅读:
    [每日一题2020.06.23]leetcode #16 双指针
    typora+picgo+jsdeliver+github打造免费高效的博客图床
    [javaSE笔记5]String
    [javaSE笔记4] ArrayList
    [javaSE笔记3] JAVA的继承---多态 抽象
    [每日一题2020.06.22]leetcode #11 双指针
    操作系统---设备管理
    [每日一题2020.06.21]leetcode #124 DFS二叉树
    操作系统---磁盘
    PC实用工具推荐
  • 原文地址:https://www.cnblogs.com/yidashi110/p/10289530.html
Copyright © 2011-2022 走看看