zoukankan      html  css  js  c++  java
  • Saltstack自动化操作记录(2)-配置使用

    Saltstack自动化操作记录(2)-配置使用

    saltstack配置及模块使用:

    为了试验效果,再追加一台被控制端minion机器192.168.1.118
    需要在master控制端机器上做好主机名映射关系

    [root@linux-node1 ~]# cat /etc/hosts
    127.0.0.1   localhost wutao localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.1.101  linux-node1
    192.168.1.102  linux-node2
    192.168.1.118  linux-node3
    

    配置新追加的这台minion机器(配置步骤和之前一样)

    [root@linux-node3 ~]# cat /etc/salt/minion|grep -v "^#"|grep -v "^$"
    master: 192.168.1.101
    id: minion-192-168-1-118
    [root@linux-node3 ~]# /etc/init.d/salt-minion start
    Starting salt-minion daemon: [ OK ]
    

    在master控制端查看:

    [root@linux-node1 ~]# salt-key -L
    Accepted Keys:
    minion-192-168-1-102
    minion-192-168-1-118
    Unaccepted Keys:
    Rejected Keys:
    

    下面针对saltstack在运维中的常规操作做一详细解析:

    1)利用Saltstack远程执行命令
    saltstack的一个比较突出优势就是具备执行远程命令的功能。操作方法与func相似,可以帮助运维人员完成集中化的操作平台。
    命令格式:
    slat '<操作目标>' <方法> [参数]

    如下示例:
    查看被控制机的内存使用情况

    [root@linux-node1 ~]# salt '*' cmd.run 'free -m'
    minion-192-168-1-102:
                     total       used       free     shared    buffers     cached
        Mem:          3832       3639        193          0        223       1552
        -/+ buffers/cache:       1863       1969
        Swap:         1535         13       1522
    minion-192-168-1-118:
                     total       used       free     shared    buffers     cached
        Mem:          3832       3680        152          0        175       1958
        -/+ buffers/cache:       1545       2286
        Swap:         1535         38       1497
    

    其中针对<操作目标>,saltstack提供了多种方法对被控制端(id)进行过滤。下面列举常用的具体参数:
    a)-E:--pcre 通过正则表达式进行匹配。
    示例:查看被控制端minion-192-168-字符开头的主机id名是否连通。

    [root@linux-node1 ~]# salt -E '^minion-192-168*' test.ping
    minion-192-168-1-102:
        True
    minion-192-168-1-118:
        True
    

    b)-L:--list 以主机id名列表的形式进行过滤,格式与Python的列表相似,即不同主机id名称使用逗号分隔。
    示例:获取主机id名为minion-192-168-1-102、minion-192-168-1-118;获取完整操作系统发行版名称。

    [root@linux-node1 ~]# salt -L 'minion-192-168-1-102,minion-192-168-1-118' grains.item osfullname
    minion-192-168-1-102:
        ----------
        osfullname:
            CentOS
    minion-192-168-1-118:
        ----------
        osfullname:
            CentOS
    

    c)-G:--grain 根据被控主机的grains信息(grains是saltstack重要组件之一,重要作用是收集被控主机的基本系统信息)进行匹配过滤,格式为':'。
    比如过滤内核为Linux的主机可以写成'kernel:Linux',如果同时需要正则表达式的支持可以切成--grain-pcre参数来执行。
    示例:获取主机发行版本为6.8的Python版本号

    [root@linux-node1 ~]# salt -G 'osrelease:6.8' cmd.run 'python -V'
    minion-192-168-1-102:
        Python 2.7.8
    minion-192-168-1-118:
        Python 2.7.8
    

    d)-I:--pillar 根据被控主机的pillar(作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用)信息进行过滤匹配,格式为'对象名称:对象值',比如过滤所有具备'apache:httpd' pillar值的主机。
    示例:探测具有"nginx:root:/data"信息的主机连通性

    [root@linux-node1 ~]# salt -I 'nginx:root:/data' test.ping
    minion-192-168-1-102:
        True
    minion-192-168-1-118:
        True
    

    其中pillar属性配置文件如下(后面会讲到)

    nginx:
        root:/data
    

    e)-N:--nodegroup 根据主控端master配置文件中的分组名称进行过滤。
    如下配置的组信息(主机信息支持正则表达式、grain、条件运算符等),通常根据业务类型划分,不同业务具备相同的特点,包括部署环境、应用平台、配置文件等。

    [root@linux-node1 ~]# vim /etc/salt/master
    .......
    nodegroups:
      web1group: 'L@minion-192-168-1-102,minion-192-168-1-118'          //前面空两格,冒号后面空一格
      web2group: 'L@minion-192-168-1-102'
    

    其中:
    L@ 表示后面的主机id格式为列表,即主机id以逗号隔开;
    G@ 表示以grain格式描述;
    S@ 表示以ip子网或地址格式描述
    示例:探测web1group(或web2group)被控主机的连通性

    [root@linux-node1 ~]# salt -N web1group test.ping
    minion-192-168-1-102:
        True
    minion-192-168-1-118:
        True
    [root@linux-node1 ~]# salt -N web2group test.ping
    minion-192-168-1-102:
        True
    

    f)-C:--compound 根据条件运算符not、and、or去匹配不同规则的主机信息。
    示例:探测minion-192开头并且操作系统为Centos的主机连通性。

    [root@linux-node1 ~]# salt -C 'E@^minion-192-168* and G@os:Centos' test.ping
    minion-192-168-1-102:
        True
    minion-192-168-1-118:
        True
    

    其中:
    not语句不能作为第一个条件执行,不过可以通过以下方法来规避:
    示例:探测非192-168-1-102开头的主机连通性

    [root@linux-node1 ~]# salt -C '* and not E@^192-168-1-102*' test.ping
    minion-192-168-1-118:
        True
    minion-192-168-1-102:
        True
    

    g)-S:--ipcidr 根据被控主机的ip地址或ip子网进行匹配。
    示例:

    [root@linux-node1 ~]# salt -S 192.168.0.0/16 test.ping
    minion-192-168-1-102:
        True
    minion-192-168-1-118:
        True
    [root@linux-node1 ~]# salt -S 192.168.1.0/24 test.ping
    minion-192-168-1-102:
        True
    minion-192-168-1-118:
        True
    [root@linux-node1 ~]# salt -S 192.168.1.118 test.ping
    minion-192-168-1-118:
        True
    

    2)Saltstack常用模块及API
    saltstack提供了非常丰富的功能模块,涉及操作系统的基础功能、常用工具支持等,更多模块信息请见:https://docs.saltstack.com/en/latest/ref/modules/all/index.html
    当然,也可以通过sys模块列出当前版本支持的所有模块:

    [root@linux-node1 ~]# salt '*' sys.list_modules
    minion-192-168-1-102:
        - acl
        - aliases
        - alternatives
        - archive
        - blockdev
        - buildout
        - cloud
        - cmd
        - composer
        - config
        - cp
        - cron
        .......
    

    接下来抽取出常见的模块进行介绍,并列举模块API的用法。
    API原理:通过调用master client模块,实例化一个LocalClient对象,再调用cmd()方法来实现的。
    如下是API实现test.ping的示例:

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

    结果以一个标准的python字典形式的字符串返回吗,可以通过eval()函数转换成python的字典类型,方便后续的业务逻辑处理,程序运行结果如下:

    {'minion-192-168-1-102': True, 'minion-192-168-1-118': True}
    

    截图如下:

    image-20210810084248468

    -----------------------------------------------------------------------------------------------------------------
    注意:将字符字典转换成python的字典类型,推荐使用ast模块的literal_eval()方法,
    可以过滤表达式中的恶意函数。
    -----------------------------------------------------------------------------------------------------------------

    a)Archive模块
    功能:实现系统层面的压缩包调用,支持gunzip、gzip、rar、tar、unrar、unzip等。
    示例1:采用gunzip解压被控制机的/tmp/wangshibo.gz包

    [root@linux-node1 ~]# salt '*' archive.gunzip /tmp/wangshibo.gz
    minion-192-168-1-102:
    minion-192-168-1-118:
    

    示例2:采用gzip压缩被控制机的/opt/test.txt文件

    [root@linux-node1 ~]# salt '*' archive.gzip /opt/test.txt
    minion-192-168-1-102:
    minion-192-168-1-118:
    

    到被控制机上查看是否做了压缩:
    192.168.1.102:

    [root@linux-node2 ~]# ll /opt/test.txt.gz
    -rw-r--r--. 1 root root 29 Feb 13 22:09 /opt/test.txt.gz
    

    192.168.1.118:

    [root@linux-node3 ~]# ll /opt/test.txt.gz
    -rw-r--r--. 1 root root 29 Feb 13 22:09 /opt/test.txt.gz
    

    其他示例:

    将被控制机的/mnt/nginx-1.9.7.tar.gz包解压,解压默认放到被控制机的当前用户家目录(即/root)路径下(注意:archive.tar后面的参数前不能加-)
    [root@linux-node1 ~]# salt '*' archive.tar zxf /mnt/nginx-1.9.7.tar.gz
    minion-192-168-1-118:
    minion-192-168-1-102:
     
    到其中一台被控制机上检查:
    [root@linux-node2 ~]# cd /root/
    [root@linux-node2 ~]# ls
    nginx-1.9.7
     
    将被控制机的/mnt/heihei.tar.bz2包解压,解压默认放到被控制机的当前用户家目录(即/root)路径下
    [root@linux-node1 ~]# salt '*' archive.tar jxf /mnt/heihei.tar.bz2
    minion-192-168-1-102:
    minion-192-168-1-118:
     
    ------------------------------------------------------
    将被控制机的/mnt/test打包到/mnt下的test.tar.gz
    [root@linux-node1 ~]# salt '*' archive.tar zcf /mnt/test.tar.gz /mnt/test
    minion-192-168-1-118:
        - tar: Removing leading `/' from member names
    minion-192-168-1-102:
        - tar: Removing leading `/' from member names
     
    将被控制机的/mnt/huihui打包到/opt下的huihui.tar.bz2
    [root@linux-node1 ~]# salt '*' archive.tar jcf /opt/test.huihui.bz2 /mnt/huihui
    minion-192-168-1-102:
        - tar: Removing leading `/' from member names
    minion-192-168-1-118:
        - tar: Removing leading `/' from member names
     
    针对上面通过archive模板压缩后的包再进行解压缩,发现解压缩后的文件路径会带有它原来的上级目录!如下:
    [root@linux-node1 ~]# salt '*' archive.tar zxf /mnt/test.tar.gz
    minion-192-168-1-102:
    minion-192-168-1-118:
    [root@linux-node1 ~]# salt '*' archive.tar jxf /opt/test.huihui.bz2
    minion-192-168-1-102:
    minion-192-168-1-118:
     
    到其中一台被控制机上检查:
    [root@linux-node2 ~]# cd /root/
    [root@linux-node2 ~]# ls
    mnt
    [root@linux-node2 ~]# ls mnt/
    huihui  test
    

    转载至:https://www.cnblogs.com/kevingrace/p/6378118.html

    很高兴各位朋友能欣赏作品,本文版权归作者和博客园共有,欢迎转载,请在文章页面明显位置给出原文出处,否则将追究法律责任。 原文链接: https://www.cnblogs.com/strugger-0316
  • 相关阅读:
    iframe应用 相互之间发送消息 postMessage
    function angular.bootstrap()
    总结
    1-angular.bind
    jQuery treeTable v 1.4.2
    声明了一个模块和一个控制器AngularJS的处理过程
    angularJs $templateCache
    $.fn.zTree 的使用
    Java异常throws与throw的区别
    Pom报错
  • 原文地址:https://www.cnblogs.com/strugger-0316/p/15135718.html
Copyright © 2011-2022 走看看