saltstack:grains、pillar、批量安装软件/分发文件/远程执行脚本

saltstack grains

grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡ip、内核版本、cpu架构等,grains的信息并不是动态的,并不会实时变更,它是在minion启动时收集到的,可以根据grains收集到的一些信息,做配置管理工作

列出指定minion端所有的grains项目名:

[root@linux01 ~]# salt 'linux02' grains.ls

列出指定minion端所有的grains项目名和对应的值:

[root@linux01 ~]# salt 'linux02' grains.items

自定义grains信息

在minion端添加配置文件:

[root@linux02 ~]# vi /etc/salt/grains

配置文件内容:

name: web

#grains项目名name,值web,注意值前面需要有个空格

重启minion服务:

[root@linux02 ~]# systemctl restart salt-minion

在master端获取该自定义项目的值:

[root@linux01 ~]# salt 'linux02' grains.item name
linux02:
    ----------
    name:
        web

针对自定义grains执行命令:

[root@linux01 ~]# salt -G name:web cmd.run 'hostname;uptime'
linux02:
    linux02
     14:30:53 up 21:04,  2 users,  load average: 0.40, 0.26, 0.27

说明:grains的主要作用就是针对多台属性相同的机器,设置相同的自定义grains值,实现saltstack批量执行命令,例如:多台数据库机器可以定义grains值为name:db,多台redis机器可以定义grains值为name:redis,即可通过saltstack批量操作多台机器

saltstack pillar

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

在master端编辑配置文件:

[root@linux01 ~]# vim /etc/salt/master

去掉以下配置项前面的注释:
在这里插入图片描述
#保持默认的第二行2个空格,第三行4个空格,否则会出错

创建配置文件目录:

[root@linux01 ~]# mkdir /srv/pillar

创建子配置文件:

[root@linux01 ~]# vi /srv/pillar/test.sls

配置文件内容:

name: db

继续创建子配置文件:

[root@linux01 ~]# vi /srv/pillar/test2.sls

配置文件内容:

name: server

创建主配置文件:

[root@linux01 ~]# vi /srv/pillar/top.sls

文件内容:

base:
  'linux02':
    - test
  'linux01':
    - test2

#指定主机名hostname绑定对应的子配置文件,需要注意格式:主机名前面2个空格,子配置文件名前面4个空格

刷新pillar:

[root@linux01 ~]# salt '*' saltutil.refresh_pillar
linux02:
    True
linux01:
    True

验证:

[root@linux01 ~]# salt '*' pillar.item name
linux02:
    ----------
    name:
        db
linux01:
    ----------
    name:
        server

用作salt工具的匹配对象,批量操作多台机器:

[root@linux01 ~]# salt -I name:db cmd.run 'who'
linux02:
    root     pts/0        Dec 26 16:59 (192.168.234.1)
    root     pts/1        Dec 27 13:47 (192.168.234.1)

注意:当自定义grains或pillar项含义特殊符号时,用作salt工具匹配时,需要使用单引号括起来

saltstack批量安装软件包

在master端编辑配置文件:

[root@linux01 ~]# vi /etc/salt/master

去掉以下配置项的注释:
在这里插入图片描述
创建配置文件目录:

[root@linux01 ~]# mkdir /srv/salt

以批量安装Apache为例,创建子配置文件:

[root@linux01 ~]# vi /srv/salt/httpd.sls

配置文件内容:

httpd-service:
  pkg.installed:
    - names:  
      - httpd
      - httpd-devel
  service.running:
    - name: httpd
    - enable: True

说明:httpd-service自定义的名字,pkg.installed 为saltstack的包安装函数,names下面是要安装的包的名字,service.running也是一个saltstack的函数,表示要启动的服务,enable表示开机启动

创建主配置文件:

[root@linux01 ~]# vi /srv/salt/top.sls

配置文件内容:

base:
  '*':
    - httpd

#*号表示所有主机,httpd为子配置文件名称

重启master服务:

[root@linux01 ~]# systemctl restart salt-master

在指定的minion端安装:

[root@linux01 ~]# salt linux02 state.highstate
linux02:
----------
          ID: httpd-service
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: All specified packages are already installed
     Started: 15:58:40.565875
    Duration: 2126.73 ms
     Changes:   
----------
          ID: httpd-service
    Function: pkg.installed
        Name: httpd-devel
      Result: True
     Comment: All specified packages are already installed
     Started: 15:58:42.693203
    Duration: 43.204 ms
     Changes:   
----------
          ID: httpd-service
    Function: service.running
        Name: httpd
      Result: True
     Comment: The service httpd is already running
     Started: 15:58:42.739355
    Duration: 107.608 ms
     Changes:   

Summary for linux02
------------
Succeeded: 3
Failed:    0
------------
Total states run:     3
Total run time:   2.278 s

在minion端查看进程:

[root@linux02 ~]# ps aux |grep httpd
root     18385  0.1  0.4 224056  5012 ?        Ss   15:57   0:00 /usr/sbin/httpd -DFOREGROUND
apache   18410  0.0  0.2 224056  2944 ?        S    15:57   0:00 /usr/sbin/httpd -DFOREGROUND
apache   18411  0.0  0.2 224056  2944 ?        S    15:57   0:00 /usr/sbin/httpd -DFOREGROUND
apache   18412  0.0  0.2 224056  2944 ?        S    15:57   0:00 /usr/sbin/httpd -DFOREGROUND
apache   18413  0.0  0.2 224056  2944 ?        S    15:57   0:00 /usr/sbin/httpd -DFOREGROUND
apache   18418  0.0  0.2 224056  2944 ?        S    15:57   0:00 /usr/sbin/httpd -DFOREGROUND
root     18575  0.0  0.0 112728   972 pts/1    R+   15:58   0:00 grep --color=auto httpd

#安装成功,在多台机器安装只需将匹配对象改为*或者使用自定义的grains/pillar项即可

saltstack批量分发文件

当多台机器的某个配置文件需要更改时,通过saltstack批量分发新的配置文件到所有机器上

在master端添加测试文件:

[root@linux01 ~]# echo "ok" > /srv/salt/1.txt

创建子配置文件:

[root@linux01 ~]# vi /srv/salt/file.sls

配置文件内容:

file_test:
  file.managed:
    - name: /tmp/test.conf
    - source: salt://1.txt
    - user: root
    - group: root
    - mode: 600

说明:第一行的file_test为自定义的名字,表示该配置段的名字,将master端/srv/salt/1.txt文件分发到minion端的/tmp目录下,并命名为test.conf,如果minion端已存在test.conf,则会更新该文件的内容

编辑主配置文件:

[root@linux01 ~]# vi /srv/salt/top.sls 

内容:

base:
  '*':
    - file

#指定子配置文件名

分发到指定的主机:

[root@linux01 ~]# salt 'linux02' state.highstate
linux02:
----------
          ID: file_test
    Function: file.managed
        Name: /tmp/test.conf
      Result: True
     Comment: File /tmp/test.conf updated
     Started: 16:42:34.248497
    Duration: 147.453 ms
     Changes:   
              ----------
              diff:
                  New file

Summary for linux02
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 147.453 ms

在minion端查看即可显示:

[root@linux02 ~]# ll /tmp/test.conf 
-rw------- 1 root root 3 12月 27 16:42 /tmp/test.conf
[root@linux02 ~]# cat !$
cat /tmp/test.conf
ok

saltstack批量分发目录

创建测试目录:

[root@linux01 ~]# mkdir /srv/salt/test
[root@linux01 ~]# touch /srv/salt/test/aaa.txt

创建子配置文件:

[root@linux01 ~]# vi /srv/salt/dir.sls

配置文件内容:

file_dir:
  file.recurse:
    - name: /tmp/abc
    - source: salt://test
    - user: root
    - file_mode: 640
    - dir_mode: 750
    - mkdir: True
    - clean: True

说明:引用的是saltstack的recurse模块,将master端的/srv/salt/test/目录分发到指定的minion端的/tmp目录下并命名为abc,minion端该目录权限为750,目录中的文件权限为640;如果minion端没有这个目录,则自动创建;如果有,直接覆盖;clean:true表示当master端的源目录删除时,minion端也删除

编辑主配置文件:

[root@linux01 ~]# vi /srv/salt/top.sls 

指定子配置文件名:

base:
  '*':
    - dir

分发到指定主机:

[root@linux01 ~]# salt 'linux02' state.highstate
linux02:
----------
          ID: file_dir
    Function: file.recurse
        Name: /tmp/abc
      Result: True
     Comment: Recursively updated /tmp/abc
     Started: 01:41:56.618491
    Duration: 202.749 ms
     Changes:   
              ----------
              /tmp/abc:
                  ----------
                  /tmp/abc:
                      ----------
                      mode:
                          0750
                  mode:
                      0750
              /tmp/abc/aaa.txt:
                  ----------
                  diff:
                      New file
                  mode:
                      0640
              removed:
                  - /tmp/abc/bbb.txt

Summary for linux02
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 202.749 ms

在minion端查看目录:

[root@linux02 ~]# ll -d /tmp/abc
drwxr-x--- 2 root root 21 12月 28 01:41 /tmp/abc
[root@linux02 ~]# ll  /tmp/abc
-rw-r----- 1 root root 0 12月 28 01:41 aaa.txt

补充:如果分发的目录中没有文件,为空目录,则不会分发成功,saltstack会忽略为空的目录

saltstack批量远程执行脚本

在salt根目录下创建脚本:

[root@linux01 ~]# vim /srv/salt/1.sh

脚本内容:

#!/bin/bash
if [ ! -d /tmp/shell_test ]
then
    mkdir /tmp/shell_test
fi

创建子配置文件:

[root@linux01 ~]# vi /srv/salt/shell.sls

配置文件内容:

shell_test:
  cmd.script:
    - source: salt://1.sh
    - user: root

#指定要在远程minion端上执行的脚本为/srv/salt/1.sh

编辑主配置文件:

[root@linux01 ~]# vi /srv/salt/top.sls

指定子配置文件名:

base:
  '*':
    - shell 

在指定minion端执行脚本:

[root@linux01 ~]# salt 'linux02' state.highstate
linux02:
----------
          ID: shell_test
    Function: cmd.script
      Result: True
     Comment: Command 'shell_test' run
     Started: 02:01:51.753030
    Duration: 57.968 ms
     Changes:   
              ----------
              pid:
                  19724
              retcode:
                  0
              stderr:
              stdout:

Summary for linux02
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time:  57.968 ms

在minion端查看shell中指定的文件是否已被创建:

[root@linux02 ~]# ll -d /tmp/shell_test/
drwxr-xr-x 2 root root 6 12月 28 02:01 /tmp/shell_test/

saltstack批量创建cron任务计划

在salt根目录下创建子配置文件:

[root@linux01 ~]# vi /srv/salt/add_cron.sls

配置文件内容:

cron_test:
  cron.present:
    - name: /bin/touch /tmp/test_cron.txt
    - user: root
    - minute: '*'
    - hour: 20
    - daymonth: '*'
    - month: '*'
    - dayweek: '*'

修改主配置文件:

[root@linux01 ~]# vi /srv/salt/top.sls

指定子配置文件:

base:
  '*':
    - add_cron

在指定的minion端创建任务计划:

[root@linux01 ~]# salt 'linux02' state.highstate
linux02:
----------
          ID: cron_test
    Function: cron.present
        Name: /bin/touch /tmp/test_cron.txt
      Result: True
     Comment: Cron /bin/touch /tmp/test_cron.txt added to root's crontab
     Started: 02:29:23.429625
    Duration: 408.538 ms
     Changes:   
              ----------
              root:
                  /bin/touch /tmp/test_cron.txt

Summary for linux02
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 408.538 ms

在minion端查看任务计划:

[root@linux02 ~]# crontab -l
# Lines below here are managed by Salt, do not edit
# SALT_CRON_IDENTIFIER:/bin/touch /tmp/test_cron.txt
* 20 * * * /bin/touch /tmp/test_cron.txt

#前两行注释为salt自动生成,不能修改,否则会导致下次使用salt变更任务计划时出错,如果需要改动定时任务时间,直接在master端修改/srv/salt/add_cron.sls文件,再执行salt ‘linux02’ state.highstate即可

删除任务计划,修改子配置文件内容为:

cron.absent:
  - name: /bin/touch /tmp/test_cron.txt

#修改后再次执行 salt xxx state.highstate即可

saltstack补充命令

拷贝salt根目录下的文件到minion端:

salt '*' cp.get_file salt://1.txt  /tmp/123.txt

拷贝salt根目录下的目录到minion端:

salt '*' cp.get_dir salt://test/conf /tmp/

#将/srv/salt/test/conf目录拷贝到minion端的/tmp下

显示存活的minion端:

[root@linux01 ~]# salt-run manage.up
- linux01
- linux02

远程执行shell脚本:

salt '*' cmd.script salt://test/1.sh

#在所有minion端执行master端的/srv/salt/test/1.sh脚本

salt-ssh使用

salt-ssh可以直接通过ssh秘钥的方式连接远程的客户端,客户端不需要安装salt-minion包

安装saltstack yum源:

yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm

安装salt-ssh:

[root@linux01 ~]# yum -y install salt-ssh

编辑配置文件:

[root@linux01 ~]# vi /etc/salt/roster

添加以下内容:

linux01:
  host: 192.168.234.128
  user: root
  passwd: abc123
linux02:
  host: 192.168.234.130
  user: root
  passwd: abc123

#添加客户端的信息,hostname,ip,用户名和密码

在所有客户端执行命令:

[root@linux01 ~]# salt-ssh --key-deploy '*' -r 'uptime' 
linux02:
    ----------
    retcode:
        0
    stderr:
    stdout:
         03:24:00 up 1 day,  9:57,  1 user,  load average: 0.33, 0.38, 0.30
linux01:
    ----------
    retcode:
        0
    stderr:
    stdout:
         03:24:06 up 1 day, 17:38,  3 users,  load average: 0.23, 0.23, 0.31

#第一次执行命令的时候会把master机器的公钥存放到客户端,然后把配置文件/etc/salt/roster中的密码去掉即可,后面再次执行命令会自动使用ssh秘钥认证

master端秘钥存放目录:

[root@linux01 ~]# ls /etc/salt/pki/master/ssh/
salt-ssh.rsa  salt-ssh.rsa.pub

#.pub文件的公钥会自动写入客户端/root/.ssh/authorized_keys文件中

发布了114 篇原创文章 · 获赞 851 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Powerful_Fy/article/details/103731387
今日推荐