linux 学习笔记-094-自动化运维-saltstack 远程执行命令,grains 和 pillar,安装配置 httpd,配置管理文件

发布于 2018-05-24  214 次阅读


saltstack 远程执行命令

以下操作均是在 master 端做

[root@am-01:~#] salt '*' test.ping

am-01:

    True

am-02:

    True

#*表示所有已经认证的 minion 端,也可以指定一个

#这个命令是测试 minion 端是否存活,类似于 ping
[root@am-01:~#] salt '*' cmd.run 'hostname'

am-01:

    am-01

am-02:

    am-02

[root@am-01:~#] salt '*' cmd.run 'w'

am-02:

     18:35:50 up 14 days, 0 min,  1 user,  load average: 0.13, 0.08, 0.12

    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

    root     pts/0    172.17.1.1       18:32    3:17   0.10s  0.10s -bash

am-01:

     18:36:19 up 2 days, 17:54,  1 user,  load average: 0.10, 0.05, 0.05

    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

    root     pts/0    172.17.1.1       18:23    3.00s  1.35s  1.19s /usr/bin/python /usr/bin/salt * cmd.run w

#cmd.run 可以远程执行 minion 端的一些命令

这里的*必须是在 master 上已经被接受过认证的客户端,可以通过 salt-key 查到,通常是我们已经设定的 id 值

关于这部分内容,它支持通配、列表以及正则

比如两台客户端 aming-01,aming-02, 那我们可以写成 salt 'aming-*',salt 'aming-0[12]',salt -L 'aming-01,aming-02',salt -E 'aming-(01|02)'等形式,使用列表,即多个机器用逗号分隔,而且需要加-L,使用正则必须要带-E 选项

它还支持 grains,加-G 选项,pillar 加-I 选项

grains

grains 是在 minion 启动时收集到的一些信息,比如操作系统类型、网卡 ip、内核版本、cpu 架构等

grains 的信息并不是动态的,并不会实时变更,它是在 minion 启动时收集到的

我们可以根据 grains 收集到的一些信息,做配置管理工作

同时,grains 支持自定义信息

[root@am-01:~#] salt 'am-02' grains.ls

am-02:

    - SSDs

    - biosreleasedate

………………省略部分输出信息………………

    - zfs_support

    - zmqversion

#列出所有的 grains 项目名字
[root@am-01:~#] salt 'am-02' grains.items

am-02:

    ----------

    SSDs:

    biosreleasedate:

        07/02/2015

………………省略部分输出信息………………

    zfs_support:

        False

    zmqversion:

        4.1.4

#列出所有 grains 项目以及值

自定义 grains

[root@am-02:~#] vim /etc/salt/grains

role: nginx

env: test

[root@am-02:~#] systemctl restart salt-minion.service

#minion 端上做操作

#自定义 grains,自定义了两个,格式是一个 key,一个值

#自定义之后需要重启 minion
[root@am-01:~#] salt '*' grains.item role env

am-02:

    ----------

    env:

        test

    role:

        nginx

am-01:

    ----------

    env:

    role:

#master 端上查询自定义的 grains
[root@am-01:~#] salt -G role:nginx cmd.run 'w'

am-02:

     18:58:36 up 14 days, 22 min,  1 user,  load average: 0.08, 0.10, 0.13

    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

    root     pts/0    172.17.1.1       18:32    7:08   0.29s  0.29s -bash

#针对某个自定义的 grains 来执行对应 minion 端的指定命令

#例如,某几台机器都做了自定义的 grains,假如这个 grains 为 web:mysql,则可以使用-G 来指定这个自定义的 grains 来批量执行指定的命令

pillar

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

[root@am-01:~#] vim /etc/salt/master

pillar_roots:

  base:

    - /srv/pillar

#这里是启用 pillar,注意的是,base 前面两个空格,-号前面四个空格,目录可以自定义

[root@am-01:~#] systemctl restart salt-master.service

[root@am-01:~#] mkdir /srv/pillar

[root@am-01:~#] cd /srv/pillar/

[root@am-01:/srv/pillar#] vim test.sls

conf: /etc/123.conf

#创建 master 配置文件中指定的目录,并创建一个用来测试的配置文件,文件后缀名使用 sls,便于识别

[root@am-01:/srv/pillar#] vim test2.sls

dir: /data/123

[root@am-01:/srv/pillar#] vim top.sls

base:

#表示从这里起,开始运行

  'am-02':

#针对的机器,这里两个空格

    - test

    - test2

#要加载哪一个配置文件,这里四个空格

#创建 top.sls,作为一个入口,用来使 master 能识别 test.sls
[root@am-01:/srv/pillar#] salt '*' saltutil.refresh_pillar

am-01:

    True

am-02:

    True

[root@am-01:/srv/pillar#] salt '*' pillar.item conf dir

am-02:

    ----------

    conf:

        /etc/123.conf

    dir:

        /data/123

am-01:

    ----------

    conf:

    dir:

#先刷新 pillar 配置来获取新的 pillar 状态

#验证 pillar 是否生效
[root@am-01:/srv/pillar#] salt -I 'dir:/data/123' cmd.run 'w'

am-02:

     23:27:24 up 14 days,  4:51,  1 user,  load average: 0.15, 0.09, 0.06

    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

    root     pts/0    172.17.1.1       18:32    4:35m  0.29s  0.29s -bash

#针对某个自定义的 pillar 来执行对应 minion 端的指定命令,原理跟 grains 差不多,不过这里使用的是大写 I 参数

安装配置 httpd

[root@am-01:~#] vim /etc/salt/master

file_roots:

  base:

    - /srv/salt/

[root@am-01:~#] systemctl restart salt-master.service

#定义查询配置文件的入口
[root@am-01:~#] mkdir /srv/salt

[root@am-01:~#] cd /srv/salt/

[root@am-01:/srv/salt#] vim top.sls

base:

  'am-02':

    - httpd

#配置针对 am-02 的入口,配置文件名称为 httpd
[root@am-01:/srv/salt#] vim httpd.sls

httpd-service:

  pkg.installed:

#salt 自带的模块,可以实现安装包的功能

    - names:

      - httpd

      - httpd-devel

#指定需要安装的包的名字

  service.running:

#salt 自带的模块,用来启动指定服务的

    - name: httpd

#指定需要启动的服务(看注(1))

    - enable: True

#true 表示要开机启动,false 表示不开机启动

#配置安装 httpd 的操作,注意空格问题

#httpd-service 是 id 的名字,自定义的;pkg.installed 为包安装函数,下面是要安装的包的名字;service.running 也是一个函数,来保证指定的服务启动;enable 表示开机启动。
[root@am-01:/srv/salt#] salt 'am-02' state.highstate

am-02:

----------

          ID: httpd-service

    Function: pkg.installed

        Name: httpd

      Result: True

     Comment: All specified packages are already installed

     Started: 00:06:37.101010

    Duration: 2483.415 ms

     Changes:  

----------

          ID: httpd-service

    Function: pkg.installed

        Name: httpd-devel

      Result: True

     Comment: The following packages were installed/updated: httpd-devel

     Started: 00:06:39.584716

    Duration: 84206.74 ms

     Changes:  

              ----------

              apr-devel:

                  ----------

                  new:

                      1.4.8-3.el7_4.1

                  old:

              apr-util-devel:

                  ----------

                  new:

                      1.5.2-6.el7

                  old:

              cyrus-sasl:

                  ----------

                  new:

                      2.1.26-23.el7

                  old:

              cyrus-sasl-devel:

                  ----------

                  new:

                      2.1.26-23.el7

                  old:

              cyrus-sasl-lib:

                  ----------

                  new:

                      2.1.26-23.el7

                  old:

                      2.1.26-17.el7

              expat:

                  ----------

                  new:

                      2.1.0-10.el7_3

                  old:

                      2.1.0-8.el7

              expat-devel:

                  ----------

                  new:

                      2.1.0-10.el7_3

                  old:

              httpd:

                  ----------

                  new:

                      2.4.6-80.el7.centos

                  old:

                      2.4.6-67.el7.centos.6

              httpd-devel:

                  ----------

                  new:

                      2.4.6-80.el7.centos

                  old:

              httpd-tools:

                  ----------

                  new:

                      2.4.6-80.el7.centos

                  old:

                      2.4.6-67.el7.centos.6

              libdb:

                  ----------

                  new:

                      5.3.21-24.el7

                  old:

                      5.3.21-17.el7_0.1

              libdb-devel:

                  ----------

                  new:

                      5.3.21-24.el7

                  old:

              libdb-utils:

                  ----------

                  new:

                      5.3.21-24.el7

                  old:

                      5.3.21-17.el7_0.1

              openldap:

                  ----------

                  new:

                      2.4.44-15.el7_5

                  old:

                      2.4.39-6.el7

              openldap-devel:

                  ----------

                  new:

                      2.4.44-15.el7_5

                  old:

----------

          ID: httpd-service

    Function: service.running

        Name: httpd

      Result: True

     Comment: Service httpd has been enabled, and is running

     Started: 00:08:07.912841

    Duration: 1642.557 ms

     Changes:  

              ----------

              httpd:

                  True



Summary for am-02

------------

Succeeded: 3 (changed=2)

Failed:    0

------------

Total states run:     3

Total run time:  88.333 s

#针对 am-02 执行安装 httpd,这也可以实现多台机器批量一起安装指定的包
[root@am-02:~#] ps -aux | grep httpd

root      62372  0.3  1.5 459712 15296 ?        Ss   00:08   0:00 /usr/sbin/httpd -DFOREGROUND

apache    62374  0.0  0.7 459712  7612 ?        S    00:08   0:00 /usr/sbin/httpd -DFOREGROUND

apache    62375  0.0  0.7 459712  7612 ?        S    00:08   0:00 /usr/sbin/httpd -DFOREGROUND

apache    62376  0.0  0.7 459712  7612 ?        S    00:08   0:00 /usr/sbin/httpd -DFOREGROUND

apache    62377  0.0  0.7 459712  7612 ?        S    00:08   0:00 /usr/sbin/httpd -DFOREGROUND

apache    62378  0.0  0.7 459712  7612 ?        S    00:08   0:00 /usr/sbin/httpd -DFOREGROUND

#在 minion 端检查可以见到,httpd 已经在运行了

注(1)

服务的名字可以在/lib/systemd/system 查询到,以上操作在 Centos 中是使用 yum 安装的包的,所以会自动把服务添加到系统中,如果不知道服务的名称是什么,可以在网上查询

配置管理文件

这个功能可以做到批量分发配置文件,例如 A 和 B 机器需要修改某个配置文件,这时就可以在 master 上先把这个配置文件配置好,再做分发工作,推送到 A 和 B 的指定目录下覆盖对应配置文件,同时为了让这个配置文件生效,做重启指定服务、修改权限等操作

[root@am-01:/srv/salt#] vim test.sls

file_test:

#定义这个任务的名字

  file.managed:

#使用 file.managed 模块

    - name: /tmp/am.com

#指定 minion 端的文件

    - source: salt://test/123/1.txt

#指定 master 端的模版文件,简单来讲,"salt:// == /srv/salt/",而"/srv/salt/"是在/etc/salt/master 文件的"file_roots"下定义的,这个目录可自定义

#这里的"salt://test/123/1.txt == /srv/salt/test/123/1.txt"

    - user: root

    - group: root

    - mode: 600

#设置文件的所有者,所属组和权限
[root@am-01:/srv/salt#] mkdir test

[root@am-01:/srv/salt#] mkdir test/123

[root@am-01:/srv/salt#] cp /etc/passwd test/123/1.txt

#创建指定的目录、文件
[root@am-01:/srv/salt#] vim top.sls

base:

  'am-02':

    - test

#因为 salt 默认会从 top.lsl 中查询配置文件,所以这里得修改下
[root@am-01:/srv/salt#] salt 'am-02' state.highstate

am-02:

----------

          ID: file_test

    Function: file.managed

        Name: /tmp/am.com

      Result: True

     Comment: File /tmp/am.com updated

     Started: 00:28:00.866894

    Duration: 229.273 ms

     Changes:  

              ----------

              diff:

                  New file



Summary for am-02

------------

Succeeded: 1 (changed=1)

Failed:    0

------------

Total states run:     1

Total run time: 229.273 ms

#针对 am-02 运行一下这个配置

检验一下

[root@am-02:~#] ls -lt /tmp/am.com

-rw------- 1 root root 2673 5 月  25 00:28 /tmp/am.com

[root@am-02:~#] cat /tmp/am.com

#可以见到,所有者、所属组、权限、内容都是你所想要的