设为首页 收藏本站
查看: 1032|回复: 0

[经验分享] 运维工具SaltStack

[复制链接]

尚未签到

发表于 2018-7-31 10:11:18 | 显示全部楼层 |阅读模式
  一、概述
  salt是一个异构平台基础设置管理工具,使用轻量级的通讯器ZMQ,用Python写成的批量管理工具,完全开源,遵守Apache2协议,与Puppet,Chef功能类似,有一个强大的远程执行命令引擎,也有一个强大的配置管理系统,通常叫做Salt State System。
  二、基本原理
  采用C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信。minion上线后先与master端联系,把自己的pub key发过去,接受该minion-key后,也就是master与minion已经互信master可以发送任何指令让minion执行了
  同时SaltStack也支持SSH的方式无需安装Agent,通过SSH实现管理。
  实现步骤:

  •   Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc
  2.salt命令,将cmd.run ls命令从salt.client.LocalClient.cmd_cli发布到master,获取一个Jodid,根据jobid获取命令执行结果。
  3.master接收到命令后,将要执行的命令发送给客户端minion。
  4.minion从消息总线上接收到要处理的命令,交给minion._handle_aes处理
  5.minion._handle_aes发起一个本地线程调用cmdmod执行ls命令。线程执行完ls后,调用
  minion._return_pub方法,将执行结果通过消息总线返回给master
  6.master接收到客户端返回的结果,调用master._handle_aes方法,将结果写的文件中
  7.salt.client.LocalClient.cmd_cli通过轮询获取Job执行结果,将结果输出到终端。
  参考链接:
  官方站点:http://www.saltstack.com/
  官方文档:http://docs.saltstack.com/
  中文站点:http://www.saltstack.cn/
  中文手册:http://docs.saltstack.cn/
  三、安装部署
  环境准备:
  操作系统:centos 7.2
  配置EPEL源:# rpm -Uvh http://mirrors.zju.edu.cn/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
  Master端:192.168.2.5
  Minion端:192.168.2.71
  Master端安装# yum install salt-master -y
  Minion端安装# yum install salt-minion -y
  注:安装完之后,Master配置文件在/etc/salt/master,minion配置文件在/etc/salt/minion,
  默认初始安装配置文件都是被注释,可自定义。
  SaltStack常用的目录结构:
  /var/cache/salt/master/minions/  #存放minions的缓存数据
  /srv/salt             #存放salt的sls文件,默认没有,需新建
  /srv/pillar            #存放pillar配置文件,默认没有,需新建
  /etc/salt             #存放salt的自身配置文件
  /var/log/salt           #存放salt的日志目录
  四、配置Minion端与Master通信,并简单测试。
  1.打开Master端的自动签发证书,默认是关闭的,如果不打开minion启动时会报如下错误:
  3月 08 14:47:46 node02 salt-minion[2736]: [WARNING ] ** Restarting minion **
  3月 08 14:54:56 node02 salt-minion[2736]: [ERROR   ] Attempt to authenticate with the salt master failed
  3月 08 14:59:07 node02 salt-minion[2736]: [ERROR   ] The Salt Master has cached the public key for thi...cate
  修改Master端配置文件如下:/etc/salt/master
  修改:#auto_accept: False
  为:auto_accept: True
  
  # systemctl restart salt-master.service  #重启Master端
  2.修改Minion端配置文件如下:/etc/salt/minion
  修改:#master: salt
  master: 192.168.2.5  #指向主Master端
  修改:#id: salt

  id: minion01  #本端Minion>  # systemctl restart salt-minion.service  #重启Minion端
  这时Master查看salt-key,minion01客户端自动添加到签发列表中
  [root@node03 ~]# salt-key     #查看所有端key
  Accepted Keys:
  minion01
  注:salt-key常用命令
  -a          #添加指定id
  -A          #添加全部
  -R          #拒绝全部
  -d          #删除指定id
  -D          #删除全部
  测试:
  [root@node03 ~]# salt 'minion01' cmd.run 'uname -r'
  minion01:
  3.10.0-327.el7.x86_64
  ###################Master端和Minion端常用配置参数说明#####################
  Master端常用的配置参数说明:
  interface:指定bind的地址,默认为0.0.0.0
  publish_port:指定发布端口,默认为4505
  ret_port:指定结果返回端口,与minion配置文件中的master_port对应,默认为4506
  uesr:指定master进程的运行用户,如果调整,则需要调整部分目录的权限,默认权限为root
  timeout:指定timeout时间,如果minion规模庞大或络状况不好,建议增该值,默认5s
  keep_jobs:默认情况下,minion会执行结果会返回master,master会缓存到本地的cachedir目录,
  该参数指定缓存多长时间,以供查看之前的执行结果,会占用磁盘空间,默认为24h
  job_cache:master是否缓存执行结构,如果规模庞大(超过5000台),建议使用其他方式来存储jobs,关闭本选项,默认为True
  file_recv:是否允许minion传送文件到master上,默认是Flase
  file_roots:指定file server目录,默认为:
  file_roots:
  base:
  - /srv/salt
  pillar_roots:指定pillar目录,默认为:
  pillar_roots:
  base:
  - /srv/pillar
  log_level:执行日志级别,支持的日志级别由'garbage', 'trace', 'debug', info', 'warning',
  'error', ‘critical ’ ,默认为’warning’
  Minion端常用的配置参数说明:
  master:指定master主机,默认为salt
  mastar_port:指定认证和执行结果发送到master的哪个端口,与master配置文件中的ret_port对应,默认为4506
  id:指定minion的标识,Salt内部使用id作为标识,唯一标识符,默认为主机名
  user:指定运行minion的用户,由于安装包,启动服务等操作需要特殊用户,推荐使用root,默认为root
  cache_jobs:minion是否缓存执行结果,默认为False
  backuo_mode:在文件操作(file.managed或file.recurse)时,如果文件发送更改,指定备份目录,当前有效的值为minion,备份在cachedir/file_backups目录下,以原始文件名称加时间戳来命名,默认为Disabled
  providers:指定模块对应的providers,如果RHRL系列中,pkg对应的providers是yumpkg5
  renderer:指定配置管理系统中的渲染器,默认值为:yaml_jinja
  file_client:指定file client默认去哪里(remotr或local)寻找文件,默认值为remote
  loglevel:指定日志级别,默认为warnning
  tcp_keepalive:minion是否与master保持keepalive检查,zeromq3一下版本存在keepalive bug,会导致某些情况下链接异常后minion无法重连master,建议有条件的话吧zeromq3以上版本,默认为True
  1.Archive模块:实现系统层面的压缩包调用,支持gzip、gunzip、rar、tar、unrar、unzip等
  例子:
  #salt 'minion01' archive.g
  zip test.txt   #采用gzip压缩test.txt文件
  2.cmd模块:实现远程的命令行调用执行(默认具备root操作权限)
  例子:
  #salt 'minion01' cmd.run 'fdisk -l'  #获取被控主机硬盘信息
  #salt 'minion01' cmd.script salt://script/test.py
  #该命令首先同步test.py到minion客户端的cache目录并运行该脚本。其中script/test.py存放在
  file_roots指定的目录(默认在/srv/salt(需要新建),在/etc/salt/master文件中定义)
  3.cp模块:远程文件、目录的复制
  例子:
  #salt 'minion01' cp.get_dir salt://script/ /opt/minion/
  #将Master端file_roots指定位置下(默认在/srv/salt)的目录复制到minion01主机/opt/minion/目录下
  4.cron模块:minion端主机的crontab操作
  例子:
  # salt 'minion01' cron.set_job root '*' '*' '*' '*' 1 /home/timesyc.sh  #minion01端主机root用户添加任务作业
  5.dnsutil模块:Minion主机通用DNS操作
  例子:
  #salt 'minion01' dnsutil.hosts_append /etc/hosts 192.168.2.71 www.test.com
  #添加192.168.2.71 www.test.com到minion01端/etc/hosts下
  6.file模块:常见的文件操作,包括文件读写、权限、查找等
  例子:
  #salt 'minion01' file.chown /mydata/data root root
  #修改minion01主机/mydata/data文件的属组、用户权限,等价于chown root:root /mydata/data
  #salt 'minion01' file.copy /mydata/data /home/data
  #minion01主机复制/mydata/data文件到本地的/home/data目录
  #salt 'minion01' file.get_mode /mydata/data
  #获取minion01主机/mydata/data的权限mode,如:755,644
  #salt '*' file.mkdir /home/test
  #所有Minion端主机创建/home/test
  #salt '*' file.set_mode /home/test 0755
  #所有Minion端主机/home/test的权限mode为0755
  #salt 'minion01' file.remove /home/test
  #删除minion01主机的/home/test文件
  7.iptables模块:主机的iptables支持
  例子:

  salt '*' iptables.append filter INPUT rule='-m state --state>
  salt '*' iptables.insert filter INPUT position=3 rule='-m state --state>  说明:在所有Minion主机端追加(append)、插入(insert)iptables规则,其中INPUT为输入链
  salt '*' iptalbes.delete filter INPUT position=3

  salt '*' iptables.delete filter INPUT rule='-m state --state>  说明:在所有Minion主机删除指定链编号为3(position=3)或指定存在的规则
  8.network模块:返回Minion主机的网络信息
  例子:
  #salt 'minion01' network.ping www.baidu.com   #minion01主机ping域名信息
  9.pkg包管理模块:程序包管理,如:yum安装
  例子:
  #salt '*' pkg.install httpd  #所有Minion主机安装等价于yum -y install httpd,pkg.remove为移除
  10.service服务模块:程序包服务管理(如:开机自动启动,服务重启等)
  例子:
  #salt '*' service.enable httpd
  #所有Minion主机httpd服务开机自启动脚本,service.disable为禁用
  #salt '*' service.restart httpd
  #所有Minion主机httpd服务重启,service.reload(加载)、service.start(启动)、service.stop(停止)、service.status(状态)
  注:saltstack还提供了user(系统用户模块)、group(系统组模块)、partition(系统分区模块)、puppet(puppet管理模块)、system(系统重启、关机模块)、timezone(时区管理模块)、nginx(nginx管理模块)、mount(文件系统挂载模块)等等。
  11.可以通过Python扩展模块,使用API。通过调用master client模块,实例化一个LocalClient对象,再调用cmd()方法来实现
  如:API实现archive.gzip
  #vim /root/archive_gzip.py
  import salt.client
  client = salt.client.LocalClient()
  ret = client.cmd('*','archive.gzip','/root/test.txt')
  print ret
  执行结果返回一个字典
  1
  {'minion01': '/root/test.txt.gz'}
  12.远程执行目标(target)
  常见命令参数:
  globbing  #默认指定id进行匹配
  L         #以主机ID列表形式匹配,不同主机id名称使用逗号隔开
  E         #基于id的正则表达式进行匹配
  G         #基于grains信息进行匹配过滤
  I         #基于master赋给minion的pillar信息进行匹配
  N         #基于master配置文件中的分组名称匹配
  S         #基于minion的IP地址或者IP子网匹配
  C         #复合匹配,以上参数可以组合使用
  #salt 'minion01'  test.ping
  #salt -L 'minion01,minion02'  test.ping
  #salt -E '.*01' test.ping
  #salt 'minion01'   grains.items
  #salt 'minion01' grains.get os
  #salt -S '192.168.2.71' test.ping
  #salt -C 'E@m.*01 or G@id:minion02' test.ping
  #salt '*'  pillar.get mysql
  13.State内置模块
  state是Saltstack最核心的功能。通过预先定制好的SLS描述了(支持YAML语法)系统的目标状态(程序包(pkg)、文件(file)、网络配置(network)、系统服务(service)、系统用户(user)等),由格式简单的数据构成。这经常被称作配置管理。
  state的入口文件与pillar一样,文件名都是top.sls,但state要求sls文件必须存放在Saltstack base定义的目录下(默认为/srv/salt)。
  state描述配置*.sls支持jinjia模板、grains及pillar引用等,在state的逻辑层次定义完成后,再通过salt '*' state.highstate执行生效。
  可用执行命令
  #salt '*' state.highstate
  #所有Minion到Master上取SLS定义,然后在本地调用对应的state module(user,pkg,service等)来达到SLS描述的状态。
  #salt-call state.highstate -l debug
  #输出debug信息,便于调试。
  如:
  apache: #ID声明,state名称:apache
  pkg: #管理对象类型states:pkg,进行软件安装(yum、apt)
  - installed #pkg要执行的方法:install,如未安装就进行安装
  service: #管理对象类型states:service,管理系统守护进程
  - running #service要执行的方法:running,如未运行就进行启动
  - require: #关键字require,确保apache服务只有在成功安装软件包后才会启动
  - pkg: apache
  一、grains组件介绍
  grains是收集Minion主机的静态、不常变化的基本信息,存储在Minion端本地,如:CPU、内核、操作系统、虚拟化等,并且服务器端可以根据这些信息进行灵活定制或个性化定制,是Saltstack最重要的组件之一,多用来做资产管理的信息收集,主要解决平台的差异性。
  如可以使用以下命令:
  #salt 'minion01' grains.items  #获取minion01主机基本信息
  二、grains组件自定义
  自定义grains有两种方法:
  第一种Minion端配置,需要重启minion生效(不建议使用);
  第二种在master端配置,同步之后生效,不需要重启master或者minion(比较推荐该方法)。

  •   在master端配置grains组件
  1.1.使用默认的Master的file_roots配置路径 /srv/salt创建_grains目录
  #cd /srv/salt && mkdir _grains
  1.2.修改salt的Master主配置文件(/etc/salt/master),新增如下内容,并且需要重启Master服务:
  file_roots:
  base:
  - /srv/salt/
  # systemctl restart salt-master.service
  注意:yaml格式问题: 和 - 后有空格,小心缩进!!!!!!!!
  1.3.使用python自定义脚本(注意返回值是一个字典)
  #抓取服务器的运行时间
  cat /srv/salt/_grains/runtime.py
  #!/usr/bin/python
  import commands
  def runtime():
  grains = {}
  grains['days'] = commands.getoutput("uptime|awk -F'up|days' '{print $2}'")
  return runtime
  1.4.用saltutil.sync_grains或者saltutil.sync_all将自定义的grains item 同步到Minion端,
  如果只同步grains建议使用saltutil.sync_grains。
  # salt 'minion01' saltutil.sync_grains -l debug
  # salt 'minion01' sys.reload_modules  #刷新客户端生效
  [root@node03 _grains]# salt 'minion01' sys.reload_modules
  minion01:
  True
  # salt 'minion01' grains.item days #获取自定义的grains)
  [root@node03 _grains]# salt 'minion01' grains.item days
  minion01:
  ----------
  days:
  注:同步完成后在Minion端的以下目录中可以找到Master下发的grains文件
  # ls /var/cache/salt/minion/extmods/grains/
  runtime.py  runtime.pyc
  2.在master端配置grains组件通过states的grains方法也可以自定义grains
  2.1.在/srv/salt再创建getitem目录
  #cd /srv/salt && mkdir getitem
  2.2.在getitem目录新建test.sls,内容如下:
  # cat test.sls
  test:
  grains.present:
  - value: test
  2.3.同步至minion01端,并检查结果
  # salt 'minion01' state.sls getitem.test
  minion01:
  ----------

  >  Function: grains.present
  Result: True
  Comment: Set grain test to test
  Started: 17:28:48.807030
  Duration: 1032.356 ms
  Changes:
  ----------
  test:
  test
  Summary
  ------------
  Succeeded: 1 (changed=1)
  Failed:    0
  ------------
  Total states run:     1
  # salt 'minion01' grains.get test
  minion01:
  test
  注:同步完成后在Minion端的以下目录中(/etc/salt/grains)可以找到Master下发的grains文件
  # cat /etc/salt/grains
  test: test
  注意:这里不做自定义在Minion端操作示例,实际生产环境中一般没有用。
  一、pillar组件介绍
  跟grains的结构一样,存放需要提供给Minion端的信息,存储在master端。可根据各个机器环境的不同,分别定义变量,然后再sls文件里统一引用,官方表示pillar是存储敏感数据的,主要解决环境的差异性。同时与grains组件还有一个特别的区别:
  grains数据加载在内存里,即minion启动之后不会变,哪怕修改了grains,除非重启minion或者从master端同步。
  而pillar修改之后,再获取数据即生效了。
  注;pillar是存放在master端,默认位置/srv/pillar,需要新建目录。和salt sls类似,也是需要top.sls
  二、pillar组件自定义
  1.使用默认的Master的pillar_roots配置路径 /srv/pillar需要新创建该目录
  # mkdir /srv/pillar
  2.修改salt的Master主配置文件(/etc/salt/master),新增如下内容,并且需要重启Master服务:
  pillar_roots:
  base:
  - /srv/pillar
  # systemctl restart salt-master.service
  注意:yaml格式问题: 和 - 后有空格,小心缩进!!!!!!!!
  3.在/srv/pillar目录下新建top.sls(入口文件),如:
  # cat /srv/pillar/top.sls
  base:
  '*':
  - test #指data.sls文件
  注:'*'代表任意主机,- test 指包含一个test.sls文件.top.sls引用时可用两种方法
  :文件放在同级;二是在pillar目录下创建test目录,在该目录下创建init.sls文件。
  4.在/srv/pillar目录下新建test.sls,内容如下:
  # cat test.sls
  httpd:
  pkg: httpd
  version: 2.4
  5.刷新Minion端主机的pillar信息,检查test.sls数据项mysql
  # salt '*' saltutil.refresh_pillar
  minion01:
  True
  # salt 'minion01' pillar.items
  minion01:
  ----------
  httpd:
  ----------
  pkg:
  httpd
  version:
  2.4
  6.常见pillar命令
  salt '*' sys.doc pillar            #查看与pillar有关的帮助信息
  salt '*' pillar.items              #获取所有pillar items值
  salt '*' pillar.data               #等价于pillar.items
  salt '*' saltutil.refresh_pillar   #刷新pillar值
  salt '*' saltutil.sync_all         #刷新pillar值,与refresh_pillar操作类似,但范围更大
  salt '*' sys.list_functions pillar #列出所有的pillar相关函数方法
  salt '*' pillar.get xxx            #获取某项的值
  salt '*' pillar.raw                #内存中获取

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-543981-1-1.html 上篇帖子: 运维工具SaltStack之四Pillar组件 下篇帖子: 自动化-----saltstack基础技术
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表