saltstack笔记

一、saltstack是什么?

saltstack是一个开源异构平台基础设置管理工具。

二、saltstack能干什么?

如果你是一个管理成百上千台服务器的管理员,你是否会遇到如下几个场景?
1.需要在每台服务器上部署agent,几百台服务器难道一个一个部署?
2.agent配置需要变更,也需要一个一个配置?
3.0day漏洞爆出,需要检查服务器版本,安装对应补丁,怎么办?

  • 配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的包被安装,指定的服务在运行)。
  • 分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据。

为什么要使用salt?

  • 简单,非常容易设置和维护,不用考虑项目的大小。几乎不改动配置就可以工作。
  • 并行执行,命令发送到远程系统是并行的而不是串行的,使用安全的加密协议,使用最小最快的网络载荷,提供简单的编程接口。
  • 灵活易扩展,使用python开发,可以从简单的Python API调用,或者从命令行被调用,可以用来执行一次性命令,也可以作为一个更大的应用程序的一个组成部分。

三、saltstack运行方式?

saltstack三种运行方式

  • Local
  • Master/Minion
  • Salt SSH

最传统的运行方式还是C/S模式,管理端安装Master,被管理节点上安装Minion客户端。
下面主要介绍Master/Minion运行方式。

四、saltstack基本安装和配置

这里采用repo源,在线安装。请参考官方文档
分别在管理端和被管理节点使用yum命令进行安装。

  yum install salt-master
  yum install salt-minion

安装完成之后,首先启动master

  service salt-master start
  #或者
  /etc/init.d/salt-master start

打开minion节点,编辑配置文件

  vim /etc/salt/minion
  #添加下面配置,注意分号后面有空格!
  master: 192.168.252.136 #master端ip,有dns解析也可以填写域名。
  id: web137 #本节点名称,填好之后尽量不要更改。

启动minion

  service salt-minion start

切换到master

  #查看minion
  salt-key -L
  #会列如下信息
  [root@localhost ~]# salt-key #省略-L也行。
  Accepted Keys:
  Denied Keys:
  Unaccepted Keys:
  web137
  Rejected Keys:
  #接受minion
  salt-key -a web137 -y # -a 后面指定要接受的id名称
  或者
  salt-key -A # -A表示接受所有,同理,可以使用 -d ,-D拒绝掉。
  #再次查看
  [root@localhost ~]# salt-key -L
  Accepted Keys:
  web137
  Denied Keys:
  Unaccepted Keys:
  Rejected Keys:

至此,一个简单的saltstack环境就已经搭建好了。

一些注意事项和说明:
a) master使用两个端口和minion通信,要确保这两个端口通信正常。

  • 4505 publish_port 消息发布系统端口
  • 4506 ret_port 客户端与服务端通信端口

可以关闭掉防火墙,或者将端口添加至INPUT链表。

  #iptables链表规则是自上而下,这里插入在REJECT ALL之前。  
  iptables -I INPUT 5 -p tcp --dport 4505 -j ACCEPT -m comment --comment "salt_publish_port"
  iptables -I INPUT 5 -p tcp --dport 4506 -j ACCEPT -m comment --comment "salt_ret_port"

当然也可以在配置文件自定义端口。

  #master配置文件
  vim /etc/salt/master
  #修改如下配置,注意空格!
  publish_port: 1505
  ret_port: 1506
  #修改成自定义的端口即可,注意,minion节点也需要指定master端口。
  #minion配置文件
  vim /etc/salt/minion
  #配置如下
  master_port: 1506 #指定master通信端口即可

b) minion和master认证过程
1.minion在首次启动时,会在/etc/salt/pki/minion/下自动生成公钥和私钥
minion.pub(public key)和minion.pem(private key),并将公钥(minion.pub)发送给master
2.master在接收到minion的公钥后,通过salt-key命令接受minion,并将minion公钥
放在/etc/salt/pki/master/minions下,以minion id命名。这个时候,master就可以对minion发送指令了。
也可以配置为自动接受

  #master配置
  vim /etc/salt/master
  #配置如下
  auto_accept: True #修改为自动接受

五、saltstack简单应用

salt命令格式

  salt '<操作目标>' <模块.方法> [参数]

引号中的操作目标,可以使用正则和通配符过滤、筛选。

  • salt 'shell正则' 命令
    //使用通配符

  • salt -E 'prel正则' 命令
    //使用正则表达式

  • salt -N $group 命令
    //使用分组名称
    可以在配置文件进行分组

    #编辑master文件
    vim /etc/salt/master
    #配置如下
    nodegroups:
      group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com and bl*.domain.com'
      group2: 'G@os:Debian and foo.domain.com'
    
  • salt -L 'server_id1,server_id2,server_id3' 命令
    //指定多个目标id

  • salt -G 'osrelease:6.9' 命令
    //指定os版本为6.9

示例:test.ping、cmd.run

  #检测通讯是否正常
  salt '*' test.ping
  #test.ping
  [root@localhost ~]# salt '*' test.ping  
  web137:
      True
  mysql138:
      True

  #执行命令
  salt '*' cmd.run 'df -Th'
  #cmd.run
  [root@localhost ~]# salt '*' cmd.run 'df -Th'
  mysql138:
    Filesystem           Type   Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup-lv_root
                         ext4    18G  968M   16G   6% /
    tmpfs                tmpfs  491M   12K  491M   1% /dev/shm
    /dev/sda1            ext4   477M   52M  400M  12% /boot
  web137:
    Filesystem           Type   Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup-lv_root
                         ext4    18G  968M   16G   6% /
    tmpfs                tmpfs  491M   12K  491M   1% /dev/shm
    /dev/sda1            ext4   477M   52M  400M  12% /boot

怎么知道有哪些模块可用?怎么知道模块有哪些方法可以用、怎么用?

  #获取所有支持的模块
  salt 'web137' sys.list_modules
  #
  [root@localhost ~]# salt 'web137' sys.list_modules
  web137:
    - acl
    - aliases
    - alternatives
    - archive
    - artifactory
    后面部分省略

  #获取模块说明文档
  salt 'web137' sys.doc test
  #
  [root@localhost ~]# salt 'web137' sys.doc test
  'test.arg:'

    Print out the data passed into the function ``*args`` and ```kwargs``, this
    is used to both test the publication data and cli argument passing, but
    also to display the information available within the publication data.
    Returns {"args": args, "kwargs": kwargs}.

    CLI Example:

        salt '*' test.arg 1 "two" 3.1 txt="hello" wow='{a: 1, b: "hello"}'
    

  'test.arg_repr:'

    Print out the data passed into the function ``*args`` and ```kwargs``, this
    is used to both test the publication data and cli argument passing, but
    also to display the information available within the publication data.
    Returns {"args": repr(args), "kwargs": repr(kwargs)}.

    CLI Example:

        salt '*' test.arg_repr 1 "two" 3.1 txt="hello" wow='{a: 1, b: "hello"}'
  后面部分省略

软件包的安装

  #pkg.install
  salt 'web137' pkg.install tree
  #
  [root@localhost ~]# salt 'web137' pkg.install tree
  web137:
    ----------
    tree:
        ----------
        new:
            1.5.3-3.el6
        old:

pkg 函数会自动将本地系统包管理器映射到相同的salt函数。这意味着 pkg.install 在基于Red Hat系统上将使用 yum 而在Debian系统上则使用 apt 来安装包。

grains模块说明
grains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型、网卡ip等。

  #列出所有的 grains 项目名字
  [root@localhost ~]# salt 'web137' grains.ls
  web137:
    - SSDs
    - cpu_flags
    - cpu_model
    - cpuarch
    - domain
    - fqdn
    - fqdn_ip4
    - fqdn_ip6
    - gpus
  #列出所有的 grains 项目名以及值
  [root@localhost ~]# salt 'web137' grains.items
  web137:
    ----------
  SSDs:
  cpu_flags:
      - fpu
      - vme
      - de
      - pse
      - tsc


  #也可以在minion配置自定义信息
  #编辑minion配置,注意空格!
  vim /etc/salt/minion
  grains:
    roles:
      - webserver
      - memcache
    deployment: datacenter4
    cabinet: 13
    cab_u: 14-15

有了这些信息之后,在远程执行命令时就很方便。我们可以按照 grains 的一些指标来操作。如上面提到,salt -G 'osrelease:6.9' 命令。

pillar模块说明
pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,还可以定义变量等。

  #编辑配置文件
  vim /etc/salt/master
  #添加
  pillar_roots:
    base:
      - /srv/pillar
  #如果pillar文件夹不存在,新建文件夹
  mkdir -p /srv/pillar
  #修改配置文件后,重启一下master
  service salt-master restart
  #新建入口文件top.sls
  vim /srv/pillar/top.sls
  #添加内容
  base:
    'web137': #指定minion节点
      - web137_info
  #新建web137_info.sls文件
  vim /srv/pillar/web137_info.sls
  #添加内容,注意分号后面有空格!
  conf: /etc/web137.conf
  myname: webserver
  #刷新一下pillar状态
  salt '*' saltutil.refresh_pillar
  #查看一下
  salt 'web137' pillar.items
  #
  [root@localhost pillar]# salt 'web137' pillar.items
  web137:
      ----------
      conf:
          /etc/web137.conf
      myname:
          webserver
  #可以指定单个
  salt 'web137' pillar.item conf
  #
  [root@localhost pillar]# salt 'web137' pillar.item conf
  web137:
      ----------
      conf:
          /etc/web137.conf
  #通过 -I 也可以作为匹配信息
  salt -I 'myname:webserver' test.ping
  #
  [root@localhost pillar]# salt -I 'myname:webserver' test.ping
  web137:
      True

其他杂项
#远程传输文件,将本地文件copy到节点
root@localhost:~# salt-cp '' ./abc.txt /opt/
{'ftp138': {'/opt/abc.txt': True}, 'web137': {'/opt/abc.txt': True}}
#磁盘使用
[root@salt-master /]# salt '
' disk.usage
#网络接口
[root@salt-master /]# salt '' network.interfaces
#文件压缩
root@localhost:~# salt '
' archive.gzip /opt/abc.txt
#文件解压缩
root@localhost:~# salt '' archive.gunzip /opt/abc.txt.gz
#拷贝文件到客户端
salt '
' cp.get_file salt://apache.txt /tmp/cp.txt
#拷贝目录到客户端
salt '' cp.get_dir salt://test /tmp
#显示存活的客户端
salt-run manage.up
#执行服务端脚本
salt '
' cmd.script salt://test/shell.sh

六、saltstack高级应用

1、配置管理安装apache

  #编辑配置文件
  vim /etc/salt/master
  #添加下面配置
  file_roots:
    base:
      - /srv/salt
  #环境: base、dev(开发环境)、test(测试环境)、prod(生产环境)。
  #新建目录salt
  mkdir -p /srv/salt
  #新建top.sls文件
  vim /srv/salt/top.sls
  #添加内容
  base:
    'web137':
      - apache
  #新建apache.sls文件
  vim /srv/salt/apache.sls
  #添加,特别要注意空格!
  apache-service: #自定义id名称
    pkg.installed: #包安装函数
    - names: #如果只有一个服务 - name:httpd
      - httpd #包名
      - httpd-devel

  file.managed:
    - name: /etc/httpd/conf/httpd.conf #目标文件位置
    - source: salt://httpd.conf #源文件,将配置文件放在/srv/salt/目录下
    - user: root #文件所属用户
    - group: root #文件所属组
    - mode: 644 #文件权限

  service.running: #指定服务运行
    - name: httpd  #服务名称
    - enable: True  #设置开机自启
  #
  salt 'web137' state.highstate
  #或者直接指定文件
   salt 'web137' state.sls apache #不需要.sls

2、目录操作

  #编辑top.sls文件
  vim /srv/salt/top.sls
  base:
    'mysql138' :
      - diroper
  #新建diroper文件
  vim /srv/salt/diroper.sls
  diroper:
    file.recurse:
      - name: /tmp/diroper
      - source: salt://diroper
      - user: root
      - file_mode: 644
      - dir_mode: 755
      - mkdir: True
      - clean: True #删除源文件则目标也会跟着删除
  #应用
  salt 'mysql138' state.highstate

3、远程执行脚本

  #添加
  cmdexe:
    - onlyif: test -f /tmp/123.txt
    - names:
      - touch /tmp/cmdtest.txt
      - mkdir /tmp/cmdtest
    - user: root
  #添加
  shell-test:
  cmd.script:
    - source: salt://test/1.sh
    - user: root

4、管理crontab
#添加
cron-test:
cron.present: #把 cron.present: 改成 cron.absent为删除
- name: /bin/touch /tmp/111.txt
- user: root
- minute: '' #注意星号要使用单引号
- hour: 20
- daymonth: 1-10
- month: '3,5'
- dayweek: '
'

七、saltstack开发

  import salt.client 
  client = salt.client.LocalClient()
  ret = client.cmd('*','test.ping')
  print ret

八、总结和参考

  • 配置文件都是键值对的形式,需要特别注意空格。

  • 以上演示的是都在linux环境下部署,saltstack是可以支持多环境,但需要注意的是master不支持安装在windows环境。

  • 笔记未涉及到部分

    • windows配置、云配置
    • web界面
    • 架构中还有一个类似代理层的syndic

参考网址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容