SaltStack研究心得

基础篇

--------------------------------------------------------------------------------------------------------

  概述:SaltStack简单来说是一个基础架构管理工具,这个比较抽象,说白就是一个运维管理工具,底层是使用python实现,C/S架构,支持分布式部署,据说可以轻松管理上W台服务器,和Puppet这类工具很类似,其主要的功能:

  1. 基于Key的远程连接并执行命令;
  2. 强大的搜索器,多种方式过滤服务器;
  3. 灵活的远程部署实现方式;
  4. 基于YMAL格式对文件,用户,用户组及服务等资源灵活管理;

极简易安装


  本实例采用CentOS6.5_x86_64操作系统,在安装之前请先配置好Yum源

 salt-master服务端安装

yum -y install salt-master    /安装
rpm -aq|grep salt-master    /检测
salt-master配置文件: /etc/salt/master

 salt-minion客户端安装

yum -y install salt-minion   /安装
rpm -aq|grep salt-minion   /检测
salt-minion配置文件: /etc/salt/minion

添加客户端


salt-key -L    /列出所有key,key格式是minion-id,如果没有配置minion-id,则是主机名
salt-key -A    /接受所有key
salt-key -a  “ZK-YJY-APP-01”   /接受指定的key
salt-key -R    /拒绝所有未接受的key
salt-key -D     /删除所有key
salt-key -d  “ZK-YJY-APP-01”   /删除指定的key


Target搜索器


  添加了minion的key后就可以免密码将命令传输到minion,并把执行结果返回来,方便的进行批量操作了,想象一下,如果有上W台服务器,而只想查看某些服务器的配置信息,怎么实现 ? 当然要有一个目标搜索器才行,saltstack的target搜索器非常强大,基于minion的id进行匹配,所以我们在部署minion之前要事先对minion的id做好规划(如果不配置minion的id,则默认是使用主机名,也要对主机名做好规划)

 glob方式

salt “*” test.ping   
salt “ZK-YJY-APP-01” test.ping

正则表达式

salt  “web*” test.ping
salt  “web[0-9]NaNdb?” test.ping
salt  “web-[x-z]” test.ping

 grains类

salt -G “os:CentOS” test.ping
salt -G "cpuarch:x86_64"test.ping

 基于IP

salt -S "192.168.153.130"test.ping
salt -S "192.168.153.0/24"test.ping

 基于节点组

需要先在/etc/salt/master中定义nodegroups,如下:

nodegroups:
      group1: ‘[email protected],bar.domain.com,baz.domain.com’
      group2: ‘[email protected]:Debian and foo.domain.com‘
      group3: ‘[email protected],webserver02‘
salt -Ngroup3 test.ping

 复合方式

本质是上面的方式结合在一起,形成更为复杂的条件:

salt -C ‘webserv* and [email protected]:Debian [email protected]*‘ test.ping


Grains是啥


grains简单来说就是一个字典,{“os”:CentOS, “num_cpus”:8},字典就是这样的key-value的键值对的一个无序集合,里面存放着minion端的所有配置信息,

列出配置信息的分类,其实就是查看有哪些key

salt “*” grains.ls

列出配置信息的分类和具体分类信息,其实就是查看key-value

salt “*” grains.items

 列出某个配置信息项的具体信息

salt “*” grains.item cpu_model

==========================================================================================

进阶篇States

-------------------------------------------------------------------------------------------------------

  这篇是为自动化部署作准备的,核心就是弄清楚States的使用技巧


YAML基本格式


nginx_package:      //声明id
      file.managed:       //文件模板的managed函数,作用是实现从master下载文件
          - name: /tmp/nginx-1.8.0.tar.gz    //定义名称空间
          - source: salt://nginx/files/nginx-1.8.0.tar.gz   //指定文件在master上的位置

难点说明:

saltstack的YMAL格式通常以声明id开始,名称空间会覆盖id,也就是说,如果没有name,则id就是name,如果有name,id只作为标识,且在一个sls文件中,id不能重复,在states中有很多模块函数,可以对文件,用户,用户组,服务,定时任务等资源进行操作,我们只要调用并定义一些参数即可。

这里要注意下缩进和空间,仔细观察就明白了


条件判断和先决条件

extract_nginx:    //声明id
      cmd.run:    //这个模块是表示要执行一些系统命令
        - cwd: /tmp    //切换到指定目录下
        - names:   //具体的命令,如果有多条可依次向下排列
          - tar zxf nginx-1.8.0.tar.gz
        - unless: test -d /tmp/nginx-1.8.0     //这里是一个条件判断
        - require:  //先决条件
          - file: nginx_source   //具体条件

难点说明:

  第一个要注意的地方是unless这个判断条件,这个条件如果返回false,cmd.run才执行,否则不执行,unless可以很好的控制同步配置后重复执行某些命令

  第二个需要注意的地方是先决条件require,先决条件除了require之外还是watch,但require可以用在任何模块中,watch只能用在service.running模块中


用户和组模块


nginx_user:   //声明id
  user.present:    //用户管理模块,以下是一些参数
        - name: nginx  
        - uid: 121
        - gid: 121
        - createhome: false
        - shell: /sbin/nologin
        - require:  //先决条件,表示要创建nginx用户先创建nginx这个组
          - group: nginx   
   group.present:
        - name: nginx
          - gid: 121


服务模块


nginx_service:     //声明id
  service.running:      //服务运行模块
    - name: nginx
    - enable: True
    - reload: True
    - watch:    //监测以下条件是否变化,如果改变则重启服务
      - file: /usr/local/nginx/conf/nginx.conf

  我开始以为是修改minion的nginx配置会自动重启,后面验证不对,应该是修改了master上nginx的配置源文件,执行同步才会重启,使minion的nginx配置文件始终与master配置文件保持一致,这个是我测试的结果,也可能理解有误,后面再去研究吧。

Template模板


{% for usr in[‘moe‘,‘larry‘,‘curly‘] %}
    {{ usr }}:
        user.present
{% endfor %}

这个就是python中的模板标签的定义{%%},{{}}在,sls中,或者在配置源文件中都可以使用模板标签。

apache:    
    pkg.installed:
    {% if grains[‘os‘] ==‘RedHat‘ %}
        - name: httpd
    {% elif grains[‘os‘] ==‘Ubuntu‘ %}
        - name: apache2
    {% endif %}

使用模板可以比较灵活的对可变的部分进行控制


include引入


如果有多个sls文件,我们可以在一个sls文件中引入另一个sls,在init.sls文件顶部添加如下内容:

include:
    -  install.sls
    -  conf.sls


批量部署nginx


有了以上的基础,就可以很方便的部署任何软件包了,这里重点讲下步骤:

 编辑master配置文件,将如下内容注释去掉

file_roots:
       base:    //此处的base标识在top.sls文件中引用
         - /srv/salt   //配置管理文件存放的root目录

当然,这里可以根据需要创建多个不同的file_roots目录

创建指定的目录

默认/srv目录下是空的,需要创建salt目录

创建top.sls文件

在/srv/salt目录下创建top.sls文件

base:   //此处的base即在file_roots中定义的base
  ‘*‘:  //这里是表示target目标,可以使用搜索器定义
    - nginx.install     //表示file_roots目录下的nginx目录下的install.sls
    - nginx.conf    //表示file_roots目录下的nginx目录下的conf.sls

top.sls是一个入口文件,master同步时首先会去读取top.sls ,通过top.sls去找对应目录下的其它sls文件

编写install.sls和conf.sls

此处略去无数行

将软件包和配置文件和启动脚本放到指定目录

你懂的

网上有大量的部署配置,推荐一些比较好的网址,个人建议学saltstack之前最好有一些python基础,毕竟是python写的

http://blog.cunss.com/?p=272

http://docs.saltstack.cn/zh_CN/latest/

https://docs.saltstack.com/en/latest/

时间: 2024-10-06 15:50:26

SaltStack研究心得的相关文章

Python字符串的encode与decode研究心得——解决乱码问题

转~Python字符串的encode与decode研究心得——解决乱码问题 为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“/xe4/xb8/xad/xe6/x96/x87”的形式?为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)”?本文就来研究一下这个问题. 字符串在Python内部的表示是unico

Javascript面向对象研究心得

这段时间正好公司项目须要,须要改动fullcalendar日历插件,有机会深入插件源代码.正好利用这个机会,我也大致学习了下面JS的面向对象编程,感觉收获还是比較多的. 所以写了以下这篇文章希望跟大家探讨探讨JS的面向对象,本人资历尚浅,还望各位大神多多不吝赐教. 总述: 如今的发展趋势是,JS越来越面向对象化.而JS本身并未像Java,C#等语言,实现了明显的继承,封装等,我们须要通过JS本身的方式来模拟这些面向对象的方式. Jquery的一些东西: 1.each方法: 这是在js面向对象编程

博士五年的一些学术研究心得体会

学术研究的一些心得体会 当我们开始高校研究生活时,我们就踏上了学术研究之路.这是一条探索未知世界,追求知识真理之路.这条道路上布满荆棘,充满了冒险和乐趣.本文通过分享自己在博士学习阶段亲身经历的研究经验和体会(主要涉及到文献检索.文献阅读.实验设计和论文写作这四个方面),希望能帮助一些入门研究不久的同学对学术研究有新的认识,能在研究道路上少走弯路,迈向自己的成功之路. 1 引言 2014年9月,我提着行李箱一个人来到大连这陌生的城市开启了在大工的博士研究生涯.我是从大四毕业设计就已经开始接触自己

Python字符串的encode与decode研究心得 乱码问题解决方法

以下摘自:http://www.jb51.net/article/17560.htm 为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“\xe4\xb8\xad\xe6\x96\x87”的形式? 为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)”?本文就来研究一下这个问题. 字符串在Python内部的表示

Python字符串的encode与decode研究心得乱码问题解决方法

为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成"\xe4\xb8\xad\xe6\x96\x87"的形式? 例如下面这个实际生活中我自己遇到的这段代码: #-*-utf-8-*-     txt = "今天,天气很好!风和日丽.感情丰富?"         print(re.split('[,.!?]',txt)) 为什么会报错"UnicodeEncodeError: 'ascii' codec can't encode ch

Node稳定性的研究心得

目前大部分Web服务器,如Apache,都使用多线程的方式响应多用户请求,即一个线程服务一个用户请求.这种模式其中一个好处是,当某个请求的线程上抛出的异常没被捕获,只会影响当前这个线程,不会影响其他请求. 由于Node执行在单线程上,一旦线程上抛的异常没有被捕获,就会引起整个进程的崩溃.所以对Node服务的异常处理.保证进程的稳定性非常重要. 再好的程序员也不敢保证自己的代码不出现异常,除了尽可能捕获可能出现的异常,我们还需要通过一些规范减少异常发生,通过单元测试辅助我们验证代码,通过一些工具保

pdf 转图片,提取图片研究心得

1.pdf 中的数据是有多种编码的,详情请看:http://www.cnblogs.com/zendu/p/7644465.html 2.我的工作场景比较特殊,pdf中全部是图片,所以pdf转图片就有两种思路. a.一种是把图片直接提取出来,怎么放进去的怎么提取出来. 这种速度最快,原因是用不到解码,直接数据的拷贝.但是也有他的问题,就是pdf中的编码格式较多,要针对不同的编码,提供不同的提取程序. 可以用到的库是pdfsharp ,itextsharp.个人感觉pdfsharp 没itexts

语音识别技术为何成为当今科技研究的最大热点?

语音识别(SR)技术(或称"语音科技")成为当今科技研究的最大"热点"(或"聚焦点")是有客观原因的.为什么? 在国内搞科研,往往喜欢"赶潮流",不问具备什么客观条件,喜欢"蛮干".我们干事情要搞清楚周边的环境,看看情况再上路,不能"任性". 大家知道,人与人用语音沟通,相互"说话",交换信息.我们用耳朵听别人说话并不觉得有什么困难,除非耳聋.现在的问题是,互联网大发

分享12306抢票心得-最终篇

针对最近12306服务端封插件(切DNS,切站)的杀手锏,有了比较好的应对方案.此文是最后的分享,借此对几年来的研究心得做个总结. 12306终极杀手锏 12306在上周做了一些重大改变,在服务端实施了插件封杀 一定时间内:切不同站,切不同DNS,弹出“查询失败”,自动被踢出 不用插件,手动稍微换下站查询也会被踢 基本上封杀了现有的所有插件 解决方案及原理 (Chrome)用IFrame或AJAX在后台不停检查登录状态,非登录就自动OCR登录 Fishlee的方案:启用6次匿名查询,再来一次正式