saltstack常用模块及组件备忘
2018-02-16 15:59
501 查看
Saltstack分为主控端和被控端。主控端的salt服务启动:systemctl start salt-master,被控端的服务启动:systemctl start salt-minion
1、Saltstack的防火墙配置
主控端防火墙允许TCP4505和4506端口,被控端不需要配置。原理是被控端直接与主控端的zeromq建立长链接,接受广播到的任务信息并执行。
主控端的配置
重启服务让配置生效:systemctl restart salt-master
被控端配置
重启服务让配置生效:systemctl restart salt-minion
2、测试安装saltstack的结果
如果把centos02那么就是测试所有的被控端
3、利用saltstack远程执行命令
命令行格式:salt ‘<操作目标>’ <方法> [参数]
-E,--pcre,通过正则表达式匹配,salt -E '.*02' cmd.run 'free -m'
-L,--list,以主机id名列表的形式进行过滤,即是主机名可以写多个。salt -L 'centos02,centos03' <方法>[参数]。
-S,--ipcidr,根据被控主机的IP地址或IP子网进行匹配, salt -S 192.168.40.11 test.ping; salt -S 192.168.40.12 test.ping。
4、常用的模块和API
saltstack提供了非常丰富的功能模块,涉及操作系统的基础功能、常用工具支持等。
如果使用python脚本的方法来实现test.ping
4.1、archive模块,实现系统层面的压缩包调用,支持gunzip、gzip、rar、tar、unrar、unzip等。
api调用
client.cmd('centos02', 'archive.tar', ['xf', '/tmp/access.tar.gz'])
4.2、cmd模块,实现远程命令行调用执行(使用的是root权限,所以风险高。)
api调用
client.cmd('cnetos02', 'cmd.run',['free -m'])
4.3、cp模块,实现远程文件、目录的复制,以及下载URL文件的操作。
api调用
client.cmd('centos02', 'cp.get_file', ( 'salt://apache/init.sls ', '/minion/dest.sls')
4.4、cron模块,实现被控主机上的crontab操作
api调用
client.cmd('centos02', 'cron.set_job',['root','','','','','*','/usr/local/weekly'])
4.5、dnsutil模块,实现被控制主机本地域名文件操作
api调用
client.cmd('*', 'dnsutil.hosts_append',['/etc/hosts','127.0.0.1','www.test.com'])
4.6、file模块,实现被控主机常见文件操作
api调用
client.cmd('*', 'file.remove',['/data/test.txt'])
4.7、network模块,返回被控主机的网络信息
api调用
client.cmd('centos02','network.ip_addrs')
4.8、pkg模块,被控主机程序包管理,如yum、apt-get等
api调用
client.cmd('centos02', 'pkg.remove',['ftp'])
5、grains组件
grains是saltstack最重要的组件之一,它的作用就是收集被控制主机的基本信息,这些信息通常都是一些静态的数据,如CPU,操作系统,虚拟化等。
5.1、grains常用的操作命令
5.2、定义grains的数据
定义grains数据有两种方法,一种是在被控主机定制配置文件,另一种是通过主控端扩展模块api实现,区别是模块更加灵活。可以通过python编程动态定义,配置文件只适合相对固定的键与值。
一、在被控端定制grains数据
在被控端修改配置文件/etc/salt/minion,修改的内容是“default_include: minion.d/*.conf”'然后在被控制端写入配置文件:
为了让配置生效,重启被控端的salt-minion服务,systemctl restart salt-minion,然后主控端输入命令查看定义的grains数据:
二、主控端扩展模块定制grains数据
首先在主控端编写python代码,包含了grains数据的代码,然后将代码同步到被控端,然后使用命令刷新生效就可以了。
6、pillar组件
pillar是saltstack最重要的组件之一,其作用是定义与被控主机相关的任何数据,定义好的数据可以直接被其他组件使用,如被模板,state,api等使用。
6.1、主配置文件的定义
在主配置文件/etc/salt/master中通过pillar_opts:True来开启该功能,配置后重启服务生效能用“salt 'centos02' pillar.data”来验证。
6.2、sls文件的定义
pillar支持sls文件来定义数据,格式必须符合YAML规范
四、state的使用,state是saltstack的最核心功能,它通过预先定制好的sls(salt state file)文件对被控主机进行状态管理,支持包括程序包、文件、网络配置、系统服务、系统用户等。
1、Saltstack的防火墙配置
主控端防火墙允许TCP4505和4506端口,被控端不需要配置。原理是被控端直接与主控端的zeromq建立长链接,接受广播到的任务信息并执行。
iptables -I INPUT -m state --state new -m tcp -p tcp --dport 4506 -j ACCEPT iptables -I INPUT -m state --state new -m tcp -p tcp --dport 4505 -j ACCEPT
主控端的配置
vim /etc/salt/master #绑定Master通信IP interface: 192.168.40.10 #自动认证,如果是False就要进行手动认证 auto_accept: True #指定saltstack的文件根目录所在 file_roots: base: - /srv/salt
重启服务让配置生效:systemctl restart salt-master
被控端配置
vim /etc/salt/minion #指定master主机的IP地址 master: 192.168.40.10 #修改被控端主机识别id id: centos02
重启服务让配置生效:systemctl restart salt-minion
2、测试安装saltstack的结果
[root@centos01 ~]# salt 'centos02' test.ping centos02: True
如果把centos02那么就是测试所有的被控端
[root@centos01 ~]# salt '*' test.ping centos02: True centos03: True
3、利用saltstack远程执行命令
命令行格式:salt ‘<操作目标>’ <方法> [参数]
[root@centos01 ~]# salt 'centos02' cmd.run 'free -m' centos02: total used free shared buff/cache available Mem: 472 119 76 3 275 308 Swap: 1023 7 1016
-E,--pcre,通过正则表达式匹配,salt -E '.*02' cmd.run 'free -m'
-L,--list,以主机id名列表的形式进行过滤,即是主机名可以写多个。salt -L 'centos02,centos03' <方法>[参数]。
-S,--ipcidr,根据被控主机的IP地址或IP子网进行匹配, salt -S 192.168.40.11 test.ping; salt -S 192.168.40.12 test.ping。
4、常用的模块和API
saltstack提供了非常丰富的功能模块,涉及操作系统的基础功能、常用工具支持等。
如果使用python脚本的方法来实现test.ping
>>> import salt.client >>> client = salt.client.LocalClient() >>> ret = client.cmd('centos02', 'test.ping') >>> print ret {'centos02': True} ##以集合的形式
4.1、archive模块,实现系统层面的压缩包调用,支持gunzip、gzip、rar、tar、unrar、unzip等。
salt 'centos02' archive.tar xf /tmp/access.tar.gz ##解压在/root目录下 salt 'centos02' archive.tar /tmp/test.txt ##压缩在/tmp目录下
api调用
client.cmd('centos02', 'archive.tar', ['xf', '/tmp/access.tar.gz'])
4.2、cmd模块,实现远程命令行调用执行(使用的是root权限,所以风险高。)
salt 'centos02' cmd.run 'free -m'
api调用
client.cmd('cnetos02', 'cmd.run',['free -m'])
4.3、cp模块,实现远程文件、目录的复制,以及下载URL文件的操作。
##将指定被控主机的/etc/hosts文件复制到被控主机的salt的cache目录下(cache目录在/var/cache/salt/minion/localfiles/) salt 'centos02' cp.cache_local_file /etc/hosts ##将主服务器的file_roots指定位置下的目录复制到被控主机 salt 'centos02' cp.get_dir salt://apache/ /minion/ ##将file_roots指定的目录,也就是/srv/salt目录下的apache目录复制到远端的/minion/目录下,如果没有会自动创建该目录。 ##将主服务器file_roots指定位置下的文件复制到被控主机 salt 'centos02' cp.get_file salt://apache/init.sls /minion/dest.sls ##下载URL网页内容到被控主机指定位置 salt 'centos02' cp.get_url http://www.baidu.com /tmp/test.html
api调用
client.cmd('centos02', 'cp.get_file', ( 'salt://apache/init.sls ', '/minion/dest.sls')
4.4、cron模块,实现被控主机上的crontab操作
##查看被控主机的root用户的crontab清单 salt 'centos02' cron.raw_cron root ##指定被控主机root用户添加任务 salt 'centos02' cron.set_job root '*' '*' '*' '*' '*' /bin/bash test.sh ##删除指定被控主机的root用户的任务 salt 'centos02' cron.rm_job root /bin/bash test.sh
api调用
client.cmd('centos02', 'cron.set_job',['root','','','','','*','/usr/local/weekly'])
4.5、dnsutil模块,实现被控制主机本地域名文件操作
#添加 salt 'centos02' dnsutil.hosts_append /etc/hosts 127.0.0.1 www.test.com ##删除 salt 'centos02' dnsutil.hosts_remove /etc/hosts www.test.com
api调用
client.cmd('*', 'dnsutil.hosts_append',['/etc/hosts','127.0.0.1','www.test.com'])
4.6、file模块,实现被控主机常见文件操作
##修改被控主机的/etc/passwd文件的拥有者和所有组,相当于在被控主机实现chown root:root /etc/passwd salt 'centos02' file.chown /etc/passwd root root ##复制指定被控主机本地/data/test.txt文件到本地的/tmp/dest.txt文件 salt 'centos02' file.copy /data/test.txt /tmp/dest.txt ##检查指定被控主机的/etc/目录下是否存在文件,存在则返回True salt 'centos02' file.directory_exists /etc/ ##获取指定被控主机的/etc/passwd文件的stats信息 salt 'centos02' file.stats /etc/passwd ##获取指定被控主机/etc/passwd的权限mode,如700 salt 'centos02' file.get_mode /etc/passwd ##修改指定被控主机的文件权限mode,如0644 salt 'centos02' file.set_mode /etc/passwd 0644 ##在指定被控主机创建/data/test目录 salt 'centos02' file.mkdir /data/test ##将指定被控主机的/data/test.txt文件里的hello改为hhhh salt 'centos02' file.sed /data/test.txt 'hello' 'hhhh' ##在指定被控主机的/data/test.txt文件内容追加test salt 'centos02' file.append /data/test.txt 'test' ##删除指定被控主机的/data/test.txt文件 salt 'centos02' file.remove /data/test.txt
api调用
client.cmd('*', 'file.remove',['/data/test.txt'])
4.7、network模块,返回被控主机的网络信息
##在指定被控主机获取ping,traceroute目录域名信息 salt 'centos02' network.ping www.baidu.com salt 'centos02' network.traceroute www.baidu.com ##获取指定被控主机的网卡的MAC地址 salt 'centos02' network.hwaddr ens33 ##获取指定被控主机的IP地址配置信息 salt 'centos02' network.ip_addrs ##获取指定被控制主机的IP地址段 salt 'centos02' network.subnets
api调用
client.cmd('centos02','network.ip_addrs')
4.8、pkg模块,被控主机程序包管理,如yum、apt-get等
##为所有被控主机安装ftp安装包,根据不同操作系统安装,如redhat就是相当于yum install -y ftp salt '*' pkg.install ftp ##卸载所有被控主机的ftp安装包 salt '*' pkg.remove ftp ##升级所有被控主机的软件包 salt '*' pkg.upgrades
api调用
client.cmd('centos02', 'pkg.remove',['ftp'])
5、grains组件
grains是saltstack最重要的组件之一,它的作用就是收集被控制主机的基本信息,这些信息通常都是一些静态的数据,如CPU,操作系统,虚拟化等。
5.1、grains常用的操作命令
##获取所有os_family属性为RedHat的被控主机的内存信息 salt -G 'os_family:RedHat' cmd.run 'free -m' ##获取所有被控主机的grains项信息 salt '*' grains.ls
5.2、定义grains的数据
定义grains数据有两种方法,一种是在被控主机定制配置文件,另一种是通过主控端扩展模块api实现,区别是模块更加灵活。可以通过python编程动态定义,配置文件只适合相对固定的键与值。
一、在被控端定制grains数据
在被控端修改配置文件/etc/salt/minion,修改的内容是“default_include: minion.d/*.conf”'然后在被控制端写入配置文件:
[root@centos02 data]# cat /etc/salt/minion.d/hostinfo.conf grains: roles: - testhost - python02 deployment: mytest cabinet: 13
为了让配置生效,重启被控端的salt-minion服务,systemctl restart salt-minion,然后主控端输入命令查看定义的grains数据:
[root@centos01 ~]# salt 'centos02' grains.item roles deployment cabinet centos02: ---------- cabinet: 13 deployment: mytest roles: - testhost - python02
二、主控端扩展模块定制grains数据
首先在主控端编写python代码,包含了grains数据的代码,然后将代码同步到被控端,然后使用命令刷新生效就可以了。
##创建_grains目录 install -d /srv/salt/_grains ##开始编写代码 [root@centos01 ~]# cat /srv/salt/_grains/grains_openfile.py import os,sys,commands def grains_openfile(): grains = {} ##定义grains集合,变量名一定要用grains,方便saltstack识别。 open_file = 65535 ##给变量一个初始值 try: getulimit = commands.getstatusoutput('source /etc/profile;ulimit -n') except: pass if getulimit[0] == 0: open_file = int(getulimit[1]) ##将变量getulimit的第一个值ulimit -n给open_file grains['max_open_file'] = open_file return grains ##由于grains是储存键与相应的值的,所以grains是一个集合, grains['max_open_file'] = open_file这句相当于给grains添加一对对象,键为max_open_file,值为open_file,而open_file是从ulimit -n获取来的值。最后返回grains。 ##将代码同步到被控端 salt 'centos02' saltutil.sync_all ##刷新 salt 'centos02' sys.reload_modules ##返回True ##测试结果 [root@centos01 ~]# salt 'centos02' grains.item max_open_file centos02: ---------- max_open_file: 1024
6、pillar组件
pillar是saltstack最重要的组件之一,其作用是定义与被控主机相关的任何数据,定义好的数据可以直接被其他组件使用,如被模板,state,api等使用。
6.1、主配置文件的定义
在主配置文件/etc/salt/master中通过pillar_opts:True来开启该功能,配置后重启服务生效能用“salt 'centos02' pillar.data”来验证。
6.2、sls文件的定义
pillar支持sls文件来定义数据,格式必须符合YAML规范
一、定义pillar的主目录 ##修改主配置文件/etc/salt/master的pillar_roots参数, pillar_roots: base: - /srv/pillar ##同时创建pillar目录 install -d /srv/pillar 二、定义入口文件top.sls ##入口文件一般是用来定义pillar覆盖的主机范围,'*'代表的是所有的主机 [root@centos01 ~]# cat /srv/pillar/top.sls base: '*': - data ##定义data.sls文件,写入的是pillar的数据 [root@centos01 ~]# cat /srv/pillar/data.sls hostname: centos flow: maxconn: 65535 maxmem: 1G ##其中hostname表示的是一级字典{'hostname':'centos'},flow表示二级字典{'flow':{'maxconn':'65535','maxmem':'1G'}}。 ##测试 [root@centos01 ~]# salt 'centos02' pillar.data hostname flow centos02: ---------- flow: ---------- maxconn: 65535 maxmem: 1G hostname: centos ##能看到data.sls的数据,因为入口文件top.sls使用的是‘*’,所有主机都能看到data数据。 三、pillar的使用 pillar定义好数据后,接下来就开始使用了,使用的格式是"{{ pillar['变量'] }}" {{ pillar ['hostname'] }} 一级字典 {{ pillar['flow']['maxconn'] }} 二级字典 api调用格式 pillar['flow']['maxconn'] pillar.get(' flow:maxconn', { }) ##通过 -I来匹配相应值的被控主机 [root@centos01 ~]# salt -I 'hostname:centos' test.ping centos02: True centos03: True ##如果测试没结果,重启被控制主机的salt-minion:systemctl restart salt-minion ##结合grains处理数据差异性,通过grains的id来区分不同的maxcpu值,使用if...else...endif语句,该语句为jinja2的模板语法。 [root@centos01 pillar]# salt 'centos02' pillar.data flow centos02: ---------- flow: ---------- maxconn: 65535 maxcpu: 4 maxmem: 1G [root@centos01 pillar]# salt 'centos03' pillar.data flow centos03: ---------- flow: ---------- maxconn: 65535 maxcpu: 1 maxmem: 1G ##注意的是上面定义的键,如maxconn不可以放到if语句里面重新赋值,否则会出错。
四、state的使用,state是saltstack的最核心功能,它通过预先定制好的sls(salt state file)文件对被控主机进行状态管理,支持包括程序包、文件、网络配置、系统服务、系统用户等。
##state的定义是通过sls文件进行描述的,支持YAML语法,定义的规则如下 $ID: $state: - $state: states ##$ID是指state的名称,通常采用与描述对象一样的名称,例如apache、nginx等;$state须管理对象的类型,如pkg(程序包)、file(文件)等;$state: states定制对象的状态。 apache: ##state的名称 pkg: ##表示state声明开始,使用pkg状态对象。pkg使用管理本地软件包管理器yum或者apt管理将要安装的软件。 - installed ##要执行的方法,表示要求该软件包应该处于已安装的状态。 service: ##同pkg,service是系统管理守护进程 - running ##同installed,表示要求改程序处于运行的状态 - require: ##确保Apache服务只有处于已安装的状态下才能启动。在运行此state之前,先运行依赖的state关系检查。 - pkg: apache 上述代码检查Apache软件包是否安装,如果未安装,通过yum或者apt安装 ##state的使用,入口文件为top.sls与pillar的一样,但是state要求sls文件必须放在saltstack的base定义目录下,/srv/salt,state描述的sls配置文件支持jinjia模板、grains以及pillar的调用。在state的定义完成后,使用 salt '*' state.highstate执行生效 ##定义pillar [root@centos01 ~]# cat /srv/pillar/top.sls base: '*': ##定义该对象的覆盖被控主机,这里是任意主机 - apache ##定义对象的名称 ##在pillar配置目录下创建Apache目录 [root@centos01 ~]# mkdir /srv/pillar/apache ##编写Apache的配置文件 [root@centos01 ~]# cat /srv/pillar/apache/init.sls pkgs: {% if grains['os_family'] == 'Debian' %} ##通过if语句调用grains判断系统并返回相应的程序包名称。 apache: apache2 {% elif grains['os_family'] == 'RedHat' %} apache: httpd {% endif %} ##测试pillar配置的结果 [root@centos01 ~]# salt '*' pillar.data pkgs centos02: ---------- pkgs: ---------- apache: httpd centos03: ---------- pkgs: ---------- apache: httpd ##定义state,入口文件top.sls的格式和pillar的一样 [root@centos01 ~]# cat /srv/salt/top.sls base: '*': - apache [root@centos01 ~]# cat /srv/salt/apache/init.sls apache: pkg: - installed - name: {{ pillar['pkgs']['apache'] }} service.running: - name: {{ pillar['pkgs']['apache'] }} - require: - pkg: {{ pillar['pkgs']['apache'] }} ##在saltstack的定义目录下创建state对象名称为apache,pkg是指管理对象的类型是程序包。name使用的是pillar中定义的软件包名称。service.running检查软件是否处于运行的状态,没有运行就运行,require要求软件必须处于已安装状态否则就会使用yum安装软件。 ##测试结果 [root@centos01 ~]# salt '*' state.highstate centos02: ---------- ID: apache Function: pkg.installed Name: httpd Result: True Comment: Package httpd is already installed. Started: 15:56:57.900991 Duration: 1095.767 ms Changes: ---------- ID: apache Function: service.running Name: httpd Result: True Comment: The service httpd is already running Started: 15:56:58.997731 Duration: 150.081 ms Changes: Summary ------------ Succeeded: 2 Failed: 0 ------------ Total states run: 2 centos03: ---------- ID: apache Function: pkg.installed Name: httpd Result: True Comment: The following packages were installed/updated: httpd Started: 15:56:57.400161 Duration: 35643.566 ms Changes: ---------- httpd: ---------- new: 2.4.6-67.el7.centos.6 old: httpd-tools: ---------- new: 2.4.6-67.el7.centos.6 old: mailcap: ---------- new: 2.1.41-2.el7 old: ---------- ID: apache Function: service.running Name: httpd Result: True Comment: Started Service httpd Started: 15:57:33.655895 Duration: 1681.019 ms Changes: ---------- httpd: True Summary ------------ Succeeded: 2 (changed=2) Failed: 0 ------------ Total states run: 2 ##能看到state执行后两台被控制主机安装服务并启动
相关文章推荐
- linux c/c++ 后台开发常用组件之:c++日志模块
- c/c++ 后台开发常用组件之:c++日志模块
- saltstack常用操作(四)---自定义模块
- 自动化运维Saltstack系列(二)之远程执行和常用模块
- saltstack管理八之常用执行模块
- Saltstack系列3:Saltstack常用模块及API
- Saltstack常用模块及API
- saltstack常用操作及模块
- saltstack 常用的模块
- saltstack (2) 常用模块
- SaltStack 学习笔记 - 第四篇: SaltStack常用模块
- saltstack一些常用模块和api调用方法
- saltstack-gdlwolf自学总结第五篇(方法案例): pkg模块初始化安装系统常用软件包
- linux c/c++ 后台开发常用组件之:c++日志模块
- 五十二 常用第三方模块 图形界面
- 循环绑定事件的两种常用闭包写法(备忘)
- EasyUI常用组件(基础)
- python os模块常用命令以及简单示例
- IOS开发常用的开源组件