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
  • 相关阅读:
    leetcode Super Ugly Number
    leetcode Find Median from Data Stream
    leetcode Remove Invalid Parentheses
    leetcode Range Sum Query
    leetcode Range Sum Query
    leetcode Minimum Height Trees
    hdu 3836 Equivalent Sets
    hdu 1269 迷宫城堡
    hud 2586 How far away ?
    poj 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/strugger-0316/p/15135718.html
Copyright © 2011-2022 走看看