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远程执行机器
1 (1)-E, --pcre,通过正则表达式进行匹配: 2 salt -E 'web(9|10)*' test.ping -t 1 3 (2)-L, --list, 主机id进行过滤: 4 salt -L "*app*" cmd.run "df -h" 5 (3) -G, --grain, 根据被控主机的grains信息进行过滤 6 salt -G 'role:nginx' cmd.run "ls /export" 7 (4) -I, --pillar, 根据被控主机的pillar信息进行过滤 8 salt -I 'myname:xiang' test.ping -t 5 9 (5) -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 14 (6)检查客户端是否挂掉: 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 6 配置文件详解
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 \n \ 12 \ inet addr:192.168.90.63 Bcast:192.168.90.255 Mask:255.255.255.0\n\ 13 \ inet6 addr: fe80::250:56ff:feb5:5c28/64 Scope:Link\n \ 14 \ UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1\n RX packets:825051\ 15 \ errors:0 dropped:0 overruns:0 frame:0\n TX packets:434351 errors:0\ 16 \ dropped:0 overruns:0 carrier:0\n collisions:0 txqueuelen:1000\ 17 \ \n RX bytes:60353823 (57.5 MiB) TX bytes:27062672 (25.8 MiB)\n\ 18 \nlo Link encap:Local Loopback \n inet addr:127.0.0.1 \ 19 \ Mask:255.0.0.0\n inet6 addr: ::1/128 Scope:Host\n UP\ 20 \ LOOPBACK RUNNING MTU:16436 Metric:1\n RX packets:808 errors:0\ 21 \ dropped:0 overruns:0 frame:0\n TX packets:808 errors:0 dropped:0\ 22 \ overruns:0 carrier:0\n collisions:0 txqueuelen:0 \n \ 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'