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

[经验分享] saltstack应用之批量部署mysql-DavideyLee

[复制链接]

尚未签到

发表于 2018-8-1 09:41:38 | 显示全部楼层 |阅读模式
  saltstack应用之批量部署mysql
  应用环境:
  使用salt写了个自动部署mysql的配置配置管理文件,由于mysql的有版本号,端口等不确定属性,需要使用pillar来单独配置每个minion的属性。
  一,原始方法

  例如,需要在salt>  1,在/srv/salt/top.sls中添加配置信息,确保mysql对应的配置被加载
  base:
  10.1.1.1-centos.game.web:
  - centos.public_services.mysql
  2,在/srv/pillar/top.sls配置minion对应的sls文件位置(ps:salt文件中不能再带”.”,否则会报错)
  base:
  10.1.1.1-centos.game.web:
  - custom.10-1-1-1-centos-game-web
  3,新建/srv/pillar/custom/10-1-1-1-centos-game-web.sls,内容如下:
  mysql:
  ports:
  - 3306
  - 3307
  - 3308
  version:  '5_5_25'
  4,执行同步命令
  salt 10.1.1.1-centos.game.web state.highstate -v -t 300
  二,改进方法
  oh,shit,说好的自动化呢,怎么还要这么多步骤,这可不行!
  利用py模式的sls配置文件(其实就是python脚本,只要返回yaml格式的字典文件就好了),我们可以将以上的操作简化成1步,思路如下:
  1,/srv/pillar/top.sls中编写配置:
  base:
  '*':
  - custom

  2,使用py模式编写/srv/pillar/custom/init.sls,自动读取pillar配置,例如salt>  3,在/srv/salt/top.sls文件中匹配所有的minion
  ‘*’:
  - centos.public_services
  4,/srv/salt/centos/public_services/init.sls文件使用py模式编写,配置会获取对应的minion的pillar信息,如果包含mysql配置信息且配置正确的话,则返回mysql实例的配置。

  那现在要怎么使用呢,很简单,例如你的id为10.1.1.1-centos.game.web,首先在/srv/pillar/custom/目录下建个game目录(从salt>  mysql:
  ports:
  - 3306
  - 3307
  - 3308
  version:  '5_5_25'
  最后执行命令:
  salt 10.1.1.1-centos.game.web state.highstate -v -t 300
  静静的等待执行完成就好了!
  三,具体代码
  /srv/pillar/custom/init.sls
  #!py
  #coding:utf-8
  """
  返回minion对应的pillar信息
  """
  import yaml
  import os
  def run():
  """
  首先获取请求的id,从id中获取project,例如id是:1.2.3.4-centos.game.web,那么project为game
  然后根据获取的pillar_root组合成路径/srv/pillar/custom/game/1.2.3.4-centos.game.web.yaml,利用yaml模块从文件中读取信息,返回字典
  """
  config={}

  >  project=id.split('-')[-1].split('.')[1]
  pillar_root=__opts__['pillar_roots']['base'][0]
  path='%s/custom/%s/%s.yaml'%(pillar_root,project,id)
  if os.path.isfile(path):
  s=open(path).read()
  config=yaml.load(s)
  return config
  /srv/salt/centos/public_services/init.sls
  #!py
  #coding: utf-8
  import subprocess
  class MY_ERROR(Exception):
  def __init__(self,value):
  self.value=value
  def __str__(self):
  return self.value
  def mysql():
  """
  1,检查是minion中pillar是否有mysql参数,以及参数是否合法
  如果参数没有问题,则返回对应版本的include配置
  pillar e.q.
  mysql:
  ports:
  - 3306
  - 3307
  version: '5_5_25'
  """
  mysql_sls_path='centos.public_services.mysql.'
  #必要的参数
  required_keys=['version','ports']
  if __pillar__.has_key('mysql'):
  mysql_d=__pillar__['mysql']
  #不存在必要的键值对则返回None
  for key in required_keys:
  if not mysql_d.has_key(key) or str(mysql_d[key]).strip()=="":
  raise MY_ERROR('key error! key: %s'%(str(key)))
  #判断port是否合法
  for port in mysql_d['ports']:
  if not port or not 1024<int(port)<65535:
  raise MY_ERROR('mysql ports value error: %s'%(str(mysql_d['ports'])))
  #组合配置参数
  cfg=mysql_sls_path+str(mysql_d['version'][0])
  return cfg
  return None
  def run():
  config={}
  config['include']=[]
  #mysql
  mysql_cfg=mysql()
  if mysql_cfg:
  config['include'].append(mysql_cfg)
  if config['include']==[]:
  return {}
  return config
  /srv/salt/centos/public_services/mysql/5/init.sls
  include:
  - centos.public_services.mysql.5.packet
  - centos.public_services.mysql.5.my_cnf
  - centos.public_services.mysql.5.instance
  /srv/salt/centos/public_services/mysql/5/packet.sls
  mysql软件包要放到相应的目录中,具体位置参考下面配置
  {%set version=pillar['mysql']['version']%}
  mysql:
  user.present:
  - home: /home/mysql
  - shell: /sbin/nologin
  /usr/local/nagios/libexec/check_safe -u:
  cmd.wait:
  - watch:
  - user: mysql
  /usr/local/src/mysql-{{version.replace('_','.')}}.tar.gz:
  file.managed:
  - source: salt://centos/public_services/mysql/5/`version`/mysql-{{version.replace('_','.')}}.tar.gz
  tar -xf mysql-{{version.replace('_','.')}}.tar.gz -C /usr/local/:
  cmd.run:
  - cwd: /usr/local/src
  - unless: ls -l /usr/local/ | grep -e ".* mysql-{{version.replace('_','.')}}$"
  /usr/local/mysql-{{version.replace('_','.')}}:
  file.directory:
  - user: mysql
  - group: mysql
  - recurse:
  - user
  - group
  /data/mysql_log:
  file.directory:
  - makedirs: True
  - user: mysql
  - group: mysql
  - recurse:
  - user
  - group
  /data/log-bin:
  file.directory:
  - makedirs: True
  - user: mysql
  - group: mysql
  - recurse:
  - user
  - group
  /usr/bin/mysql:
  file.symlink:
  - target: /usr/local/mysql-{{version.replace('_','.')}}/bin/mysql
  - unless: ls -l /usr/bin | grep -e " mysql$"
  /srv/salt/centos/public_services/mysql/5/my_cnf.sls
  注意修改最后的初始化密码
  my.cnf配置文件需要放到对应的目录中,my.cnf文件中要设置对应的模板变量:
  port= `port` #还有其它的和端口相关的配置都要改成`port`
  basedir=/usr/local/mysql-`version` #还有其它的和版本相关的配置都要改成`version`
  #!py
  #coding:utf-8
  """
  生成my.cnf配置文件,如果文件已存在,不作任何修改
  """
  import os
  def run():
  config={}
  version=__pillar__['mysql']['version']
  for port in __pillar__['mysql']['ports']:
  port=str(port)
  if not os.path.isfile('/data/mysql_data_%s/my.cnf'%(port)):
  config['/data/mysql_data_%s/my.cnf'%(port)]={
  'file.managed':[
  {'source':'salt://centos/public_services/mysql/5/%s/my.cnf'%(version)},
  {'template':'jinja'},
  {'context':{'port':port,'version':'%s'%(version.replace('_','.'))}},
  {'require':[{'file':'/data/mysql_data_%s'%(port)}]},
  ],
  }
  config['chown mysql.mysql /data/mysql_data_%s/my.cnf'%(port)]='cmd.run'
  return config
  /srv/salt/centos/public_services/mysql/5/instance.sls
  mysql启动脚本需要放到对应的目录中,启动脚本中要设置对应的模板变量:
  basedir=/usr/local/mysql-`version` #还有其它的和版本相关的配置都要改成`version`
  datadir=/data/mysql_data_`port` #还有其它的和端口相关的配置都要改成`port`
  {% for port in pillar['mysql']['ports'] %}
  /data/mysql_data_`port`:
  file.directory:
  - makedirs: True
  - user: mysql
  - group: mysql
  - recurse:
  - user
  - group
  /etc/init.d/mysqld_`port`:
  file.managed:
  - source: salt://centos/public_services/mysql/5/{{pillar['mysql']['version']}}/mysql.service
  - user: root
  - group: root
  - mode: 755
  - template: jinja
  - context:
  port: `port`
  version: {{pillar['mysql']['version'].replace('_','.')}}
  chkconfig --add mysqld_`port`;chkconfig --level 345 mysqld_`port` on;:
  cmd.run:
  - unless: chkconfig --list | grep mysqld_`port`
  #初始化库
  init_mysql_`port`:
  cmd.run:
  - name: /usr/local/mysql-{{pillar['mysql']['version'].replace('_','.')}}/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql-{{pillar['mysql']['version'].replace('_','.')}}  --datadir=/data/mysql_data_`port`/
  - unless: ls -l /data/mysql_data_`port` | grep -e ".* mysql$"
  /etc/init.d/mysqld_`port` start:
  cmd.wait:
  - watch:
  - cmd: init_mysql_`port`
  /usr/local/mysql-{{pillar['mysql']['version'].replace('_','.')}}/bin/mysqladmin -uroot -S /tmp/mysql_`port`.sock password 'yourmysqlpasswd!':
  cmd.wait:
  - watch:
  - cmd: init_mysql_`port`
  {%endfor%}
  四,总结
  这个方法不仅可以用在mysql,同样的nginx,redis等都可以举一反三,配置文件编写完成后,仅仅需要简单的在pillar中添加几

运维网声明 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-544562-1-1.html 上篇帖子: SaltStack Event系统监听events测试 下篇帖子: saltstack批量配置hosts文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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