目录
  1. 1. SaltStack安装
    1. 1.0.1. 安装问题集
  • 2. SaltStack配置
    1. 2.0.1. salt-master 配置
    2. 2.0.2. salt-minion 配置
  • 3. SaltStack 认证
  • 4. SaltStack 批量管理
  • 5. SaltStack 配置管理
    1. 5.1. top.sls
    2. 5.2. SLS文件——statefile
      1. 5.2.1. SLS文件规则
      2. 5.2.2. 实例分析
      3. 5.2.3. 推送执行SLS配置管理
  • 6. 获取minion信息——grains & pillar
    1. 6.0.1. grains
    2. 6.0.2. pillar
  • 7. SaltStack 模块
    1. 7.0.1. 系统模块
    2. 7.0.2. 自定义模块
    3. 7.0.3. 自定义returners
  • 8. 计划任务
  • 9. 关于saltstack无返回信息的问题
    1. 9.1. 关于jid
  • SaltStack安装

     各Linux版本安装详见官方安装文档
     以下都是在CentOS 6.4 64bit系统上进行。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $> rpm --import https://repo.saltstack.com/yum/redhat/6/x86_64/latest/SALTSTACK-GPG-KEY.pub

    /etc/yum.repos.d/saltstack.repo
    [saltstack-repo]
    name=SaltStack repo for RHEL/CentOS $releasever
    baseurl=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest
    enabled=1
    gpgcheck=1
    gpgkey=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest/SALTSTACK-GPG-KEY.pub

    #选择需要的安装
    $> yum install salt-master
    $> yum install salt-minion
    $> yum install salt-ssh
    $> yum install salt-syndic
    $> yum install salt-cloud

    安装问题集

    1. 缺少psutil模块
      AttributeError: ‘module’ object has no attribute ‘get_sysinfo’

      1
      2
      3
      $> pip install psutil
      #若提示python版本过低则
      $> pip install psutil --upgrade
    2. IPV6地址不可达导致无法安装
      关闭IPv6

      • 永久关闭
        修改/etc/sysctl.conf配置文件,加入如下内容

        1
        2
        3
        4
        5
        6
        #shutdown IPv6
        net.ipv6.conf.all.disable_ipv6 = 1
        net.ipv6.conf.default.disable_ipv6 = 1

        #生效配置
        $> sysctl -p
      • 临时关闭

        1
        2
        echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
        echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6

    SaltStack配置

    salt-master 配置

     salt-master监听端口:

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

     默认配置文件:/etc/salt/master
    nodegroups定义规则:

    • G – Grains glob匹配,例如:G@os:Ubuntu
    • E – minion 正则表达式匹配,例如:E@web\d+.(dev|qa|prod).loc
    • P – Grains PCRE 正则表达式匹配,例如:P@os:(RedHat|Fedora|CentOS)
    • L – minion 列表匹配,例如:L@minion1.example.com,minion3.domain.com or bl*.domain.com
    • I – Pillar glob单个匹配,例如:I@pdata:foobar
    • S – 子网/IP 匹配,例如:S@192.168.1.0/24 or S@192.168.1.100
    • R – Range cluster客户端范围匹配,例如: R@%foo.bar
    • D – minion data匹配,例如:D@key:value
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    interface: 0.0.0.0
    #自动通过salt-minion认证
    auto_accept: True
    log_file: /var/wwwlog/saltstack/master.log
    key_logfile: /etc/salt/key
    nodegroups:
    centos7: 'L@centos7.10.0.2.222'
    tool: 'L@tserver.10.0.6.5,tclient.10.0.6.6'
    all: 'N@tool or N@centos7'

    #启动salt-master
    $> /etc/init.d/salt-master start

     按照nodegroups分组批量管理(新增nodegroups定义后不需要重启salt-master)

    1
    2
    3
    4
    5
    6
    $> salt –N tool test.ping

    tclient.10.0.6.6:
    True
    tserver.10.0.6.5:
    True

    salt-minion 配置

     默认配置文件:/etc/salt/minion
     salt-minion的id比较重要,可用于salt-master指定nodegroups分组等用途。

    1
    2
    3
    4
    5
    6
    master: 10.0.2.233
    id: tserver.10.0.6.5
    log_file: /var/wwwlog/saltstack/minion.log
    key_logfile: /etc/salt/key

    $> /etc/init.d/salt-minion start

    SaltStack 认证

     皆在salt-master端

    • 查看

      1
      salt-key –L
    • 接受

      1
      salt-key –a minion_id
    • 接受所有

      1
      salt-key –A

      master设置自动接受所有:/etc/salt/master——auto_accept: True

    • 测试连通

      1
      2
      salt '*' test.ping
      salt '*' test.ping –t 15 (-t 设置超时时间)
    • Debug

      1
      salt -N tool test.ping -v -l all
    • 删除minion

      1
      salt-key -d minion_id
    • 认证过程

      1. minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(privatekey)和minion.pub(publickey),然后将minion.pub发送给master。
      2. master在接收到minion的publickey后,通过salt-key命令acceptminionpublickey,这样在master的/etc/salt/pki/master/minions下的将会存放以minionid命名的publickey,然后master就能对minion发送指令了。

    SaltStack 批量管理

    • 远程执行命令

      1
      salt '*' cmd.run 'bash --version'
    • 远程执行指定语言的命令

      1
      2
      3
      4
      5
      6
      #salt ‘目标’ 执行语言 对应语言的代码
      salt 'centos7.10.0.2.222' cmd.exec_code python 'print "test"'
      salt 'centos7.10.0.2.222' cmd.exec_code bash 'echo "test"'

      centos7.10.0.2.222:
      test
    • 从master批量复制文件到minion
       源文件目录可在master配置文件中指定,默认路径为/srv/salt/

      1
      2
      3
      file_roots:
      base:
      - /srv/salt/
      1
      2
      #必须指定到文件
      salt '*' cp.get_file salt://vimrc /etc/vimrc

       或者直接用salt-cp命令

      1
      salt-cp -N tool sh/*.sh /tmp/
    • minion远程下载master脚本并执行
       master端脚本存放路径:/srv/salt/scripts(/srv/salt同上的file_roots设置)
       minion默认脚本存放路径:/var/cache/salt/minion/files/base/scripts/

      1
      salt \* cmd.script salt://scripts/test.sh

    SaltStack 配置管理

    top.sls

    top.sls是配置管理的入口文件,若使用state.highstate则会根据top.sls的内容将statefile推送到salt-minion并执行;若是直接指定statefile则可不根据top.sls。在salt-master主机上,默认存放在/srv/salt/top.sls(/etc/salt/master——file_roots)
    top.sls文件结构:

    • basetop.sls默认从base标签开始解析执行。
    • 操作目标:需要执行操作的salt-minion目标。可以通过正则grain模块分组名来进行匹配。
    • statefile:需要执行的state文件。指定statefile不需要包含扩展名(.sls),详见下节内容。

     top.sls文件样例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    base:
    tool: #nodegroup分组名指定目标
    - match: nodegroup #指定匹配类型为nodegroup
    - statefile.apache #state文件:/srv/salt/statefile/apache.sls

    'centos7.10.0.2.222': #直接指定minion_id目标
    - statefile.nginx

    'os:CentOS': #通过grain指定目标
    - match: grain #指定匹配类型为grain
    - statefile.git

    '*': #目标为所有minion
    - statefile.all

    SLS文件——statefile

    SLS文件规则

    • SLS文件的扩展名.sls被省略。 (例如:nginx.sls 变成 nginx)
    • 若有子目录,子目录都由一个点来表示.(例如 statefile/nginx.sls写成 statefile.nginx)
    • 若子目录下存在init.sls文件,引用的时候仅指定该目录即可. (例如 statefile/init.sls 可以简称为 statefile)
    • 若一个目录下同时存在statefile.slsstatefile/init.sls,那么 statefile/init.sls 将被忽略,SLS文件引用的statefile将只引用statefile.sls
    • 缩进严格按照python标准,且不要用tab做缩进而应用空格!

    实例分析

     通过具体实例分析statefile(hexo会对markdown显示有些影响)

    1. cmd.script

      1
      2
      3
      4
      5
      cmdscript:
      cmd.script:
      - source: salt://scripts/test.sh
      - user: root
      - shell: /bin/bash
      • cmdscript:ID标签定义
      • cmd.script:使用saltstack的cmd.script模块
        • source: 指定master端脚本存放路径,minion从master上下载并执行。master上物理存放路径:/srv/salt/scripts/test.sh
        • user:指定执行脚本的用户
        • shell:指定执行脚本的shell
    2. cmd.run

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      cmdrun:
      cmd.run:
      - cwd: /tmp
      - name: pwd;uptime

      cmdrun2:
      cmd.run:
      - cwd: /tmp
      - names:
      - pwd
      - uptime

    3. cmd.wait

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      cmdwait:
      cmd.wait:
      - names:
      - /usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload
      - watch:
      - file: /usr/local/nginx/conf/vhosts/cmdwait.conf

      /usr/local/nginx/conf/vhosts/cmdwait.conf:
      file.managed:
      - source: salt://configfile/cmdwait.conf
      - backup: minion
      • cmd.wait:条件执行命令,满足条件后才执行names中的命令。
      • watch:文件监控(监控文件是否存在或变化),此处监控salt-minion上file指定的文件且作为cmd.wait的条件。
      • file.managed:文件管理
        • /usr/local/nginx/conf/vhosts/cmdwait.conf:salt-minion上文件路径,同步来自salt-master上指定的文件。
        • source:salt-master上的文件,如果此文件有变化推送SLS配置管理时会立即同步到salt-minion上。
        • backup:指定salt-minion在同步文件前先备份原有文件,默认备份路径/var/cache/salt/minion/file_backup
    4. Apache配置管理实例
       若要使用service则需要有/etc/init.d/httpd脚本

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      apache:
      pkg:
      - name: httpd
      - installed

      service:
      - name: httpd
      - running
      - enable: True
      - reload: True
      - watch:
      - file: /etc/httpd/conf/httpd.conf
      - require:
      - pkg: httpd

      /etc/httpd/conf/httpd.conf:

      file.managed:
      - source: salt://configfile/httpd.conf
      - backup: minion

    5. unless & onlyif
       unless——当命令执行返回’False’时,执行name里的命令;onlyif相反

      1
      2
      3
      4
      apacheStart:
      cmd.run:
      - name: service httpd start
      - unless: ps aux|grep httpd|grep -v grep|grep -v 'bash -c'
    6. 使用saltstack批量配置vim
       statefile:/srv/salt/statefile/vimConfig.sls
       推送执行vimConfig.slssalt -G os:CentOS state.sls statefile.vimConfig

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      vimInstall:
      pkg.installed:
      - names:
      - vim-enhanced
      - unzip

      vimDownload:
      file.managed:
      - name: /home/work/software/AutoConfigVim.zip
      - source: salt://software/AutoConfigVim.zip
      - unless: test -e /home/work/software/AutoConfigVim.zip
      - require:
      - pkg: vimInstall

      vimUnzip:
      cmd.run:
      - cwd: /home/work/software
      - name: unzip -q AutoConfigVim.zip
      - unless: test -e /home/work/software/AutoConfigVim
      - require:
      - file: vimDownload

      vimScript:
      cmd.run:
      - cwd: /home/work/software/AutoConfigVim
      - name: bash AutoConfigVim.sh
      - onlyif: test -e /home/work/software/AutoConfigVim/AutoConfigVim.sh
      - require:
      - cmd: vimUnzip

    推送执行SLS配置管理

    1. 根据top.sls的内容,将全部statefile文件推送到指定minion并执行

      1
      salt –N tool state.highstate
    2. 不根据top.sls,只将特定的statefile(statefile/cmdscript.sls)推送到指定minion并执行(-v 查看执行反馈)

      1
      salt -N tool state.sls statefile.cmdscript –v

    获取minion信息——grains & pillar

    grainspillar都可用于获取minion的信息,但两者有很多不同的地方需要注意。

    • grains

      1. minion每次启动时采集minion信息并向master汇报
      2. grains用于存储静态、不常变化的信息数据
      3. grains存储在minion本地
      4. minion可对grains进行操作(新增、删除等)
    • pillar

      1. pillar用于存储敏感或常变化的信息数据
      2. pillar存储在master本地
      3. minion只能对自己的pillar进行查询的权限,无法修改。

    grains

    • 查看minion所有信息

      1
      salt -N tool grains.items
    • 列出所有查看项目

      1
      salt -N tool grains.ls
    • 查看特定项目

      1
      salt -N tool grains.item ipv4
    • 自定义信息项
      mkdir -p /srv/salt/_grains目录下编写脚本,返回时必须为字典
       salt-master端:/srv/salt/_grains/getNginxVer.py

      1
      2
      3
      4
      5
      6
      7
      8
      import commands

      def getNginxVer():
      """get minion nginx version"""
      ngxver = {}
      ngxV = commands.getoutput('/usr/local/nginx/sbin/nginx -V')
      ngxver['nginxversion'] = ngxV.split('\n')[0].split('/')[-1]
      return ngxver

       自定义grains脚本同步到minion:会将_grains目录下的文件全部同步到minion

      1
      salt ‘*’ saltutil.sync_grains

      获取自定义grains信息项:

      1
      salt ‘*’ grains.item nginxversion

    pillar

    • 查看默认pillar

      1
      salt -N tool pillar.data

       默认pillar路径(pillar_roots):/srv/pillar
       组织pillar文件、pillar入口文件:/srv/pillar/top.sls
       pillar和SLS一样拥有自己的top.sls文件,通过top.sls文件作为入口,组织其它的pillar文件。
       自定义pillar待了解。

    SaltStack 模块

    系统模块

     最新在线系统模块查询:saltstack系统模块
     命令查询在线doc:

    1
    salt \* sys.doc disk

     系统模块如:

    1
    2
    salt ‘*’ test.ping
    salt ‘*’ disk.usage

    自定义模块

    • 默认模块存放路径
      /srv/salt/_modules

    • 自定义模块样例——/srv/salt/_modules/custom.py

      1
      2
      def test():
      return 'This is saltstack custom module test.'
    • 同步自定义模块到minion
       此操作会将master上/srv/salt/_modules目录下的所有目录及文件同步到minion上的/var/cache/salt/minion/files/base/_modules目录下。(包括隐藏文件)

      1
      salt \* saltutil.sync_modules
    • 执行自定义模块

      1
      salt \* custom.test

    自定义returners

    • 默认模块存放路径
      /srv/salt/_returners

    • 自定义returner样例——/srv/salt/_returners/writefile.py

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      #!/usr/bin/python2.7
      #coding: utf-8

      def __virtual__():
      """调用时用的名字"""
      return "writefile"


      def returner(result):
      """将minion的return写入到文件"""
      fd = open('/tmp/saltReturn.txt', 'a+')
      fd.write(str(result))
      fd.close()
    • 同步自定义returner

      1
      salt \* saltutil.sync_returners
    • 调用自定义returner:

      1
      salt -N centos7 cmd.run 'uptime' --return writefile

    计划任务

     默认情况下,时间参数都是*,执行用户是”root”,当修改一个当前存在的cron job,这个名字的声明必须是全局唯一的,否则会自动新增crontab job!
     如果cron的命令(name)被修改,只会新增cron job不会更新!!

    定时任务样例——crontab.sls

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    cronScriptFile:
    file.managed:
    - name: /home/work/script/cron.sh
    - source: salt://scripts/cron.sh

    crontab20141020:

    cron.present:
    - name: bash /home/work/script/cron.sh >> /dev/null 2>&1
    - user: root
    - minute: random
    - hour: '*/2'
    - require:
    - file: cronScriptFile

    关于saltstack无返回信息的问题

     saltstack用一段时间后发现一个非常严重的问题。当salt-master执行命令时,部分salt-minion并没有返回任何信息,无论是成功还是失败信息都没有。这导致无法确定salt-minion是否执行了命令还是返回信息丢失,这样的不可控性对Ops来说是个非常严重的问题。
     为解决此问题根据jid查看salt-minion的执行情况。当salt-master执行命令时加上-v参数,让其返回任务的jid。若有salt-minion没有返回信息则根据此jid查询任务结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $> salt -v \* cmd.run 'echo "jid test"'
    Executing job with jid 20160225103117255324
    -------------------------------------------

    centos7.10.0.2.222:
    jid test
    tserver.10.0.6.5:
    jid test
    tclient.10.0.6.6:
    jid test

    $> salt-run jobs.lookup_jid 20160225103117255324
    centos7.10.0.2.222:
    jid test
    tclient.10.0.6.6:
    jid test
    tserver.10.0.6.5:
    jid test

     假若管理的salt-minion达到一定数量,可使用--async参数异步执行命令,然后根据jid查询执行结果。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    $> salt --async \* cmd.run 'echo "jid test"'
    Executed command with job ID: 20160225104129665398

    $> salt-run jobs.lookup_jid 20160225104129665398
    centos7.10.0.2.222:
    jid test
    tclient.10.0.6.6:
    jid test
    tserver.10.0.6.5:
    jid test

    关于jid

     salt-master每执行一次salt命令就会产生一个Job,每个Job会有一个唯一的jid
    jid: job id, 格式为%Y%m%d%H%M%S%f
     salt-master在下发指令消息时, 会附带上产⽣的jid. salt-minion接收到指令开始执⾏时, 会在本地cachedir(默认是/var/cache/salt/minion/proc)下以该jid命名产生⽂件,⽤于在执⾏过程中master查看当前任务的执⾏情况. 指令执⾏完毕将结果传送给master后并删除该临时⽂件⽂件。
     salt-master将salt-minion的执⾏结果存放在本地/var/cache/salt/master/jobs目录下, 默认缓存24⼩时(可通过修改master配置⽂件keep_jobs选项调整)

    Powered: Hexo, Theme: Nadya remastered from NadyMain