saltstack--自动化运维管理


server1 :192.168.1.11 master端
server2 : 192.168.1.12 minion端
server3 : 192.168.1.13 minion端

saltstack简介

  • saltstack是一个配置管理系统,能够维护预定义状态的远程节点。
  • saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
  • saltstack是运维人员提高工作效率、规范业务配置与操作的利器。

Salt的核心功能

  • 使命令发送到远程系统是并行的而不是串行的

  • 使用安全加密的协议

  • 使用最小最快的网络载荷

  • 提供简单的编程接口

  • Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。

  • 区别:
    Salt 和ansible 最大的区别在于salt是具有客户端的,而 ansible 没有,salt 直接获取root权限进行访问

saltstack通信机制

  • SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ(轻量级)消息队列通信,默认监听4505端口。saltstack的优势就在于这个ZMQ,它运行起来的速度比ansible快很多

在这里插入图片描述

  • Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口,就是接受客户端的回执的。

在这里插入图片描述

安装与配置

  • 进入官网下载,或者使用国内的开源镜像网站(如清华大学镜像中科大镜像网站或者阿里云)进行下载:

      yum install https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
    
  • 设置官方yum仓库
    因为这条命令会产生一个新的yum源,然而这个yum源的镜像地址并不是非常快,我们把它换成aliyun的地址,会快一些

      [root@rhel7 yum.repos.d]# ls
      redhat.repo  salt-latest.repo
      [root@rhel7 yum.repos.d]# cat salt-latest.repo 
      [salt-latest]
      name=SaltStack Latest Release Channel for RHEL/Centos $releasever
      baseurl=https://mirrors.aliyun.com/saltstack/yum/redhat/7/$basearch/latest
      ##阿里云的镜像地址
      failovermethod=priority
      enabled=1
      gpgcheck=1
      gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key
    

    更改后查看yum源是否配置好:

      [root@rhel7 yum.repos.d]# yum repolist
      Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-
                    : manager
      This system is not registered with an entitlement server. You can use subscription-manager to register.
      repo id            repo name                                              status
      salt-latest/x86_64 SaltStack Latest Release Channel for RHEL/Centos 7Serv 83
      repolist: 83
    

    在server2上做同样的配置。

    master节点配置:server1

      [root@rhel7 yum.repos.d]# yum install -y salt-master
      Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-
                    : manager
      This system is not registered with an entitlement server. You can use subscription-manager to register.
      Resolving Dependencies
      --> Running transaction check
      ---> Package salt-master.noarch 0:3000.3-1.el7 will be installed
      ......省略
      --> Finished Dependency Resolution
      Error: Package: salt-3000.3-1.el7.noarch (salt-latest)  ##注意这里的依赖性并没有得到解决
                 Requires: python-markupsafe
      Error: Package: salt-3000.3-1.el7.noarch (salt-latest)
                 Requires: python-jinja2
       You could try using --skip-broken to work around the problem
       You could try running: rpm -Va --nofiles --nodigest
    

    解决依赖性,成功安装

      设置自启动
      [root@server1 Downloads]# systemctl enable salt-master 
      Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service.
      启动
      [root@server1 Downloads]# systemctl start salt-master
      安装用来查看已经打开的端口的包
      [root@server1 Downloads]# yum install -y lsof
      Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-
                    : manager
      This system is not registered with an entitlement server. You can use subscription-manager to register.
      Nothing to do
      接受请求
      [root@server1 Downloads]# lsof -i :4506
      COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      salt-mast 11417 root   23u  IPv4  82603      0t0  TCP *:4506 (LISTEN)
      消息队列
      [root@server1 Downloads]# lsof -i :4505
      COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      salt-mast 11411 root   15u  IPv4  82565      0t0  TCP *:4505 (LISTEN)
    

    minion节点配置:server2,server3

      yum install -y salt-minion  #安装minion端
      vim /etc/salt/minion #对minion端的配置文件进行配置
      master: 192.168.1.11  #指定master端
      systemctl enable salt-minion  #设置自启动minion
      systemctl start salt-minion  #开启自启动
    

    配置完minion端之后,查看master端

      [root@server1 Downloads]# lsof -i :4506 #请求消息端口
      COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      salt-mast 14705 root   23u  IPv4 104656      0t0  TCP *:4506 (LISTEN)
      # server2向server1发送的请求
      salt-mast 14705 root   30u  IPv4 115223      0t0  TCP server1:4506->192.168.1.12:51154 (ESTABLISHED)
      # server3向server1发送的请求
      salt-mast 14705 root   31u  IPv4 115229      0t0  TCP server1:4506->192.168.1.13:45888 (ESTABLISHED)
      [root@server1 Downloads]# lsof -i :4505  #消息队列
      COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      salt-mast 14699 root   15u  IPv4 104627      0t0  TCP *:4505 (LISTEN)
    

    这时master端需要通过key去允许minion端的连接

      [root@server1 Downloads]# salt-key -L
      Accepted Keys:
      Denied Keys:
      Unaccepted Keys:
      server2
      server3
      Rejected Keys:
    

    同意key:-A允许所有

      [root@server1 Downloads]# salt-key -A
      The following keys are going to be accepted:
      Unaccepted Keys:
      server2
      server3
      Proceed? [n/Y] y
      Key for minion server2 accepted.
      Key for minion server3 accepted.
    

    再次查看

      [root@server1 Downloads]# salt-key -L
      Accepted Keys:
      server2
      server3
      Denied Keys:
      Unaccepted Keys:
      Rejected Keys:
      #请求队列
      [root@server1 Downloads]# lsof -i :4506
      COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      salt-mast 14705 root   23u  IPv4 104656      0t0  TCP *:4506 (LISTEN)
      #消息队列(已经建立长链接,master发的时候,minion端就可以收到)
      [root@server1 Downloads]# lsof -i :4505
      COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      salt-mast 14699 root   15u  IPv4 104627      0t0  TCP *:4505 (LISTEN)
      salt-mast 14699 root   17u  IPv4 118817      0t0  TCP server1:4505->192.168.1.12:53022 (ESTABLISHED)
      salt-mast 14699 root   18u  IPv4 118822      0t0  TCP server1:4505->192.168.1.13:41772 (ESTABLISHED)
    

    注意: 当我们更改了主机名时,要及时的去这个文件中更改,或者删除文件,重启minion端。因为salt会去读文件中的名字

      [root@server2 salt]# cat minion_id 
      server2
      [root@server2 salt]# pwd
      /etc/salt
    

查看更详细的进程信息:

安装
[root@server1]# yum install -y python-setproctitle.x86_64
重启salt
[root@server1]# systemctl restart salt-master.service 
[root@server1]# ps ax
...
 19546 ?        S      0:00 /usr/bin/python /usr/share/PackageKit/helpers/yum/yu
 19554 ?        Ss     0:00 /usr/bin/python /usr/bin/salt-master ProcessManager
 19565 ?        S      0:00 /usr/bin/python /usr/bin/salt-master Multiprocessing
 消息队列
 19578 ?        Sl     0:00 /usr/bin/python /usr/bin/salt-master ZeroMQPubServer
 19579 ?        S      0:00 /usr/bin/python /usr/bin/salt-master EventPublisher
 19582 ?        S      0:00 /usr/bin/python /usr/bin/salt-master Maintenance
 请求队列
 19583 ?        S      0:00 /usr/bin/python /usr/bin/salt-master ReqServer_Proce
 维护队列
 19584 ?        Sl     0:00 /usr/bin/python /usr/bin/salt-master MWorkerQueue
 19585 ?        R      0:00 /usr/bin/python /usr/bin/salt-master MWorker-0
 19586 ?        R      0:00 /usr/bin/python /usr/bin/salt-master MWorker-1
 19593 ?        Sl     0:00 /usr/bin/python /usr/bin/salt-master FileserverUpdat
 19594 ?        R      0:00 /usr/bin/python /usr/bin/salt-master MWorker-2
 19595 ?        R      0:00 /usr/bin/python /usr/bin/salt-master MWorker-3
 19598 ?        R      0:00 /usr/bin/python /usr/bin/salt-master MWorker-4
 19897 pts/1    R+     0:00 ps ax

在master端测试ping在minion端的执行情况:

[root@server1 ~]# salt '*' test.ping  #*表示在key中能识别的所有主机
server3:
    True
server2:
    True

指定key进行测试:

[root@server1 ~]# salt server2 test.ping
server2:
    True

我们当前是以超户身份进行远程命令:

[root@server1 ~]# salt server2 cmd.run pwd
server2:
    /root

[root@server1 ~]# salt server2 cmd.run 'touch /tmp/file'
server2:

[root@server2 yum.repos.d]# ls /tmp/file
/tmp/file

slatstack远程执行

  • 测试连接
  • 远程执行命令

salt命令

salt命令由三个主要部分组成:

salt   '<target>'   <function>   [arguments]
  • target:指定哪些minion,默认的规则是使用glob匹配minion_id

      salt '*' test.ping
    

    targets也可以使用正则表达式:

      salt -E 'server[1-3]' test.ping
    

    targets也可以指定列表:

      salt -L 'server2,server3' test.ping
    
  • function是module提供的功能,salt内置了大量有效的functions

      http://docs.saltstack.cn/	查看中文手册
    
      [root@server1 ~]# salt '*' cmd.run 'uname -a'
      server3:
          Linux server3 3.10.0-957.el7.x86_64 #1 SMP Thu Oct 4 20:48:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
      server2:
          Linux server2 3.10.0-957.el7.x86_64 #1 SMP Thu Oct 4 20:48:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    
  • arguments通过空格来界定参数

      salt 'server2' sys.doc pkg  #查看模块文档
      salt 'server2' pkg.install httpd
      salt 'server2' pkg.remove httpd  #这样就很简单的完成了远程安装
      [root@server1 ~]# salt 'server2' pkg.remove httpd
      server2:
          ----------
          httpd:
              ----------
              new:
              old:
                  2.4.6-88.el7
      [root@server1 ~]# salt 'server2' pkg.install httpd
      server2:
          ----------
          httpd:
              ----------
              new:
                  2.4.6-88.el7
              old:
    

命令由4505端口推送,结果由4506接收

salt内置的执行模块(写文件时的用法)

	http://docs.saltstack.cn/ref/modules/all/index.html

salt的数据都会保存在/var/cache/salt目录中

[root@server2 yum.repos.d]# cd /var/cache/salt
[root@server2 salt]# tree .
.
└── minion
    ├── extmods
    └── proc

3 directories, 0 files

编写远程执行模块

除了由salt内置的执行模块,作为用户自己也可以再编写自己的模块。

配置管理

  • salt状态系统的核心是SLS,或者叫SaLt State文件。
  • SLS表示系统将会是什么样的一个状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
  • sls文件命名:
    1.sls文件以“.sls”后缀结尾,但在调用时不用写此后缀
    2.使用子目录来做组织是个很好的选择
    3.init.sls在一个子目录里面表示引导文件,也就表示子目录本身,所以apache/init.sls文件就是表示apache本身
    4.如果同时存在“apache/init.sls”和“apache.sls”文件,则“apache/init.sls”被忽略,“apache.sls”将被用来表示apache

YAML语法

  • 规则一:缩进
    Salt需要每个缩进级别由两个空格组成,不要使用tab
  • 规则二:冒号
    字典keys在YMAL中的表现形式是一个以冒号结尾的字符串
    my_key:my_value
  • 规则三:段横杠
  • 想要表示列表项,使用一个段横杠加一个空格
    - list_value_one
    -list_value_two

grains与pillar详解

grains

  • grains是saltstack的一个组件,它被存放在minion端
  • 当salt-minion启动时会把数据静态存储到grains当中,只有当minion重启时才会进行数据的更新
  • 由于grains时静态数据,所以不推荐常去改它
  • 应用场景:
    信息查询,可做CMDB
    在target中使用,匹配minion
    在state模块中使用,配置管理模块

信息查询

用于查询minion端的IP,FQDN等信息
默认可用的grains

自定义grains项

编写grains模块

grains匹配应用

pillar

  • 与grains一样也是一个数据系统,但是应用场景不同
  • pillar是将信息动态的存放在master端,主要存放私密,敏感信息(如用户名,密码等),而且可以指定某一个minion端才可以看到对应的信息
  • pillar更适合在配置管理中应用

声明pillar

自定义pillar

数据匹配

Jinja模板

简介

  • Jinja是一种基于python的模板引擎,在sls文件里可以直接使用jinja模板来做一些操作
  • 通过jinja模板可以为不同服务器定义各自的变量
  • 两种分隔符:{%…%}和{{…}},前者用于执行诸如for循环或赋值的语句,后者把表达式的结果打印到模板上

使用方式

引用变量

Job管理

  • master在下发指令任务时,会附带上产生的jid
  • minion在接受到指令开始执行时,会在本地的/var/cache/salt/minion/proc目录下产生该gid命名的文件,用于在执行过程中,master查看当前任务的执行情况
  • 指令执行完毕将结果传送给master后,删除该临时文件
    在这里插入图片描述

简介

管理

salt-ssh和salt-syndic

salt-ssh

salt-syndic

salt-api配置

简介

配置

使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章