设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

QQ登录

只需一步,快速开始

#公告#抱歉,网站将关闭,不再开放。由于PC时代已远逝 。在这个后移动互联网时代,我们继续携手前行,保持对技术的热情。共同构建linuxtone知识星球欢迎加入,一起讨论技术、招聘人才、分享资源。请新老linuxtone人 扫码移步到 知识星球:linuxtone

学习是一种信仰!分享是一种快乐!能力= 心态 * 沟通 * 知识 (你的每一天需要正能量!)

 网站的发展需要你贡献一份力量!希望你能每天坚持看贴1小时,并回答网友的问题!祝你在浏览论坛的过程中取得进步!谢谢!linuxtone加油!大家加油! 友情提示: 你今天学习了吗?你今天进步了吗?少一点抱怨!多一点进步!Life is short ! Why not linuxtone ?  

网站的发展、感谢每位坛友的努力!

查看: 38242|回复: 19

[其它] 运维自动化之salt   [复制链接]

Rank: 6Rank: 6

签到
63
注册时间
2011-10-31
最后登录
2020-5-14
在线时间
25 小时
阅读权限
70
积分
6708
帖子
39
主题
17
精华
2
UID
15864
发表于 2013-5-22 13:45:06 |显示全部楼层
#引言:关于运维
##1:saltstack的基本介绍
##2:salt的安装
     1:服务端
          1:安装
          2:配置文件
          3:运行
          4:注意事项
     2:客户端
          1:安装
          2:配置文件
          3:运行
          4:注意事项
##3:salt的使用:
     1:基础知识
               1:targeting
               2:nodegroup
               3:grains
               4:pillar
     2:状态管理
               1:state
                    1:state语法
                    2:state的逻辑关系
               2:highstate
               3:salt schedule
     3:实时管理
                1:cmd.run
                2:module
      4:无master
##4:salt开发
     1:saltclient管理salt
     2:salt api


*************************************************************


##引言:关于运维
    运维的工作主要在2方面:
        1:状态的管理
        2:系统性能调优
    这里主要简介下运维状态的管理:
   
     对于运维来说,基于状态的配置管理已经向自动化迈进了一大步,以状态为核心的运维,让状态本身有了可管理性;在运维过程中我们会发现,同样的一个配置,我们会在不同的时间,不同的地点一次在一次的配置,这个时候,配置管理就有了重复性;有的甚至是原封不动的重复,而另外一些则是按照一定的规律在发展,这些按照一定规律发展的配置,就是可预测的.综上我认识的,我们运维工作的本身是可管理,可重复,可预测的.基于这样的理念,我们就可以更高一步的推进我们的运维自动化,甚至到智能化.

    看到这里,我理想中的运维自动化的配置管理平台应该有如下功能:
        1:对状态的配置及管理(最基本的)
        2:可以及时的对系统状态进行调整并能看到结果(可以方便的实时升级系统状态)
        3:可以对其本身做方便的第三方管理(借助其API,直接给状态制定好其发展方向)
         
    加分项:
        1:开发语言单一
        2:架构简单,灵活
        3:有不差的安全性
        4:没有商业版

    下面是现有比较有代表性的自动化配置管理工具:
        附:以下仅基于开源版本进行介绍

            理念                                             优缺点
    puppet  从运维的角度去做配置管理(运维人员做给运维用的)   架构简单,系统比较成熟/不便于第三方管理
    chef    从研发的角度去做配置管理(研发人员做给运维用的)   较便于第三方管理,对自身(节点,变量,cookbook)的管理较方便,有自己的dashboard,cookbook支持版本管理,自从cookbook的版本管理/架构复杂,开发语言较多,(安全问题)

      以上2者都比较侧重于状态的管理,对单个或者多个状态的临时调整或者管理较差
      2个都有商业版,让我这个用开源版的很自卑

     这里我们也能看到,2个配置功能都没能达到我理想中的状态,那就暂用chef吧,直到有一天,了解到了saltstack看到了这句话:“ 系统配置的自动化不仅可预测,可重复, 还具有可管理性”(http://wiki.saltstack.cn/reproduction/dive-into-saltstack),这尼玛才是运维自动化的未来啊,于是毫无节操的开始学习salt,而且发现越学越喜欢;在我使用puppet及chef的时候都没有使用salt的感觉,太爽了。所以我这里仅仅介绍几本的语法不涉及实际用例,salt的安装非常方便,所以你在看本文档的时候希望你能真正的动手去做一下,然后你就会爱上salt了

     附::如果你会python,salt基本是不需要怎么学的,而我正好了解一点py,不过这最多占我选择salt的20%。

##1:saltstack的基本介绍
    salt是一个新的基础平台管理工具。很短的时间即可运行并使用起来, 扩展性足以支撑管理上万台服务器,数秒钟即可完成数据传递. 经常被描述为 Func加强版+Puppet精简版。
    salt的整个架构都是基于消息来实现.所以能够提供横强的拓展性,灵活性,实时性;不夸了,看实际的slat是什么样的
    不过salt还是一个很年轻的东西,还有很多地方不够完善,做的不够好,不过我相信这些都只是时间问题。

    注:以下文档仅仅为基本内容,相关知识点的深入学习,请看相应文档连接
##2:salt的安装
     安装有很多途径,作为一个centos的用户,我选择rpm
     首先添加RPM源:

        rpm -ivh http://mirrors.sohu.com/fedora-e ... ease-6-8.noarch.rpm

        附:实际生产中我是自建源
        
     epel中关于salt的包:
       salt-api.noarch : A web api for to access salt the parallel remote execution system
       salt-master.noarch : Management component for salt, a parallel remote execution system
       salt-minion.noarch : Client component for salt, a parallel remote execution system
       salt.noarch : A parallel remote execution system
       salt-cloud.noarch : Generic cloud provisioning tool
    1:服务端
        1:安装
               yum install salt-master
          2:配置文件
               /etc/salt/master
               配置文件选项介绍:  http://docs.saltstack.com/ref/configuration/master.html
               最基本字段:
                    interface: 服务端监听IP
          3:运行
               调试模式:
                    salt-master  -l debug
               后台运行:
                    salt-master  -d  
               作为centos管理员,我选择:
                    /etc/init.d/salt-master start
          4:注意事项:
               1:监听端口
                     4505(publish_port):salt的消息发布系统
                     4506(ret_port):salt客户端与服务端通信的端口
                所以确保客户端能跟服务端的这2个端口通信
     2:客户端
          1:安装
               yum install salt-minion
          2:配置文件
               /etc/salt/minion
               配置文件选项介绍: http://docs.saltstack.com/ref/configuration/minion.html
               最基本字段:
                    master: 服务端主机名
                    id: 客户端主机名(在服务端看到的客户端的名字)
          3:运行
               调试模式:
                    salt-minion  -l debug
               后台运行:
                    salt-minion  -d  
               作为centos管理员,我选择:
                    /etc/init.d/salt-minion start
          4:注意事项:
               1:minion 默认和主机名salt的主机通信
               2:关于配置文件
                   salt的配置文件均为yaml风格
                   $key: $value     #注意冒号后有一个空格
        3:基础知识
            1:salt minion和master的认证过程:
                (1) minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成minion.pem(private key), minion.pub(public key),然后将minion.pub发送给master
                (2) master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的public key, 然后master就能对minion发送指令了
        
            如下:
                启动服务端:
                    /etc/init.d/salt-minion restart
                启动客户端:
                    /etc/init.d/salt-minion restart
                服务端查看key:
                salt-key
                    Accepted Keys:
                    Unaccepted Keys:
                    minion1
                    Rejected Keys:
                服务端接受key
                    salt-key -a minion1
                测试:
                    salt 'minion1' test.ping
                        minion1:
                            True
          附:salt更多命令及手册
                salt '*' sys.doc
##3:salt的使用:
    1:基础知识
        1:targeting
            salt '*' test.ping
            引号中以实现很强大的minion的过滤与匹配技术
            文档:http://docs.saltstack.com/topics/targeting/compound.html

            常用命令:
                salt 'shell正则' 命令
                salt -E 'prel 正则'
                salt -N $group 命令
                salt -L 'server_id1,server_id2,server_id3'  命令

            示例:
                salt -C 'webserv* and G@os:Debian or E@web-dc1-srv.*' test.ping
        2:nodegroup
           对minion进行分组
            文档: http://docs.saltstack.com/topics/targeting/nodegroups.html
            在master的配置文件中按如下格式定义:
            nodegroups:
                group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com'
                group2: 'G@os:Debian and foo.domain.com'
            在state或者pillar中引用的时候如下:
                base:
                    group1:
                        - match: nodegroup   
                        - webserver
        3:grains
            minion基本信息的管理
            文档:http://docs.saltstack.com/topics/targeting/grains.html
            基本使用:
                salt '*' grains.ls  查看grains分类
                salt '*' grains.items 查看grains所有信息
                salt '*' grains.item osrelease 查看grains某个信息
            示例:
                salt '*' grains.item osrelease
                    minoin1:
                      osrelease: 6.2
            在用salt进行管理客户端的时候或者写state的时候都可以引用grains的变量
        4:pillar
            salt敏感信息的管理,只有匹配到的节点才能看到和使用
            文档:http://docs.saltstack.com/topics/tutorials/pillar.html
            默认:pillar数据定义文件存储路径:/srv/pillar
            入口文件:/srv/pillar/top.sls
            格式:
                base:
                    "targeting":
                        - $pillar            #名字为pillar.sls的文件来存放对匹配到的minion的变量
                $pillar.sls
                基本:
                    $key: $value
                     state引用方式:
                        {{ pillar['$key'] }}
               复杂:
                    users:
                           thatch: 1000
                           shouse: 1001
                           utahdave: 1002
                           redbeard: 1003   
                    state引用方式:
                        {% for user, uid in pillar.get('users', {}).items() %}
                            {{user}}:
                            user.present:
                                - uid: {{uid}}
                        {% endfor %}

            查看节点的pillar数据:
                salt 'client2' pillar.data
            同步pillar:
                salt '*' saltutil.refresh_pillar

            附:这里我们可以看到,pallar中也可以使用jinja(后面会提到)做一些处理
            
        5:minion
            即为salt的客户端
     
    2:状态管理
        1:state
            salt基于minion进行状态的管理
            1:state语法
                文档:http://docs.saltstack.com/ref/states/all/index.html
                结构:
                    $ID:  #state的名字
                        $state:     #要管理的模块类型
                        - $State states #该模块的状态
                示例:
                    vim:
                        pkg:   
                        {% if grains['os_family'] == 'RedHat' %}   
                        - name: vim-enhanced   
                        {% elif grains['os'] == 'Debian' %}   
                        - name: vim-nox   
                        {% elif grains['os'] == 'Ubuntu' %}   
                        - name: vim-nox   
                        {% endif %}   
                        - installed
                    如果是redhard系列的就安装 vim-enhanced,如果系统是Debian或者Ubuntu就安装vim-nox
                附:state默认使用jinja(http://jinja.pocoo.org/)的模板语法,
                    文档地址:  http://jinja.pocoo.org/docs/templates/
            2:state的逻辑关系:
                文档:http://docs.saltstack.com/ref/states/ordering.html

                require:依赖某个state,在运行此state前,先运行依赖的state,依赖可以有多个
                    httpd:
                      pkg:
                        - installed
                      file.managed:
                        - name: /etc/httpd/conf/httpd.conf
                        - source: salt://httpd/httpd.conf
                        - require:
                          - pkg: httpd

                watch:在某个state变化时运行此模块
                    redis:
                      pkg:
                        - latest
                      file.managed:
                        - source: salt://redis/redis.conf
                        - name: /etc/redis.conf
                        - require:
                          - pkg: redis
                      service.running:
                        - enable: True
                        - watch:
                          - file: /etc/redis.conf
                          - pkg: redis
               
                附:watch除具备require功能外,还增了关注状态的功能
               
                order:
                优先级比require和watch低
                    有order指定的state比没有order指定的优先级高
                    vim:
                      pkg.installed:
                        - order: 1

                     想让某个state最后一个运行,可以用last     
            3:state与minion
                将临时给minoin加个state
                    salt 'minion1' state.sls 'vim'  #给minion1加一个vim的state
                    执行该命令后可以立即看到输出结果
            
        2:highstate
            给minion永久下添加状态
            文档: http://docs.saltstack.com/ref/states/highstate.html
            默认配置文件:/srv/salt/top.sls
            语法:
            '*':
                - core
                - wsproxy
            /srv/salt/目录结构:
                .
                ├── core.sls
                ├── top.sls
                └── wsproxy   
                    ├── init.sls   
                    ├── websocket.py
                    └── websockify

            应用:
                salt "minion1" state.highstate
            测试模式:
                salt "minion1" state.highstate -v test=True
        3:salt schedule
            默认的state只有在服务端调用的时候才执行,很多时候我们希望minon自觉的去保持在某个状态
            文档:http://docs.saltstack.com/topics/jobs/schedule.html
            cat /srv/pillar/top.sls
            base:
              "*":
                - schedule
                 cat /srv/pillar/schedule.sls
            schedule:
              highstate:
                function: state.highstate
                minutes: 30
            如上配置:
                minion会没30分钟从master拉去一次配置,进行自我配置
    3:实时管理
        有时候我们需要临时的查看一台或多台机器上的某个文件,或者执行某个命令
            1:cmd.run
                用法 salt '$targeting' cmd.run '$cmd'
                示例:salt '*' cmd.run 'hostname'
                执行下这样的命令,马上就感受到效果了,速度还贼快
            2:module
                同时,salt也将一些常用的命令做了集成
                文档:http://docs.saltstack.com/ref/modules/all/index.html
                这里几乎涵盖了我们所有的常用命令
                比如:
                    查看所有节点磁盘使用情况
                        salt '*' disk.usage
     4:无master
          文档:http://docs.saltstack.com/topics/tutorials/quickstart.html
          主要应该在测试和salt单机管理的时候
           
##4:salt开发
    1:saltclient管理salt
        只有才master才可以
        salt全部用python,这里也用python
        文档:http://docs.saltstack.com/ref/python-api.html
        示例:
        import salt.client
        client = salt.client.LocalClient()
        ret = client.cmd('*', 'cmd.run', ['ls -l'])
        print ret
    2:salt api
        salt api我现在还没用,不过我也没搞定,如果你搞定了,我会非常感谢你能分享下的。


####参考文档:
    1:salt中文wiki:http://wiki.saltstack.cn/
       很不错的文章:http://wiki.saltstack.cn/reproduction/dive-into-saltstack
    2:salt官网http://saltstack.com/
         官网文档:http://docs.saltstack.com/

salt qq群:294953305

author weibo:halfss (http://weibo.com/halfss)

该贴已经同步到 halfss的微博

Rank: 6Rank: 6

注册时间
2011-8-4
最后登录
2014-9-18
在线时间
34 小时
阅读权限
70
积分
9956
帖子
7
主题
0
精华
0
UID
15277
发表于 2013-5-22 14:03:08 |显示全部楼层
学习了

使用道具 举报

Rank: 6Rank: 6

注册时间
2011-10-31
最后登录
2020-5-14
在线时间
25 小时
阅读权限
70
积分
6708
帖子
39
主题
17
精华
2
UID
15864
发表于 2013-5-22 14:08:34 |显示全部楼层
本帖最后由 halfss 于 2013-5-22 14:08 编辑

论坛不支持markdown,排版有问题,这里附上pdf版,纯markdown

运维自动化之salt.pdf

332.07 KB, 下载次数: 431

已有 1 人评分积分 收起 理由
NetSeek + 30

总评分: 积分 + 30   查看全部评分

使用道具 举报

Rank: 6Rank: 6

注册时间
2009-9-11
最后登录
2015-2-16
在线时间
30 小时
阅读权限
70
积分
6980
帖子
55
主题
11
精华
0
UID
5331
发表于 2013-5-22 14:11:18 |显示全部楼层
顶顶

使用道具 举报

Rank: 6Rank: 6

注册时间
2011-8-23
最后登录
2015-3-31
在线时间
27 小时
阅读权限
70
积分
9404
帖子
16
主题
0
精华
0
UID
15498
发表于 2013-5-22 14:33:58 |显示全部楼层
顶!
<-sina_sign,2297735104,e10a4b17,1->

使用道具 举报

Rank: 8Rank: 8

注册时间
2010-9-6
最后登录
2020-6-27
在线时间
3058 小时
阅读权限
90
积分
58749
帖子
1405
主题
1178
精华
0
UID
10313
发表于 2013-5-22 22:29:50 |显示全部楼层
我看一下先
Windows、MSSQL 、IIS、FreeBSD、 Linux、Nginx、Apache、MySQL、LVS、Haproxy等服务器应用;大型网站与服务器架构;网络安全;高可用集群及负载均衡;Q群:21085957

使用道具 举报

Rank: 8Rank: 8

注册时间
2009-4-15
最后登录
2017-12-4
在线时间
906 小时
阅读权限
90
积分
85989
帖子
149
主题
1
精华
0
UID
2479
发表于 2013-5-23 08:55:43 |显示全部楼层


感谢楼主共享

使用道具 举报

Rank: 7Rank: 7Rank: 7

注册时间
2010-7-3
最后登录
2015-5-15
在线时间
267 小时
阅读权限
100
积分
46000
帖子
340
主题
21
精华
1
UID
9704
发表于 2013-5-27 15:51:10 |显示全部楼层
回头测试下

使用道具 举报

Rank: 6Rank: 6

注册时间
2010-1-21
最后登录
2020-6-27
在线时间
2384 小时
阅读权限
70
积分
4760
帖子
1221
主题
1142
精华
1
UID
7659
发表于 2013-5-28 14:59:33 |显示全部楼层
:lol 顶!不错!

使用道具 举报

Rank: 8Rank: 8

注册时间
2009-4-22
最后登录
2020-6-27
在线时间
82 小时
阅读权限
90
积分
22301
帖子
18
主题
1
精华
0
UID
2622
发表于 2013-5-30 17:48:26 |显示全部楼层
顶下先:):):)

使用道具 举报

Rank: 6Rank: 6

注册时间
2010-12-12
最后登录
2017-8-29
在线时间
116 小时
阅读权限
70
积分
6326
帖子
60
主题
0
精华
0
UID
11461
发表于 2013-6-14 15:10:43 |显示全部楼层
好东西哇  感谢LZ分享

使用道具 举报

Rank: 8Rank: 8

注册时间
2013-5-27
最后登录
2014-10-29
在线时间
61 小时
阅读权限
90
积分
12047
帖子
29
主题
2
精华
0
UID
38394
发表于 2013-6-14 21:56:41 |显示全部楼层
经典,哥们给你顶一下!

使用道具 举报

Rank: 7Rank: 7Rank: 7

注册时间
2008-11-26
最后登录
2017-9-11
在线时间
627 小时
阅读权限
100
积分
93417
帖子
450
主题
18
精华
1
UID
618
发表于 2013-6-18 11:42:57 |显示全部楼层
支持,,

使用道具 举报

Rank: 4

注册时间
2009-3-31
最后登录
2014-11-26
在线时间
2 小时
阅读权限
50
积分
994
帖子
3
主题
0
精华
0
UID
2230
发表于 2013-7-3 15:08:32 |显示全部楼层
精华帖~~~~学习了

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-9-17
最后登录
2019-7-22
在线时间
61 小时
阅读权限
90
积分
15327
帖子
58
主题
6
精华
0
UID
15656
发表于 2013-7-5 13:46:44 |显示全部楼层
挺好,收藏!!!!!!!!!!!!

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2020-9-25 07:30 , Processed in 0.036414 second(s), 17 queries , Apc On.

Powered by Discuz! X2 Licensed

© 2001-2011 Comsenz Inc.

回顶部