zoukankan      html  css  js  c++  java
  • Linux-saltstack-2 saltstack的基本使用

    @

    一、salt命令的基本使用

    我们这里有两台被管理机,我以salt-client为被管理端

    [root@salt-master ~]# salt-key  -L
    Accepted Keys:
    salt-client
    salt-client2
    Denied Keys:
    Unaccepted Keys:
    Rejected Keys:
    
    [root@salt-master ~]# salt '*' test.ping
    salt-client:
        True
    salt-client2:
        True
    
    
    

    1.基本语法

    salt [参数] '要执行的目标主机' 执行的模块名.模块里的方法 [方法的参数]
    

    例子:

    这是远程执行shell命令的例子。

    #这就是一个完整格式的salt命令
    [root@salt-master ~]# salt --out=json 'salt-client' cmd.run 'hostname'
    {
        "salt-client": "salt-client"
    }
    
    [root@salt-master ~]# salt --out=yaml 'salt-client' cmd.run 'hostname'
    salt-client: salt-client
    
    
    

    解释:

    salt:是一个命令
    --out:这是salt命令的参数 是将结果按照什么样的格式显示
    salt-client:表示目标主机
    cmd:是模块
    run:ping是test下的方法
    hostnmae:就是传递给cmd.run的参数

    2.salt的常用参数

    (1)-S(大写):通过IP或者是网段匹配被管理主机

    [root@salt-master ~]# salt -S '192.168.1.211' test.ping
    salt-client:
        True
    或者
    [root@salt-master ~]# salt -S '192.168.1.0/24' test.ping
    salt-client:
        True
    salt-client2:
        True
    
    

    (2)-E:通过正则匹配主机

    [root@salt-master ~]# salt -E '.*client' test.ping
    salt-client:
        True
    salt-client2:
        True
    
    

    (3)-L: 匹配多个主机

    多个主机之间用逗号隔开

    [root@salt-master ~]# salt -L 'salt-client,salt-client2' test.ping
    salt-client:
        True
    salt-client2:
        True
    

    (4)-G:通过grain项来匹配

    [root@salt-master ~]# salt '*' grains.get os
    salt-client:
        CentOS
    
    [root@salt-master ~]# salt -G 'os:Centos' test.ping
    salt-client:
        True
    
    

    (5)-I:通过pillar来进行匹配

    [root@salt-master ~]# salt -I 'pillar参数' test.ping
    #后续会有详细介绍
    

    (6)-C:混合模式

    说明:因为-C是混合模式同时使用,所以在表达式中要声明你用的是哪种模式

    语法:
    salt -C '模式简写@表达式,模式简写@表达式,模式简写@表达式...'  模块.方法
    
    #在匹配参数中也可以使用and or not
    
    模式简写 模式类型
    G grains匹配
    E pcre正则匹配
    P grains 正则匹配
    L 列表
    I Pillar匹配
    S IP地址或者网段号

    例子:

    [root@salt-master ~]# salt -C 'S@192.168.1.0/24 and G@os:Centos' test.ping
    salt-client:
        True
    salt-client2:
        True
    

    (7)-N:向指定的组发送命令

    #在指定行定义一个web组
    [root@salt-master ~]# vim /etc/salt/master
    1236 nodegroups:
    1237   web:
    1238     - 'salt-client'
    1239     - 'salt-client2'
    
    #重启master
    [root@salt-master ~]# systemctl  restart salt-master
    
    #和指定的web组主机通信
    [root@salt-master ~]# salt -N 'web' test.ping
    salt-client:
        True
    salt-client2:
        True
    
    

    二、常用的模块以及参数

    1.test

    (1)test.ping 测试连通性

    [root@salt-master ~]# salt '*' test.ping
    salt-client:
        True
    salt-client2:
        True
    
    

    (2)test.version 返回客户端的salt版本

    [root@salt-master ~]# salt '*' test.version
    salt-client:
        3002.2
    salt-client2:
        3002.2
    

    2.pkg

    (1)pkg.install

    安装软件rpm的模块以及方法

    [root@salt-master ~]# salt 'salt-client2' pkg.install httpd
    salt-client2:
        ----------
        httpd:
            ----------
            new:
                2.4.6-97.el7.centos
            old:
        httpd-tools:
            ----------
            new:
                2.4.6-97.el7.centos
            old:
        mailcap:
            ----------
            new:
                2.1.41-2.el7
            old:
    
    

    (2)pkg.remove

    移除rpm软件包

    [root@salt-master ~]# salt 'salt-client2' pkg.remove httpd
    salt-client2:
        ----------
        httpd:
            ----------
            new:
            old:
                2.4.6-97.el7.centos
    
    

    3.sys

    (1)查看所有模块

    [root@salt-master ~]# salt '*' sys.list_modules 
    

    (2)查看模块都有哪些函数

    [root@salt-master ~]# salt '*' sys.list_functions test
    

    (3)查看某个模块或者模块的方法的用法

    [root@salt-master ~]# salt '*' sys.doc test
    或者
    [root@salt-master ~]# salt '*' sys.doc test.ping
    

    4.cmd模块

    cmd.run是非常常用的一个方法,在远程主机上执行命令

    [root@salt-master salt]# salt '*' cmd.run 'head -1 /etc/passwd |sed 's/root/admin/g''
    salt-client:
        admin:x:0:0:admin:/admin:/bin/bash
    
    

    5.file模块

    [root@salt-master ~]# mkdir /srv/salt/file -p
    [root@salt-master ~]# cd /srv/salt/file/
    [root@salt-master file]# ls
    test.sls  test.txt
    [root@salt-master file]# cat test.sls 
    send_file:
      file.managed:
        - source:
          - salt://file/test.txt
        - name: /root/test.txt
        - user: root
        - group: root
        - mode: 777
    
    解释:
       send_file:自定义的任务名称
       file:模块名
       managed: file模块中的方法
       source: 源文件地址,因为使用了salt://  就表示在base(/src/salt)环境下
       name : 文件目标位置以及名称
       user、group: 文件的属主和属组
       mode:文件的权限
    

    执行file目录下的test文件

    [root@salt-master ~]# salt 'salt-client' state.sls file.test
    

    发现客户端已经有了master传过来的文件了

    [root@salt-client ~]# ls test.txt 
    test.txt
    

    三、sls文件

    sls指 SaLt State.
    sls其本质就是python中的字典,以键值对的形式存在,python中的代码如下

    >>> a = {"name":"zhangsan","age":20}
    >>> print a["name"]
    zhangsan
    >>> print a["age"]
    20
    

    state和pillar系统中,都有一个名为top.sls的文件,用于将SLS文件拉在一起并指定在哪个环境下应该为Minion提供哪些SLS文件

    1.sls文件路径配置

    /srv/salt目录下的文件用于定义salt state。
    三个环境(base、dev、prod)分别代表了不同的系统路径。在指定sls文件路径时写"环境"名称就可以了,就不用写那么长的系统路径了。这样就很方便

    [root@salt-master ~]# vim /etc/salt/master
     663 # file_roots:
     664 #   base:    #基础环境
     665 #     - /srv/salt/
     666 #   dev:     #开发环境
     667 #     - /srv/salt/dev/services
     668 #     - /srv/salt/dev/states
     669 #   prod:    #生产环境
     670 #     - /srv/salt/prod/services
     671 #     - /srv/salt/prod/states
     672 #
    

    2.SLS文件实例

    (1)创建sls文件默认的存储路径

    [root@salt-master ~]# mkdir -p /srv/salt
    

    (2)编写一个安装vsftpd服务的sls文件

    [root@salt-master ~]# cd /srv/salt/
    [root@salt-master salt]# vim vsftpd.sls 
    vsftpd_install:
      pkg.installed:
        - name: vsftpd
    
    解释:
    	vsftpd_install: 是一个名称,可以自定义。但是要保证唯一
    	pkg.installed: 是pkg模块里的installed方法。这和命令行里直接使用有些区别
    	- name: 要安装的rpm包名称
    	"-" 的意思说 -后的内容是一个列表中的值
    
    注意:
    	(1)不要使用tab键缩进
    	(2)以空位为单位进行层次划分
    	(3)冒号后边如果要编写值得话 需要加一个空格
    	(4)- 和后边得key 也要有一个空格来分开
    

    (3)执行我们编写得sls文件

    语法:
    salt '目标主机' state.sls 要执行的sls文件
    

    执行结果如下:

    在执行的时候salt 会自动到基础环境路径去搜索vsftod.sls文件。也就是master配置文件中base规定的路径(/srv/salt)下去找。

    [root@salt-master ~]# salt 'salt-client2' state.sls vsftpd
    salt-client2:
    ----------
              ID: vsftpd_install
        Function: pkg.installed
            Name: vsftpd
          Result: True
         Comment: The following packages were installed/updated: vsftpd
         Started: 16:35:24.014509
        Duration: 5759.362 ms
         Changes:   
                  ----------
                  vsftpd:
                      ----------
                      new:
                          3.0.2-28.el7
                      old:
    
    Summary for salt-client2
    ------------
    Succeeded: 1 (changed=1)
    Failed:    0
    ------------
    Total states run:     1
    Total run time:   5.759 s
    
    

    (4)启动服务

    我们发现服务器确实安装了,但是没有启动。可以在加入一个模块,让服务安装完毕之后在立即启动。

    [root@salt-client2 ~]# rpm -qa |grep vsftpd
    vsftpd-3.0.2-28.el7.x86_64
    [root@salt-client2 ~]# netstat -antpu |grep vsftpd
    
    

    重新在编辑vsftpd.sls文件

    vsftpd_install:
      pkg.installed:
        - name: vsftpd
    
    start_vsftpd:
      service.running:
        - name: vsftpd
        - enable: true
    
    

    解释:

    service.running :启动服务的模块
    name: 指定要启动的服务
    enable: 设置开机启动

    (5)安装、启动多个服务

    [root@salt-master ~]# vim /srv/salt/vsftpd.sls 
    vsftpd_install:
      pkg.installed:
        - names: 
          - vsftpd
          - samba
          - rrdtool
    
    start_vsftpd:
      service.running:
        - names:
          - vsftpd
          - smb
        - enable: true
    
    #-name 变成 -names
    

    3.归类文件

    以上是我们是值写了一个sls文件,如果有多个,全部在/srv/salt下不进行归类,显的很乱。那么我们就需要将相同类型的SLS文件放到一个文件夹下。

    [root@salt-master ~]# mkdir /srv/salt/service/
    [root@salt-master ~]# mv /srv/salt/vsftpd.sls /srv/salt/service/
    

    这样在执行sls文件的时候就需要加上目录名称了。目录还有文件之间的分隔符号需要用. 而不是/
    执行命令如下:

    [root@salt-master ~]# salt 'salt-client2' state.sls service.vsftpd
    

    四、top.sls文件

    以上情况只是写了1个sls文件,如果有多个sls文件,需要根据不同的主机执行不同的sls文件,这样就需要执行不同的命令行salt指令了。这样情况下top.sls文件就发挥了它的作用了。

    top.sls文件就是一个入口文件,规定了在哪些sls文件在哪些主机上执行

    1.目录结构

    在前边说了sls文件的配置路径有默认的3个环境:base(基础环境)、dev(开发环境)、prod(生产环境)
    我们在base环境(srv/salt)下创建一个service目录,在service下创建两个子目录samba_dir、vsftpd_dir.在子目录下在创建samba.sls文件和vsftpd.sls文件

    [root@salt-master ~]# cd /srv/salt/
    [root@salt-master salt]# ls
    service  top.sls
    [root@salt-master salt]# tree
    .
    ├── service
    │   ├── samba_dir
    │   │   └── samba.sls
    │   └── vsftpd_dir
    │       └── vsftpd.sls
    └── top.sls
    
    

    2.创建top.sls文件

    在base环境的根目录下(/srv/salt)创建top.sls,内容如下:

    [root@salt-master ~]# cat /srv/salt/top.sls 
    base:
      'salt-client':
        - service.vsftpd_dir.vsftpd
    
      'salt-client2':
        - service.samba_dir.samba
    
    

    解释:
    base: 指在base环境下,也就是在/srv/salt目录下,寻找sls文件
    'salt-client'、 'salt-client2':指在这些台被管理机上执行sls文件
    service.vsftpd_dir.vsftpd: 执行service/vsftpd_dir目录下的vsftrpd.sls文件

    3.安装服务的sls文件

    [root@salt-master salt]# cat service/vsftpd_dir/vsftpd.sls 
    vsftpd_install:
      pkg.installed:
        - names: 
          - vsftpd
    
    start_vsftpd:
      service.running:
        - names:
          - vsftpd
        - enable: true
    
    [root@salt-master salt]# cat service/samba_dir/samba.sls 
    samba_install:
      pkg.installed:
        - names: 
          - samba
    
    start_samba:
      service.running:
        - names:
          - smb
        - enable: true
    
    

    4.执行top.sls文件

    [root@salt-master ~]# salt '*' state.highstate
    

    在命令行执行次命令 就会自动调用top.sls文件

    五、定义资源的依赖关系

    1.unless判断

    unless是cmd.run的一个参数 ,只有unless后的命令执行失败,name参数对应的命令才执行。其实就是防止shell命令被重复执行

    [root@salt-master salt]# cat /srv/salt/test.sls 
    cmd run test file:
      cmd.run:
        - name: "echo 'test' >  /root/test"
    
    查看客户端
    [root@salt-client ~]# cat /root/test 
    test
    
    

    加上unless判断

    在客户端文件中过滤123 因为没有过滤到 失败了 所以就执行上边的name后边得命令
    [root@salt-master salt]# cat test.sls 
    cmd run test file:
      cmd.run:
        - name: "echo '123' >>  /root/test"
        - unless: grep "123"  /root/test
    
    
    
    查看客户端test文件
    [root@salt-client ~]# cat test 
    test
    123
    

    2.require require_in 定义依赖关系

    require:我依赖于谁
    require_in:我被谁依赖

    语法:
    - require:
      依赖的模块名: 此模块执行的任务名
    
    [root@salt-master salt]# cat test.sls 
    install httpd service:
      pkg.installed:
        - name: httpd
    
    start httpd service:
      service.running:
        - name: httpd
        - enable: True
        - requeire:
          - pkg: install httpd service 
    
  • 相关阅读:
    Mac上Homebrew的安装
    Nodejs全局/缓存路径配置
    Windows 10文件夹Shirt+鼠标右键出现“在此处打开命令窗口”
    CentOS 7上VNCServer的安装使用
    照葫芦画瓢系列之Java --- eclipse下使用maven创建Struts 2项目
    照葫芦画瓢系列之Java --- Maven的集成和使用
    关于集合常见面试问题
    Linux 性能分析大概步骤
    java中的scanner用法
    分享一个内存溢出的问题
  • 原文地址:https://www.cnblogs.com/pangbing/p/14321563.html
Copyright © 2011-2022 走看看