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

[经验分享] SALT BEST PRACTICES(最佳实践)

[复制链接]

尚未签到

发表于 2017-11-22 11:31:23 | 显示全部楼层 |阅读模式
SALT BEST PRACTICES
  salt由于可以配置的相当灵活,可能会导致配置结构会变得比较混乱。


GENERAL RULES
  一般性的规则:
  1、尽可能的将配置定义的突出模块性和足够清晰度
  2、将pillar与states文件之间建立明确的关系,可以将state文件目录和pillar目录定义在同一级下面,放在同一部署环境中。
  3、使用有意义的变量,不要过度的去使用,过度灵活的变量配置也会导致配置的复杂度过大,耦合性过高。
  4、敏感数据存放在pillar中
  5、在pillar的top文件中不要使用grains匹配,对于敏感的pillar数据


STRUCTURING STATES AND FORMULAS
  定义出states文件清晰的目录结构
示例:


DSC0000.gif DSC0001.gif


/srv/salt/mysql/files/
/srv/salt/mysql/client.sls
/srv/salt/mysql/map.jinja
/srv/salt/mysql/python.sls
/srv/salt/mysql/server.sls
View Code  top文件:





base:
   'web*':
     - mysql.client
     - mysql.python
   'db*':
     - mysql.server
View Code  这样定义的结构比较清晰。


STRUCTURING PILLAR FILES
  pillar文件结构
  默认pillar环境目录被定义在/srv/pillar/中,pillar文件一般被用来包含其他pillar文件和设置基于环境和grains的匹配关系。
  示例:





base:
   '*':
     - packages
View Code  复杂一点的示例:





base:
   '*':
     - packages
   'web*':
     - apache
     - vim
View Code  多环境的配置示例:





base:
   '*':
     - apache
dev:
   'os:Debian':
     - match: grain
     - vim
test:
   '* and not G@os: Debian':
     - match: compound
     - emacs
View Code  这可以避免为每一个环境设置一个pillar环境目录,如果配置不当容易引起混乱,每一个在pillar中被包含的sls文件都必须位于定义pillar目录下。


  一个pillar中的sls文件示例:





/srv/pillar/apache.sls:
apache:
   lookup:
     name: httpd
     config:
       tmpl: /etc/httpd/httpd.conf
View Code

VARIABLE FLEXIBILITY
  灵活的使用变量,并且为变量设置默认值
  一个sls文件中的变量使用示例:
  /srv/salt/apache/conf.sls:





{% set name = 'httpd' %}
{% set tmpl = 'salt://apache/files/httpd.conf' %}

include:
   - apache

apache_conf:
   file.managed:
     - name: {{ name }}
     - source: {{ tmpl }}
     - template: jinja
     - user: root
     - watch_in:
       - service: apache
View Code  变量可以在sls文件中被定义,但是不推荐,这样丧失了变量使用的灵活性。
  上面这种情况可以使用pillar存储这些变量信息,也便于其他state文件引用:
  /srv/pillar/apache.sls:





apache:
   lookup:
     name: httpd
     config:
       tmpl: salt://apache/files/httpd.conf
View Code  /srv/salt/apache/conf.sls:





{% from "apache/map.jinja" import apache with context %}

include:
   - apache

apache_conf:
   file.managed:
     - name: {{ salt['pillar.get']('apache:lookup:name') }}
     - source: {{ salt['pillar.get']('apache:lookup:config:tmpl') }}
     - template: jinja
     - user: root
     - watch_in:
       - service: apache
View Code  上例可以提供一个为用户集中处理和引用变量的环境。


MODULARITY WITHIN STATES
  模块化的状态文件配置,当配置一个sls文件的时候,要考虑要这个文件会被重用多少次
  /srv/salt/apache/init.sls:





httpd:
   pkg.installed: []
   service.running:
     - enable: True

/etc/httpd/httpd.conf:
   file.managed:
     - source: salt://apache/files/httpd.conf
     - template: jinja
     - watch_in:
       - service: httpd
View Code  上面的sls文件配置是一个相当糟糕的示例,利用state ID作为配置的一部分,非常不利于重用,且source等配置都是写死了。
  优化的示例,使用-name参数来取代state ID作为需要安装的包名,state ID应该被定义为一个配置的描述字段。
  /srv/salt/apache/init.sls:





apache:
   pkg.installed:
     - name: httpd
   service.running:
     - name: httpd
     - enable: True

apache_conf:
   file.managed:
     - name: /etc/httpd/httpd.conf
     - source: salt://apache/files/httpd.conf
     - template: jinja
     - watch_in:
       - service: apache
View Code  同样上例也存在一些问题,当配置需要依赖的环境较多的时候,类似的配置将被重复进行定义很多次
进一步优化的示例,将配置逻辑判断放在一个jinja文件中:
  /srv/salt/apache/map.jinja:





{% set apache = salt['grains.filter_by']({
     'Debian': {
         'server': 'apache2',
         'service': 'apache2',
         'conf': '/etc/apache2/apache.conf',
     },
     'RedHat': {
         'server': 'httpd',
         'service': 'httpd',
         'conf': '/etc/httpd/httpd.conf',
     },
}, merge=salt['pillar.get']('apache:lookup')) %}
View Code  /srv/pillar/apache.sls:





apache:
   lookup:
     config:
       tmpl: salt://apache/files/httpd.conf
View Code  /srv/salt/apache/init.sls:





{% from "apache/map.jinja" import apache with context %}

apache:
   pkg.installed:
     - name: {{ apache.server }}
   service.running:
     - name: {{ apache.service }}
     - enable: True

apache_conf:
   file.managed:
     - name: {{ apache.conf }}
     - source: {{ salt['pillar.get']('apache:lookup:config:tmpl') }}
     - template: jinja
     - user: root
     - watch_in:
       - service: apache
View Code  上面的例子就显得比较灵活了,将minion的判断逻辑抽象在map.jinja中,master需要引入的配置变量放在pillar中,这样的sls文件在配置变更上就显得比较灵活,但是还是存在一个问题,就是功能模块不够清晰,一个sls文件中包含了两个不同功能的类型配置,包安装和配置文件同步应该进行拆解,如下例:
  /srv/salt/apache/init.sls:





{% from "apache/map.jinja" import apache with context %}

apache:
   pkg.installed:
     - name: {{ apache.server }}
   service.running:
     - name: {{ apache.service }}
     - enable: True
View Code  /srv/salt/apache/conf.sls:





{% from "apache/map.jinja" import apache with context %}
include:
   - apache

apache_conf:
   file.managed:
     - name: {{ apache.conf }}
     - source: {{ salt['pillar.get']('apache:lookup:config:tmpl') }}
     - template: jinja
     - user: root
     - watch_in:
       - service: apache      
View Code

STORING SECURE DATA
  存储数据的安全性
  当我们有一些敏感信息需要在服务器端被定义的时候,如果将这些敏感信息直接放在sls文件中,那么minion端将都会收到这些敏感信息,最好的办法是将敏感的数据放在pillar中,确保指定的机器能够去访问这些数据,示例:
  /srv/salt/mysql/testerdb.sls:





testdb:
   mysql_database.present:
     - name: testerdb

/srv/salt/mysql/user.sls:
include:
   - mysql.testerdb

testdb_user:
   mysql_user.present:
     - name: frank
     - password: "test3rdb"
     - host: localhost
     - require:
       - sls: mysql.testerdb
View Code  将数据放在pillar中的实例:
  /srv/pillar/mysql.sls:





mysql:
   lookup:
     name: testerdb
     password: test3rdb
     user: frank
     host: localhost
View Code  /srv/salt/mysql/testerdb.sls:





testdb:
   mysql_database.present:
     - name: {{ salt['pillar.get']('mysql:lookup:name') }}
View Code  /srv/salt/mysql/user.sls:





include:
   - mysql.testerdb

testdb_user:
   mysql_user.present:
     - name: {{ salt['pillar.get']('mysql:lookup:user') }}
     - password: {{ salt['pillar.get']('mysql:lookup:password') }}
     - host: {{ salt['pillar.get']('mysql:lookup:host') }}
     - require:
       - sls: mysql.testerdb
View Code

运维网声明 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-409467-1-1.html 上篇帖子: 25个Linux相关的网站【转】 下篇帖子: [Caffe]史上最全的caffe安装过程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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