saltstack笔记

作者: 小宝瓜 | 来源:发表于2017-05-16 10:07 被阅读192次

    一、saltstack是什么?

    saltstack是一个开源异构平台基础设置管理工具。

    二、saltstack能干什么?

    如果你是一个管理成百上千台服务器的管理员,你是否会遇到如下几个场景?
    1.需要在每台服务器上部署agent,几百台服务器难道一个一个部署?
    2.agent配置需要变更,也需要一个一个配置?
    3.0day漏洞爆出,需要检查服务器版本,安装对应补丁,怎么办?

    • 配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的包被安装,指定的服务在运行)。
    • 分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据。

    为什么要使用salt?

    • 简单,非常容易设置和维护,不用考虑项目的大小。几乎不改动配置就可以工作。
    • 并行执行,命令发送到远程系统是并行的而不是串行的,使用安全的加密协议,使用最小最快的网络载荷,提供简单的编程接口。
    • 灵活易扩展,使用python开发,可以从简单的Python API调用,或者从命令行被调用,可以用来执行一次性命令,也可以作为一个更大的应用程序的一个组成部分。

    三、saltstack运行方式?

    saltstack三种运行方式

    • Local
    • Master/Minion
    • Salt SSH

    最传统的运行方式还是C/S模式,管理端安装Master,被管理节点上安装Minion客户端。
    下面主要介绍Master/Minion运行方式。

    四、saltstack基本安装和配置

    这里采用repo源,在线安装。请参考官方文档
    分别在管理端和被管理节点使用yum命令进行安装。

      yum install salt-master
      yum install salt-minion
    

    安装完成之后,首先启动master

      service salt-master start
      #或者
      /etc/init.d/salt-master start
    

    打开minion节点,编辑配置文件

      vim /etc/salt/minion
      #添加下面配置,注意分号后面有空格!
      master: 192.168.252.136 #master端ip,有dns解析也可以填写域名。
      id: web137 #本节点名称,填好之后尽量不要更改。
    

    启动minion

      service salt-minion start
    

    切换到master

      #查看minion
      salt-key -L
      #会列如下信息
      [root@localhost ~]# salt-key #省略-L也行。
      Accepted Keys:
      Denied Keys:
      Unaccepted Keys:
      web137
      Rejected Keys:
      #接受minion
      salt-key -a web137 -y # -a 后面指定要接受的id名称
      或者
      salt-key -A # -A表示接受所有,同理,可以使用 -d ,-D拒绝掉。
      #再次查看
      [root@localhost ~]# salt-key -L
      Accepted Keys:
      web137
      Denied Keys:
      Unaccepted Keys:
      Rejected Keys:
    

    至此,一个简单的saltstack环境就已经搭建好了。

    一些注意事项和说明:
    a) master使用两个端口和minion通信,要确保这两个端口通信正常。

    • 4505 publish_port 消息发布系统端口
    • 4506 ret_port 客户端与服务端通信端口

    可以关闭掉防火墙,或者将端口添加至INPUT链表。

      #iptables链表规则是自上而下,这里插入在REJECT ALL之前。  
      iptables -I INPUT 5 -p tcp --dport 4505 -j ACCEPT -m comment --comment "salt_publish_port"
      iptables -I INPUT 5 -p tcp --dport 4506 -j ACCEPT -m comment --comment "salt_ret_port"
    

    当然也可以在配置文件自定义端口。

      #master配置文件
      vim /etc/salt/master
      #修改如下配置,注意空格!
      publish_port: 1505
      ret_port: 1506
      #修改成自定义的端口即可,注意,minion节点也需要指定master端口。
      #minion配置文件
      vim /etc/salt/minion
      #配置如下
      master_port: 1506 #指定master通信端口即可
    

    b) minion和master认证过程
    1.minion在首次启动时,会在/etc/salt/pki/minion/下自动生成公钥和私钥
    minion.pub(public key)和minion.pem(private key),并将公钥(minion.pub)发送给master
    2.master在接收到minion的公钥后,通过salt-key命令接受minion,并将minion公钥
    放在/etc/salt/pki/master/minions下,以minion id命名。这个时候,master就可以对minion发送指令了。
    也可以配置为自动接受

      #master配置
      vim /etc/salt/master
      #配置如下
      auto_accept: True #修改为自动接受
    

    五、saltstack简单应用

    salt命令格式

      salt '<操作目标>' <模块.方法> [参数]
    

    引号中的操作目标,可以使用正则和通配符过滤、筛选。

    • salt 'shell正则' 命令
      //使用通配符

    • salt -E 'prel正则' 命令
      //使用正则表达式

    • salt -N $group 命令
      //使用分组名称
      可以在配置文件进行分组

      #编辑master文件
      vim /etc/salt/master
      #配置如下
      nodegroups:
        group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com and bl*.domain.com'
        group2: 'G@os:Debian and foo.domain.com'
      
    • salt -L 'server_id1,server_id2,server_id3' 命令
      //指定多个目标id

    • salt -G 'osrelease:6.9' 命令
      //指定os版本为6.9

    示例:test.ping、cmd.run

      #检测通讯是否正常
      salt '*' test.ping
      #test.ping
      [root@localhost ~]# salt '*' test.ping  
      web137:
          True
      mysql138:
          True
    
      #执行命令
      salt '*' cmd.run 'df -Th'
      #cmd.run
      [root@localhost ~]# salt '*' cmd.run 'df -Th'
      mysql138:
        Filesystem           Type   Size  Used Avail Use% Mounted on
        /dev/mapper/VolGroup-lv_root
                             ext4    18G  968M   16G   6% /
        tmpfs                tmpfs  491M   12K  491M   1% /dev/shm
        /dev/sda1            ext4   477M   52M  400M  12% /boot
      web137:
        Filesystem           Type   Size  Used Avail Use% Mounted on
        /dev/mapper/VolGroup-lv_root
                             ext4    18G  968M   16G   6% /
        tmpfs                tmpfs  491M   12K  491M   1% /dev/shm
        /dev/sda1            ext4   477M   52M  400M  12% /boot
    

    怎么知道有哪些模块可用?怎么知道模块有哪些方法可以用、怎么用?

      #获取所有支持的模块
      salt 'web137' sys.list_modules
      #
      [root@localhost ~]# salt 'web137' sys.list_modules
      web137:
        - acl
        - aliases
        - alternatives
        - archive
        - artifactory
        后面部分省略
    
      #获取模块说明文档
      salt 'web137' sys.doc test
      #
      [root@localhost ~]# salt 'web137' sys.doc test
      'test.arg:'
    
        Print out the data passed into the function ``*args`` and ```kwargs``, this
        is used to both test the publication data and cli argument passing, but
        also to display the information available within the publication data.
        Returns {"args": args, "kwargs": kwargs}.
    
        CLI Example:
    
            salt '*' test.arg 1 "two" 3.1 txt="hello" wow='{a: 1, b: "hello"}'
        
    
      'test.arg_repr:'
    
        Print out the data passed into the function ``*args`` and ```kwargs``, this
        is used to both test the publication data and cli argument passing, but
        also to display the information available within the publication data.
        Returns {"args": repr(args), "kwargs": repr(kwargs)}.
    
        CLI Example:
    
            salt '*' test.arg_repr 1 "two" 3.1 txt="hello" wow='{a: 1, b: "hello"}'
      后面部分省略
    

    软件包的安装

      #pkg.install
      salt 'web137' pkg.install tree
      #
      [root@localhost ~]# salt 'web137' pkg.install tree
      web137:
        ----------
        tree:
            ----------
            new:
                1.5.3-3.el6
            old:
    

    pkg 函数会自动将本地系统包管理器映射到相同的salt函数。这意味着 pkg.install 在基于Red Hat系统上将使用 yum 而在Debian系统上则使用 apt 来安装包。

    grains模块说明
    grains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型、网卡ip等。

      #列出所有的 grains 项目名字
      [root@localhost ~]# salt 'web137' grains.ls
      web137:
        - SSDs
        - cpu_flags
        - cpu_model
        - cpuarch
        - domain
        - fqdn
        - fqdn_ip4
        - fqdn_ip6
        - gpus
      #列出所有的 grains 项目名以及值
      [root@localhost ~]# salt 'web137' grains.items
      web137:
        ----------
      SSDs:
      cpu_flags:
          - fpu
          - vme
          - de
          - pse
          - tsc
    
    
      #也可以在minion配置自定义信息
      #编辑minion配置,注意空格!
      vim /etc/salt/minion
      grains:
        roles:
          - webserver
          - memcache
        deployment: datacenter4
        cabinet: 13
        cab_u: 14-15
    

    有了这些信息之后,在远程执行命令时就很方便。我们可以按照 grains 的一些指标来操作。如上面提到,salt -G 'osrelease:6.9' 命令。

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

      #编辑配置文件
      vim /etc/salt/master
      #添加
      pillar_roots:
        base:
          - /srv/pillar
      #如果pillar文件夹不存在,新建文件夹
      mkdir -p /srv/pillar
      #修改配置文件后,重启一下master
      service salt-master restart
      #新建入口文件top.sls
      vim /srv/pillar/top.sls
      #添加内容
      base:
        'web137': #指定minion节点
          - web137_info
      #新建web137_info.sls文件
      vim /srv/pillar/web137_info.sls
      #添加内容,注意分号后面有空格!
      conf: /etc/web137.conf
      myname: webserver
      #刷新一下pillar状态
      salt '*' saltutil.refresh_pillar
      #查看一下
      salt 'web137' pillar.items
      #
      [root@localhost pillar]# salt 'web137' pillar.items
      web137:
          ----------
          conf:
              /etc/web137.conf
          myname:
              webserver
      #可以指定单个
      salt 'web137' pillar.item conf
      #
      [root@localhost pillar]# salt 'web137' pillar.item conf
      web137:
          ----------
          conf:
              /etc/web137.conf
      #通过 -I 也可以作为匹配信息
      salt -I 'myname:webserver' test.ping
      #
      [root@localhost pillar]# salt -I 'myname:webserver' test.ping
      web137:
          True
    

    其他杂项
    #远程传输文件,将本地文件copy到节点
    root@localhost:~# salt-cp '' ./abc.txt /opt/
    {'ftp138': {'/opt/abc.txt': True}, 'web137': {'/opt/abc.txt': True}}
    #磁盘使用
    [root@salt-master /]# salt '
    ' disk.usage
    #网络接口
    [root@salt-master /]# salt '' network.interfaces
    #文件压缩
    root@localhost:~# salt '
    ' archive.gzip /opt/abc.txt
    #文件解压缩
    root@localhost:~# salt '' archive.gunzip /opt/abc.txt.gz
    #拷贝文件到客户端
    salt '
    ' cp.get_file salt://apache.txt /tmp/cp.txt
    #拷贝目录到客户端
    salt '' cp.get_dir salt://test /tmp
    #显示存活的客户端
    salt-run manage.up
    #执行服务端脚本
    salt '
    ' cmd.script salt://test/shell.sh

    六、saltstack高级应用

    1、配置管理安装apache

      #编辑配置文件
      vim /etc/salt/master
      #添加下面配置
      file_roots:
        base:
          - /srv/salt
      #环境: base、dev(开发环境)、test(测试环境)、prod(生产环境)。
      #新建目录salt
      mkdir -p /srv/salt
      #新建top.sls文件
      vim /srv/salt/top.sls
      #添加内容
      base:
        'web137':
          - apache
      #新建apache.sls文件
      vim /srv/salt/apache.sls
      #添加,特别要注意空格!
      apache-service: #自定义id名称
        pkg.installed: #包安装函数
        - names: #如果只有一个服务 - name:httpd
          - httpd #包名
          - httpd-devel
    
      file.managed:
        - name: /etc/httpd/conf/httpd.conf #目标文件位置
        - source: salt://httpd.conf #源文件,将配置文件放在/srv/salt/目录下
        - user: root #文件所属用户
        - group: root #文件所属组
        - mode: 644 #文件权限
    
      service.running: #指定服务运行
        - name: httpd  #服务名称
        - enable: True  #设置开机自启
      #
      salt 'web137' state.highstate
      #或者直接指定文件
       salt 'web137' state.sls apache #不需要.sls
    

    2、目录操作

      #编辑top.sls文件
      vim /srv/salt/top.sls
      base:
        'mysql138' :
          - diroper
      #新建diroper文件
      vim /srv/salt/diroper.sls
      diroper:
        file.recurse:
          - name: /tmp/diroper
          - source: salt://diroper
          - user: root
          - file_mode: 644
          - dir_mode: 755
          - mkdir: True
          - clean: True #删除源文件则目标也会跟着删除
      #应用
      salt 'mysql138' state.highstate
    

    3、远程执行脚本

      #添加
      cmdexe:
        - onlyif: test -f /tmp/123.txt
        - names:
          - touch /tmp/cmdtest.txt
          - mkdir /tmp/cmdtest
        - user: root
      #添加
      shell-test:
      cmd.script:
        - source: salt://test/1.sh
        - user: root
    

    4、管理crontab
    #添加
    cron-test:
    cron.present: #把 cron.present: 改成 cron.absent为删除
    - name: /bin/touch /tmp/111.txt
    - user: root
    - minute: '' #注意星号要使用单引号
    - hour: 20
    - daymonth: 1-10
    - month: '3,5'
    - dayweek: '
    '

    七、saltstack开发

      import salt.client 
      client = salt.client.LocalClient()
      ret = client.cmd('*','test.ping')
      print ret
    

    八、总结和参考

    • 配置文件都是键值对的形式,需要特别注意空格。

    • 以上演示的是都在linux环境下部署,saltstack是可以支持多环境,但需要注意的是master不支持安装在windows环境。

    • 笔记未涉及到部分

      • windows配置、云配置
      • web界面
      • 架构中还有一个类似代理层的syndic

    参考网址

    相关文章

      网友评论

        本文标题:saltstack笔记

        本文链接:https://www.haomeiwen.com/subject/wpiotxtx.html