Saltstack 和 Salt-API 安装配置及使用

CentOS 7 安装 saltstack

salt介绍

  salt是一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行)。一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据。开发其的目的是为远程执行提供最好的解决方案,并使远程执行变得更好,更快,更简单。

  saltstack(中国用户组www.saltstack.cn)基于Python开发,c/s架构支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能。

  saltstack的优势:有master端和minion端,执行的信息比较稳定,不容易丢失信息,或者出现失联主机的情况;有封装好的http-api,可以直接启动salt-api就可以通过http协议进行调用。不需要进行第二次的封装。

salt安装

1.安装epel yum源

1 yum -y install epel-release 
2 yum clean all 
3 yum makecache

2.安装 salt-master并配置

1 salt-master 安装: yum -y install salt-master
2 salt-master 配置:
3 修改minion配置文件 vim /etc/salt/master
4 interface: 10.0.0.15   
5 或者
6 [root@localhost salt]# sed -i 's/#interface: 0.0.0.0/interface: 10.0.0.15/g' /etc/salt/master
7 [root@localhost salt]# sed -e '/^$/d;/^#/d;' /etc/salt/master
8 interface: 10.0.0.15

3.安装 salt-minion 并配置

1 salt-minion 安装: yum -y install salt-minion
2 salt-minion 配置:
3 修改minion配置文件 vim /etc/salt/minion
4 master: 192.168.56.11   可以是主机名需要解析(指定服务端的IP地址)
5 id:   唯一标识符,可以不配,不配默认就是主机名
6 或者
7 [root@localhost salt]# sed -i 's/#master: salt/master: 10.0.0.15/g' /etc/salt/minion
8 [root@localhost salt]# sed -e '/^$/d;/^#/d;' /etc/salt/minion
9 master: 10.0.0.15

4.启动 salt-master 和 salt-minion

1 启动master:
2 [root@localhost salt]# systemctl start salt-master
3 [root@localhost salt]# systemctl status salt-master
4 
5 启动minion:
6 [root@localhost salt]# systemctl start salt-minion
7 [root@localhost salt]# systemctl status salt-minion

5.测试 saltstack (接下来都在 salt-master 端操作)

1、查看 minion 列表(这时候 10.0.0.129是红色的,表示未通过认证,10.0.0.15是绿色的,表示通过认证了)

2、认证所有 key,当然你也可以通过 
salt-key -a 10.0.0.129 指定某台 minion 进行认证 key,或者salt-key -A进行所有认证key

3、接着继续查看 minion 列表 (这时候10.0.0.129 已经变为绿色,说明 key 已被添加)

4、简单测试(通过 salt-master 进行检测)

可以ping到 10.0.0.129 返回值为 True,说明 salt-master 和 salt-minion 可以通讯,安装到此结束。

saltstack的设置

1.master与minion的认证

1 minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master。
2 master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key,然后master就能对minion发送指令了。
3   常用指令:
4 
5   salt-key -L 或者salt-key 显示所有的key
6   salt-key -D :删除所有认证主机id证书
7   salt-key -d keys_values -y
8   salt-key -A:接收所有id证书请求
9   salt-key -a id :接受单个id证书请求

2.saltstack远程执行机器

 11)-E, --pcre,通过正则表达式进行匹配:
 2   salt -E 'web(9|10)*' test.ping -t 1
 32)-L, --list, 主机id进行过滤:
 4   salt -L "*app*" cmd.run "df -h" 
 53) -G, --grain, 根据被控主机的grains信息进行过滤
 6   salt -G 'role:nginx' cmd.run "ls /export"
 74) -I, --pillar, 根据被控主机的pillar信息进行过滤
 8   salt -I 'myname:xiang' test.ping -t 5
 95) -S, --ipcidr, 根据minion的ip地址进行匹配
10   salt -S 192.168.1.1 test.ping
11   salt -S 192.168.1.0/24 test.ping
12   salt -S 192.168.0.0/16 test.ping
13   salt -S 192.0.0.0/8 test.ping
146)检查客户端是否挂掉:
15   salt-run manage.status |head
16   salt-run manage.down

3.saltstack配置文件详解

1 saltstack占用两个端口4505和4506:
2 确保master端的4505和4506端口开通
3 Minion的key确实别master接受
4 通过test.ping 模块,双方都可以ping通
5 

4.saltstack的几种模块介绍

 1 Runner 模块     在master端执行的  salt-run
 2 Module 模块    通过master同步到minion端, 在minion执行
 3        salt-call saltutil.sync_modules
 4        salt-call saltutil.sync_all:包括:beacons:
 5        clouds:    engines:    grains:    log_handlers:    modules:
 6        output:    proxymodules:    renderers:    returners:    sdb:
 7        states:    utils:
 8 
 9 Grins 模块    记录minion的属性key:value
10 Pillar模块      记录所有minion通用的属性,然后同步到minion端
11       salt-call saltutil.refresh_pillar
12       salt ‘*’ saltutil.refresh_pillar
13 
14  cmd模块       salt  ‘*’ cmd.run “df -h”
15  ping模块  salt ‘*’ test.ping –t 5
16   cp 模块
17       file_roots: 
18       base:
19       - /export/salt/root
20       salt根目录:在master中file_roots定义的路径,salt://test.txt相当于/export/salt/root/test.txt
21       salt 'wms5test1.app.172.17.23.176' cp.get_file salt://nscd.conf /tmp/xiang.txt  
22 
23  
24 
25 cron模块:
26       salt '*' cron.raw_cron root     (查看定时任务)
27       salt '*' cron.set_job root '*' '*' '*' '*' 1 /export/scripts/rm_log.sh 
28       salt '*' cron.rm_job root /export/scripts/rm_log.sh   (写全没效果)
29 
30 
31 dnsutil模块
32       salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 xiang.com
33       salt '*' dnsutil.hosts_remove /etc/hosts xiang.com
34 
35 file模块:
36       salt '*' file.chown /etc/passwd root root
37       salt '*' file.copy /path/to/src /path/to/dst
38       salt '*' file.file_exists /etc/hosts
39       salt '*' file.directory_exists /etc/
40       salt '*' file.get_mod /etc/passwd
41       salt '*' file.set_mod /etc/passwd 0644
42       salt '*' file.mkdir /tmp/test
43       salt '*' file.sed /export/servers/nginx/conf/nginx.conf 'debug' 'warn'
44       salt '*' file.append /tmp/test.txt "welcome xiang"
45       salt '*' file.remove /tmp/1.txt
46 
47 network模块:
48       salt '*' network.dig www.qq.com
49       salt '*' network.ping www.qq.com
50       salt '*' network.ip_addrs
51 
52 pkg包管理模块:
53       管理yum, apt-get等
54       salt '*' pkg.install php
55       salt '*' pkg.remove php
56       salt '*' pkg.upgrade    (升级所有的软件包)
57 
58 service模块
59       salt '*' service.enable nginx
60       salt '*' service.disable nginx
61       salt '*' service.restart nginx
62 
63 Grains模块
64       自定义grians(在minion上定义的)
65       grains是在minion启动时搜集一些信息,如操作系统类型,网卡,内核版本,cpu架构等
66       salt "*" grains.ls    列出所有grains项目名字
67       salt "*app.*" grains.items  列出所有grains项目以及值
68       grains的信息并不是动态的,并不会实时变化,它只是在minion启动时收集到的
69       我们可以根据grains收集到的一些信息,做一些配置管理工作
70       在minion上:vim /etc/salt/grains
71       role: nginx
72       env: test
73       重启service salt-minion restart
74       获取grians:
75       salt "*" grains.item role env
76       或者:
77       salt -G "*" role:nginx cmd.run "hostname“
78       salt ‘*’grains.items
79 
80 Pillar模块
81       pillar(在master上定义)(yaml语法)
82       在配置文件中找pillar的文件路劲:
83 
84       找到以后,mkdir  /export/salt/pillar
85       vim top.sls
86       base:
87       "*":
88       - test
89       vim test.sls
90       conf: xiang
91       然后刷新pillar: salt '*' saltutil.refresh_pillar
92       验证:salt '*' pillar.items conf
93       或者: salt -I 'conf:xiang' test.ping

Salt-API安装配置及使用(Python3使用saltstack和salt-api)

安装 salt-api

1 yum install salt-api -y

salt-api配置

生成自签名证书(用于ssl)

1 cd  /etc/pki/tls/certs
2 # 生成自签名证书, 过程中需要输入key密码及RDNs
3 make testcert
4 cd /etc/pki/tls/private/
5 # 解密key文件,生成无密码的key文件, 过程中需要输入key密码,该密码为之前生成证书时设置的密码
6 openssl rsa -in localhost.key -out localhost_nopass.key

创建用于salt-api的用户

1 useradd -M -s /sbin/nologin salt-api
2 echo "salt-api" | passwd salt-api —stdin

修改/etc/salt/master文件

1 sed -i '/#default_include/s/#default/default/g' /etc/salt/master  
2 mkdir /etc/salt/master.d 

新增配置文件/etc/salt/master.d/api.conf

1 cat /etc/salt/master.d/api.conf
2 rest_cherrypy:
3   port: 8000
4   ssl_crt: /etc/pki/tls/certs/localhost.crt
5   ssl_key: /etc/pki/tls/private/localhost_nopass.key

新增配置文件/etc/salt/master.d/eauth.conf

1 cat /etc/salt/master.d/eauth.conf  
2 external_auth:  
3   pam:  
4     salt-api:  
5       - .*  
6       - '@wheel'  
7       - '@runner' 

启动salt-master and salt-api

1 systemctl start salt-master
2 systemctl start salt-api

安装一个salt client

1 yum install salt-minion -y
2 修改配置
3 sed -i "/^#master: salt/c master: 192.168.104.76"  /etc/salt/minion
4 启动 client
5 systemctl start salt-minion

master 上接受key

 1 [root@node76 salt]# salt-key -L
 2 Accepted Keys:
 3 Denied Keys:
 4 Unaccepted Keys:
 5 node76
 6 Rejected Keys:
 7 [root@node76 salt]# salt-key -A
 8 The following keys are going to be accepted:
 9 Unaccepted Keys:
10 node76
11 Proceed? [n/Y] Y
12 Key for minion node76 accepted.
13 [root@node76 salt]# salt-key -L
14 Accepted Keys:
15 node76
16 Denied Keys:
17 Unaccepted Keys:
18 Rejected Keys:

api使用

使用curl 获取token

 1  curl -k https://192.168.104.76:8000/login -H "Accept: application/x-yaml"  -d username='salt-api' -d password='salt-api'  -d eauth='pam'
 2 return:
 3 - eauth: pam
 4   expire: 1520269544.2591
 5   perms:
 6   - .*
 7   - '@wheel'
 8   - '@runner'
 9   start: 1520226344.259099
10   token: 593a7224f988f28b84d58b7cda38fe5e5ea07d98
11   user: salt-api
参数解释:
 1 --sslv3 指定sslv3版本
 2 -k      忽略证书获取https内容
 3 -s      指定使用静默(silent)方式
 4 -i      指定SaltAPI收到服务器返回的结果同时显示HTTP Header。
 5 -H      指定一个特定的Header给远端服务器,当SaltAPI 需要发送appliton-tion/json Header时。会以我们希望的JSON格式返回结果
 6 -d      想远端服务器发送POST请求,以key=value的格式发送 ,注意key=v时,必须紧挨=号两边
 7 
 8 
 9 获取token后就可以使用token通信
10 注:重启salt-api后token改变

测试minion端的联通性

1 下面功能类似于“salt '*' test.ping”:
2 curl -k https://192.168.104.76:8000 -H "Accept: application/x-yaml" -H "X-Auth-Token: ded897184a942ca75683276c29d787ea71c207a9" -d client='local' -d tgt='*' -d fun='test.ping' 
3 return:
4 - node76: true
参数解释:
 1 client : 模块,python处理salt-api的主要模块,‘client interfaces <netapi-clients> 2     local : 使用‘LocalClient <salt.client.LocalClient>’ 发送命令给受控主机,等价于saltstack命令行中的'salt'命令
 3     local_async : 和local不同之处在于,这个模块是用于异步操作的,即在master端执行命令后返回的是一个jobid,任务放在后台运行,通过产看jobid的结果来获取命令的执行结果。
 4     runner : 使用'RunnerClient<salt.runner.RunnerClient>' 调用salt-master上的runner模块,等价于saltstack命令行中的'salt-run'命令
 5     runner_async : 异步执行runner模块
 6     wheel : 使用'WheelClient<salt.wheel.WheelClient>', 调用salt-master上的wheel模块,wheel模块没有在命令行端等价的模块,但它通常管理主机资源,比如文件状态,pillar文件,salt配置文件,以及关键模块<salt.wheel.key>功能类似于命令行中的salt-key。
 7     wheel_async : 异步执行wheel模块
 8     备注:一般情况下local模块,需要tgt和arg(数组),kwarg(字典),因为这些值将被发送到minions并用于执行所请求的函数。而runner和wheel都是直接应用于master,不需要这些参数。
 9 tgt : minions
10 fun : 函数
11 arg : 参数
12 expr_form : tgt的匹配规则
13     'glob' - Bash glob completion - Default
14     'pcre' - Perl style regular expression
15     'list' - Python list of hosts
16     'grain' - Match based on a grain comparison
17     'grain_pcre' - Grain comparison with a regex
18     'pillar' - Pillar data comparison
19     'nodegroup' - Match on nodegroup
20     'range' - Use a Range server for matching
21     'compound' - Pass a compound match string

执行远程命令

1 下面功能类似于“salt '*' cmd.run ifconfig”:
2 curl -k https://192.168.104.76:8000 -H "Accept: application/x-yaml" -H "X-Auth-Token: ded897184a942ca75683276c29d787ea71c207a9" -d client='local' -d tgt='*' -d fun='cmd.run'   -d arg='uptime'
3 return:
4 - node76: ' 13:18:46 up 161 days,  2:23,  1 user,  load average: 0.15, 0.09, 0.10'

使用state.sls

 1 下面功能类似于“salt '*' state.sls ifconfig”:
 2  curl -k https://192.168.104.76:8000 -H "Accept: application/x-yaml" -H "X-Auth-Token: ded897184a942ca75683276c29d787ea71c207a9" -d client='local' -d tgt='*' -d fun='state.sls' -d arg='ifconfig'
 3 return:
 4 - node76:
 5         cmd_|-ifconfig_|-ifconfig_|-run:  
 6       __run_num__: 0  
 7       changes:  
 8         pid: 30954  
 9         retcode: 0  
10         stderr: ''  
11         stdout: "eth2      Link encap:Ethernet  HWaddr 00:50:56:B5:5C:28  
       
12                inet addr:192.168.90.63  Bcast:192.168.90.255  Mask:255.255.255.0
  
13                     inet6 addr: fe80::250:56ff:feb5:5c28/64 Scope:Link
          
14             UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:825051  
15            errors:0 dropped:0 overruns:0 frame:0
          TX packets:434351 errors:0  
16            dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000  
17            
          RX bytes:60353823 (57.5 MiB)  TX bytes:27062672 (25.8 MiB)
  
18           
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1   
19            Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP  
20            LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:808 errors:0  
21            dropped:0 overruns:0 frame:0
          TX packets:808 errors:0 dropped:0  
22            overruns:0 carrier:0
          collisions:0 txqueuelen:0 
           
23            RX bytes:59931 (58.5 KiB)  TX bytes:59931 (58.5 KiB)"  
24       comment: Command "ifconfig" run  
25       duration: 11.991  
26       name: ifconfig  
27       result: true  
28       start_time: '13:59:06.334112'  

使用Targeting

1 下面功能类似于"salt -L '192.168.90.61,192.168.90.63' test.ping"
2  curl -k https://192.168.104.76:8000 -H "Accept: application/x-yaml" -H "X-Auth-Token: ded897184a942ca75683276c29d787ea71c207a9"  -d client='local' -d tgt='node76'  -d expr_form='list'  -d fun='test.ping' 
3 return:
4 - node76: true

以json格式输出

1 curl -k https://192.168.104.76:8000 -H "Accept: application/json" -H "X-Auth-Token: ded897184a942ca75683276c29d787ea71c207a9"  -d client='local' -d tgt='node76'  -d fun='cmd.run' -d arg='uptime'
2 {"return": [{"node76": " 13:25:20 up 161 days,  2:30,  1 user,  load average: 0.01, 0.06, 0.08"}]}

使用jobs

 1  curl -k -s https://192.168.104.76:8000/jobs/20180306112645047796 -H "Accept: application/x-yaml" -H "X-Auth-Token: a7f8b2fab2bfb05334f8a314d97925c1bec1d14c" 
 2 info:
 3 - Arguments:
 4   - uptime
 5   Function: cmd.run
 6   Minions:
 7   - node76
 8   Result:
 9     node76:
10       return: ' 11:26:45 up 162 days, 31 min,  1 user,  load average: 0.12, 0.07,
11         0.08'
12   StartTime: 2018, Mar 06 11:26:45.047796
13   Target: node76
14   Target-type: glob
15   User: salt-api
16   jid: '20180306112645047796'
17 return:
18 - node76: ' 11:26:45 up 162 days, 31 min,  1 user,  load average: 0.12, 0.07, 0.08'
19 #结果
20 curl -k -s https://192.168.104.76:8000/jobs/20180306112645047796 -H "Accept: application/x-yaml" -H "X-Auth-Token: a7f8b2fab2bfb05334f8a314d97925c1bec1d14c" 
21 info:
22 - Arguments:
23   - uptime
24   Function: cmd.run
25   Minions:
26   - node76
27   Result:
28     node76:
29       return: ' 11:26:45 up 162 days, 31 min,  1 user,  load average: 0.12, 0.07,
30         0.08'
31   StartTime: 2018, Mar 06 11:26:45.047796
32   Target: node76
33   Target-type: glob
34   User: salt-api
35   jid: '20180306112645047796'
36 return:
37 - node76: ' 11:26:45 up 162 days, 31 min,  1 user,  load average: 0.12, 0.07, 0.08'
原文地址:https://www.cnblogs.com/zhaohuhu/p/9548886.html