Saltstack知多少

Saltstack是一种全新的基础设施管理方式,是一个服务器基础架构集中化管理平台,几分钟内便可运行起来,速度够快,服务器之间秒级通讯,扩展性好,很容易批量管理上万台服务器,显著降低人力与运维成本;它具备配置管理、远程执行、监控等功能,一般可以理解为简化版的puppet和加强版的func;通过部署SaltStack环境,可以在成千上万台服务器上做到批量执行命令,根据不同业务特性进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。

SaltStack基于Python语言实现,结合轻量级消息队列(ZeroMQ)(SaltStack的通信模式总共分为2种模式:ZeroMQ、REAT,鉴于REAT目前还不是太稳定,通常会选择ZeroMQ模式)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。

Saltstack运行模式

Local:本地,一台机器玩,不建议

Master/Minion:通过server/agent的方式进行管理,效率很高(批量管理1000台机器,25秒搞定)

Salt SSH:通过SSH方式进行管理,效率相对来说比较低(批量管理1000台机器,83秒搞定)

Saltstack三大功能

远程执行(执行远程命令)

配置管理(状态管理)

云管理

Saltstack特征

1)部署简单、方便;

2)支持大部分UNIX/Linux及Windows环境;

3)主从集中化管理;

4)配置简单、功能强大、扩展性强;

5)主控端(master)和被控端(minion)基于证书认证,安全可靠;

6)支持API及自定义模块,可通过Python轻松扩展。

Master与Minion认证

1)minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master。

2)master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key,然后master就能对minion发送指令了。

Master与Minion的连接

1)SaltStack master启动后默认监听4505和4506两个端口。4505(publish_port)为saltstack的消息发布系统,4506(ret_port)为saltstack客户端与服务端通信的端口。如果使用lsof 查看4505端口,会发现所有的minion在4505端口持续保持在ESTABLISHED状态。

2)minion与master之间的通信模式如下

SaltStack基础环境安装与配置记录

英文文档参考:https://docs.saltstack.com/en/latest/

两台centos6.8系统的机器,其中:

192.168.1.101  linux-node1  做主控端 master

192.168.1.102  linux-node2  做被控端 minion

1)两台机器的主机名要固定统一,要能相互ping通

固定好master和minion机器名,然后在master机器上做hosts绑定:

[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

2)下面采用源码安装的方式

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

centos6下yum安装:

安装epel源

# wget http://ftp.linux.ncsu.edu/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

# rpm -ivh epel-release-6-8.noarch.rpm

服务端安装master

yum -y install salt-master

为了做实验,在服务端也安装下客户端

# yum -y install salt-minion

客户端安装minion

yum -y install salt-minion

设置开机启动

# chkconfig salt-master on

# chkconfig salt-minion on

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

下面的安装过程在master和minion两台机器上都要操作:

a)将Python升级到python 2.7

[root@linux-node1 ~]# python -V

Python 2.6.6

[root@linux-node1 ~]# wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz

[root@linux-node1 ~]# tar -zvxf Python-2.7.8.tgz

[root@linux-node1 ~]# cd Python-2.7.8

[root@linux-node1 Python-2.7.8]# ./configure --prefix=/usr/local

[root@linux-node1 Python-2.7.8]# make --jobs=`grep processor /proc/cpuinfo | wc -l`

[root@linux-node1 Python-2.7.8]# make install

接着将python头文件拷贝到标准目录,以避免编译saltstack时,找不到所需的头文件

[root@linux-node1 Python-2.7.8]# cd /usr/local/include/python2.7

[root@linux-node1 python2.7]# cp -a ./* /usr/local/include/

备份旧版本的python,并符号链接新版本的python

[root@linux-node1 python2.7]# cd /usr/bin

[root@linux-node1 bin]# mv python python2.6

[root@linux-node1 bin]# ln -s /usr/local/bin/python python

[root@linux-node1 bin]# ll python

lrwxrwxrwx. 1 root root 21 Feb 6 17:19 python -> /usr/local/bin/python

修改yum脚本,使其指向旧版本的python2.6,已避免其无法运行

[root@linux-node1 bin]# vim /usr/bin/yum

#!/usr/bin/python2.6

........

最后,检查下python版本,发现已升级了

[root@linux-node1 bin]# python -V

Python 2.7.8

b)PyYAML模块安装

[root@linux-node1 ~]# wget http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz

[root@linux-node1 ~]# wget https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz

[root@linux-node1 ~]# tar -zvxf yaml-0.1.5.tar.gz

[root@linux-node1 ~]# cd yaml-0.1.5

[root@linux-node1 yaml-0.1.5]# ./configure --prefix=/usr/local

[root@linux-node1 yaml-0.1.5]# make --jobs=`grep processor /proc/cpuinfo | wc -l`

[root@linux-node1 yaml-0.1.5]# make install

[root@linux-node1 ~]# tar xvzf PyYAML-3.11.tar.gz

[root@linux-node1 ~]# cd PyYAML-3.11

[root@linux-node1 PyYAML-3.11]# python setup.py install

c)setuptools模块安装

[root@linux-node1 ~]# wget https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz

[root@linux-node1 ~]# tar -zvxf setuptools-7.0.tar.gz

[root@linux-node1 ~]# cd setuptools-7.0

[root@linux-node1 setuptools-7.0]# python setup.py install

d)markupsafe模块安装

[root@linux-node1 ~]# wget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz

[root@linux-node1 ~]# tar -zvxf MarkupSafe-0.9.3.tar.gz

[root@linux-node1 ~]# cd MarkupSafe-0.9.3

[root@linux-node1 MarkupSafe-0.9.3]# python setup.py install

e)jinja2模块安装

[root@linux-node1 ~]# wget https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz

[root@linux-node1 ~]# tar -zvxf Jinja2-2.7.3.tar.gz

[root@linux-node1 ~]# cd Jinja2-2.7.3

[root@linux-node1 Jinja2-2.7.3]# python setup.py install

f)pyzmq模块安装

注意:系统自带的autoconf版本为2.63,在编译ZeroMQ时,由于版本较低,会报错不通过,故需安装大于2.63的版本。

[root@linux-node1 ~]# autoconf -V

autoconf (GNU Autoconf) 2.63

......

[root@linux-node1 ~]# wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz

[root@linux-node1 ~]# tar -zvxf autoconf-2.69.tar.gz  && cd autoconf-2.69

[root@linux-node1 autoconf-2.69]# ./configure --prefix=/usr

[root@linux-node1 autoconf-2.69]# make && make install

[root@linux-node1 ~]# autoconf -V

autoconf (GNU Autoconf) 2.69

......

g)其他依赖库安装

[root@linux-node1 ~]# yum -y install libuuid.x86_64 libuuid-devel.x86_64

[root@linux-node1 ~]# yum -y install uuid.x86_64 uuid-devel.x86_64

[root@linux-node1 ~]# yum -y install uuid-c++.x86_64 uuid-c++-devel.x86_64

[root@linux-node1 ~]# wget https://github.com/jedisct1/libsodium/archive/1.0.1.tar.gz

[root@linux-node1 ~]# tar -zvxf 1.0.1.tar.gz

[root@linux-node1 ~]# cd libsodium-1.0.1

[root@linux-node1 libsodium-1.0.1]# ./autogen.sh

[root@linux-node1 libsodium-1.0.1]# ./configure CC="gcc -m64" --prefix=/usr/local --libdir=/usr/lib64

[root@linux-node1 libsodium-1.0.1]# make --jobs=`grep processor /proc/cpuinfo | wc -l`

[root@linux-node1 libsodium-1.0.1]# make install

[root@linux-node1 ~]# wget http://download.zeromq.org/zeromq-4.1.2.tar.gz

[root@linux-node1 ~]# wget https://pypi.python.org/packages/source/p/pyzmq/pyzmq-14.4.1.tar.gz

[root@linux-node1 ~]# tar -zvxf zeromq-4.1.2.tar.gz

[root@linux-node1 ~]# cd zeromq-4.1.2

[root@linux-node1 zeromq-4.1.2]# ./autogen.sh

[root@linux-node1 zeromq-4.1.2]# ./configure --prefix=/usr CC="gcc -m64" PKG_CONFIG_PATH="/usr/lib64/pkgconfig" --libdir=/usr/lib64

[root@linux-node1 zeromq-4.1.2]# make --jobs=`grep processor /proc/cpuinfo | wc -l`

[root@linux-node1 zeromq-4.1.2]# make install

[root@linux-node1 ~]# tar -zvxf pyzmq-14.4.1.tar.gz

[root@linux-node1 ~]# cd pyzmq-14.4.1

[root@linux-node1 pyzmq-14.4.1]# python setup.py configure --zmq=/usr/local

[root@linux-node1 pyzmq-14.4.1]# python setup.py install

h)M2Crypto模块安装

[root@linux-node1 ~]# yum -y install swig.x86_64

[root@linux-node1 ~]# wget http://www.openssl.org/source/openssl-1.0.1g.tar.gz

[root@linux-node1 ~]# tar -zvxf openssl-1.0.1g.tar.gz

[root@linux-node1 ~]# cd openssl-1.0.1g

[root@linux-node1 openssl-1.0.1g]# ./config shared --prefix=/usr/local

[root@linux-node1 openssl-1.0.1g]# make && make install

[root@linux-node1 ~]# wget https://pypi.python.org/packages/source/M/M2Crypto/M2Crypto-0.22.3.tar.gz

[root@linux-node1 ~]# tar -zvxf M2Crypto-0.22.3.tar.gz

[root@linux-node1 ~]# cd M2Crypto-0.22.3

[root@linux-node1 M2Crypto-0.22.3]# python setup.py install

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

若出现下面错误:

解决办法:执行以下命令

[root@linux-node1 M2Crypto-0.22.3]# cp -a /usr/local/include/openssl /usr/include/

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

i)msgpack模块安装

[root@linux-node1 ~]# wget https://pypi.python.org/packages/source/m/msgpack-python/msgpack-python-0.4.2.tar.gz

[root@linux-node1 ~]# tar -zvxf msgpack-python-0.4.2.tar.gz

[root@linux-node1 ~]# cd msgpack-python-0.4.2

[root@linux-node1 msgpack-python-0.4.2]# python setup.py install

j)msgpack-pure模块安装

[root@linux-node1 ~]# wget https://pypi.python.org/packages/source/m/msgpack-pure/msgpack-pure-0.1.3.tar.gz

[root@linux-node1 ~]# tar -zvxf msgpack-pure-0.1.3.tar.gz

[root@linux-node1 ~]# cd msgpack-pure-0.1.3

[root@linux-node1 msgpack-pure-0.1.3]# python setup.py install

k)pycrypto模块安装

[root@linux-node1 ~]# wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz

[root@linux-node1 ~]# tar -zvxf pycrypto-2.6.1.tar.gz

[root@linux-node1 ~]# cd pycrypto-2.6.1

[root@linux-node1 pycrypto-2.6.1]# python setup.py install

l)requests模块安装

[root@linux-node1 ~]# wget https://pypi.python.org/packages/source/r/requests/requests-2.5.0.tar.gz

[root@linux-node1 ~]# tar -zvxf requests-2.5.0.tar.gz

[root@linux-node1 ~]# cd requests-2.5.0

[root@linux-node1 requests-2.5.0]# python setup.py install

m)其他模块安装

注意:以下模块为REAT通信模式所依赖的模块,作为可选项,非必要。

https://pypi.python.org/packages/source/l/libnacl/libnacl-1.3.5.tar.gz

https://pypi.python.org/packages/source/i/ioflo/ioflo-1.0.2.tar.gz

https://pypi.python.org/packages/source/s/six/six-1.8.0.tar.gz

https://pypi.python.org/packages/source/r/raet/raet-0.4.2.tar.gz

https://pypi.python.org/packages/source/M/Mako/Mako-1.0.0.tar.gz

n)saltstack安装

[root@linux-node1 ~]# wget https://github.com/saltstack/salt/releases/download/v2014.7.0/salt-2014.7.0.tar.gz

[root@linux-node1 ~]# tar -zvxf salt-2014.7.0.tar.gz

[root@linux-node1 ~]# cd salt-2014.7.0

[root@linux-node1 salt-2014.7.0]# python setup.py install

[root@linux-node1 salt-2014.7.0]# salt --versions-report

Salt: 2014.7.0

Python: 2.7.8 (default, Feb 6 2017, 17:14:15)

Jinja2: 2.7.3

M2Crypto: 0.22

msgpack-python: 0.4.2

msgpack-pure: 0.1.3

pycrypto: 2.6.1

libnacl: Not Installed

PyYAML: 3.11

ioflo: Not Installed

PyZMQ: 14.4.1

RAET: Not Installed

ZMQ: 4.1.2

Mako: Not Installed

-----------------------------------------------------这里多说一下--------------------------------------------------------

以上源码安装过程可以放在脚本里一键执行

提前将源码包下载下来,放到/root/software目录下

脚本salt.sh内容如下:

#!/bin/bash

#升级Python到python 2.7

cd /root/software/

/bin/tar -zvxf Python-2.7.8.tgz

cd Python-2.7.8

./configure --prefix=/usr/local

make --jobs=`grep processor /proc/cpuinfo | wc -l`

make install

cd /usr/local/include/python2.7

cp -a ./* /usr/local/include/

cd /usr/bin

mv python python2.6

ln -s /usr/local/bin/python python

sed -i 's#/usr/bin/python#/usr/bin/python2.6#g' /usr/bin/yum

#PyYAML模块安装

cd /root/software/

/bin/tar -zvxf yaml-0.1.5.tar.gz

cd yaml-0.1.5

./configure --prefix=/usr/local

make --jobs=`grep processor /proc/cpuinfo | wc -l`

make install

cd /root/software/

/bin/tar xvzf PyYAML-3.11.tar.gz

cd PyYAML-3.11

/usr/bin/python setup.py install

#setuptools模块安装

cd /root/software/

/bin/tar -zvxf setuptools-7.0.tar.gz

cd setuptools-7.0

/usr/bin/python setup.py install

#markupsafe模块安装

cd /root/software/

/bin/tar -zvxf MarkupSafe-0.9.3.tar.gz

cd MarkupSafe-0.9.3

/usr/bin/python setup.py install

#jinja2模块安装

cd /root/software/

/bin/tar -zvxf Jinja2-2.7.3.tar.gz

cd Jinja2-2.7.3

/usr/bin/python setup.py install

#pyzmq模块安装

cd /root/software/

/bin/tar -zvxf autoconf-2.69.tar.gz && cd autoconf-2.69

./configure --prefix=/usr

make && make install

#其他依赖库安装

/usr/bin/yum -y install libuuid.x86_64 libuuid-devel.x86_64

/usr/bin/yum -y install uuid.x86_64 uuid-devel.x86_64

/usr/bin/yum -y install uuid-c++.x86_64 uuid-c++-devel.x86_64

cd /root/software/

/bin/tar -zvxf 1.0.1.tar.gz

cd libsodium-1.0.1

./autogen.sh

./configure CC="gcc -m64" --prefix=/usr/local --libdir=/usr/lib64

make --jobs=`grep processor /proc/cpuinfo | wc -l`

make install

cd /root/software/

/bin/tar -zvxf zeromq-4.1.2.tar.gz

cd zeromq-4.1.2

./autogen.sh

./configure --prefix=/usr CC="gcc -m64" PKG_CONFIG_PATH="/usr/lib64/pkgconfig" --libdir=/usr/lib64

make --jobs=`grep processor /proc/cpuinfo | wc -l`

make install

cd /root/software/

/bin/tar -zvxf pyzmq-14.4.1.tar.gz

cd pyzmq-14.4.1

/usr/bin/python setup.py configure --zmq=/usr/local

/usr/bin/python setup.py install

#M2Crypto模块安装

/usr/bin/yum -y install swig.x86_64

cd /root/software/

/bin/tar -zvxf openssl-1.0.1g.tar.gz

cd openssl-1.0.1g

./config shared --prefix=/usr/local

make && make install

cd /root/software/

/bin/tar -zvxf M2Crypto-0.22.3.tar.gz

cd M2Crypto-0.22.3

/usr/bin/python setup.py install

#msgpack模块安装

cd /root/software/

/bin/tar -zvxf msgpack-python-0.4.2.tar.gz

cd msgpack-python-0.4.2

/usr/bin/python setup.py install

#msgpack-pure模块安装

cd /root/software/

/bin/tar -zvxf msgpack-pure-0.1.3.tar.gz

cd msgpack-pure-0.1.3

/usr/bin/python setup.py install

#pycrypto模块安装

cd /root/software/

/bin/tar -zvxf pycrypto-2.6.1.tar.gz

cd pycrypto-2.6.1

/usr/bin/python setup.py install

#requests模块安装

cd /root/software/

/bin/tar -zvxf requests-2.5.0.tar.gz

cd requests-2.5.0

/usr/bin/python setup.py install

#saltstack安装

cd /root/software/

/bin/tar -zvxf salt-2014.7.0.tar.gz

cd salt-2014.7.0

/usr/bin/python setup.py install

/usr/local/bin/salt --versions-report

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

3)SaltStack配置

a)master端的配置

[root@linux-node1 ~]# cd salt-2014.7.0/

[root@linux-node1 salt-2014.7.0]# mkdir /etc/salt

[root@linux-node1 salt-2014.7.0]# cp -a conf/master /etc/salt/

[root@linux-node1 salt-2014.7.0]# cp -a pkg/suse/salt-master /etc/init.d/

[root@linux-node1 salt-2014.7.0]# chmod +x /etc/init.d/salt-master

[root@linux-node1 salt-2014.7.0]# chkconfig --level 235 salt-master on

[root@linux-node1 salt-2014.7.0]# mkdir -p /var/log/salt /srv/salt

[root@linux-node1 salt-2014.7.0]# vim /etc/salt/master        //修改下面几行

interface: 192.168.1.101    //绑定主控端master的ip,冒号后必须空一格

auto_accept: True         //当该项配置成True时表示自动认证,就不需要手动运行salt-key命令进行证书信任

file_roots:             //指定saltstack文件根目录位置

base:                //前面必须留两个空格

- /srv/salt      //前面必须留四个空格

[root@linux-node1 salt-2014.7.0]# ln -s /usr/local/bin/salt-master /usr/bin/

[root@linux-node1 salt-2014.7.0]# service salt-master start

Starting salt-master daemon: [ OK ]

[root@linux-node1 salt-2014.7.0]# netstat -ntlp

.......

tcp 0 0 192.168.1.101:4505 0.0.0.0:* LISTEN 12715/python

tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1356/master

tcp 0 0 192.168.1.101:4506 0.0.0.0:* LISTEN 12727/python

......

[root@linux-node1 salt-2014.7.0]# ps aux | grep python

root 8428 0.0 0.2 111704 8956 ? Ss Jan05 26:14 /data/paas/env/bin/python /data/paas/env/bin/supervisord -c /data/paas/open_paas/bin/supervisord.conf

root 12713 0.0 0.5 281772 22060 ? S 17:39 0:00 /usr/local/bin/python /usr/bin/salt-master -d

root 12714 0.7 0.9 319760 35700 ? S 17:39 0:00 /usr/local/bin/python /usr/bin/salt-master -d

root 12715 0.0 0.5 367796 22136 ? Sl 17:39 0:00 /usr/local/bin/python /usr/bin/salt-master -d

root 12716 0.0 0.5 367796 21912 ? Sl 17:39 0:00 /usr/local/bin/python /usr/bin/salt-master -d

root 12717 0.0 0.5 281772 21728 ? S 17:39 0:00 /usr/local/bin/python /usr/bin/salt-master -d

root 12722 2.4 1.0 413304 40952 ? Sl 17:39 0:01 /usr/local/bin/python /usr/bin/salt-master -d

root 12723 2.4 1.0 413308 40956 ? Sl 17:39 0:01 /usr/local/bin/python /usr/bin/salt-master -d

root 12724 2.4 1.0 413300 40968 ? Sl 17:39 0:01 /usr/local/bin/python /usr/bin/salt-master -d

root 12725 2.4 1.0 413324 40972 ? Sl 17:39 0:01 /usr/local/bin/python /usr/bin/salt-master -d

root 12726 2.3 1.0 413304 40972 ? Sl 17:39 0:01 /usr/local/bin/python /usr/bin/salt-master -d

root 12727 0.0 0.5 670916 22380 ? Sl 17:39 0:00 /usr/local/bin/python /usr/bin/salt-master -d

root 13124 0.0 0.0 103312 880 pts/3 R+ 17:40 0:00 grep python

在主控端master上添加TCP 4505、TCP 4506的规则,而在被控端monion上就无需配置防火墙

原因是被控端直接与主控端的zeromq建立长连接,接收广播到的任务信息并执行。

即master端的iptables里添加下面两台规则:

[root@linux-node1 salt-2014.7.0]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 4505 -j ACCEPT

[root@linux-node1 salt-2014.7.0]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 4506 -j ACCEPT

[root@linux-node1 salt-2014.7.0]# iptables save

[root@linux-node1 salt-2014.7.0]# /etc/init.d/iptables save

[root@linux-node1 salt-2014.7.0]# /etc/init.d/iptables restart

b)minion端的配置(如果master端也想管控自己,可以配置自己的monion)

[root@linux-node2 software]# cd salt-2014.7.0

[root@linux-node2 salt-2014.7.0]# mkdir /etc/salt

[root@linux-node2 salt-2014.7.0]# cp -a conf/minion /etc/salt/

[root@linux-node2 salt-2014.7.0]# cp -a pkg/suse/salt-minion /etc/init.d/

[root@linux-node2 salt-2014.7.0]# chmod +x /etc/init.d/salt-minion

[root@linux-node2 salt-2014.7.0]# chkconfig --level 235 salt-minion on

[root@linux-node2 salt-2014.7.0]# mkdir -p /var/log/salt

[root@linux-node2 salt-2014.7.0]# vim /etc/salt/minion         //修改下面几行

master: 192.168.1.101       //指定主控端master的ip地址,冒号后必须空一格

id: minion-192-168-1-102     //修改被控端monion主机识别id,建议使用主机名或ip来设置,冒号后必须空一格

[root@linux-node2 salt-2014.7.0]# ln -s /usr/local/bin/salt-minion /usr/bin/

[root@linux-node2 salt-2014.7.0]# service salt-minion start

Starting salt-minion daemon: [ OK ]

[root@linux-node2 salt-2014.7.0]# ps aux | grep python

root 16610 13.0 0.5 431116 23432 ? Sl 05:15 0:01 /usr/local/bin/python /usr/bin/salt-minion -d

root 16633 0.0 0.0 103312 884 pts/0 S+ 05:16 0:00 grep python

4)SaltStack使用说明(在master机器上操作)

sat-key命令说明:

salt --versions-report

[root@localhost ~]# salt-key --help

--version            显示版本号后退出

--versions-report    显示程序的所有依赖包版本号,并退出

-h, --help           帮助信息

-c CONFIG_DIR, --config-dir=CONFIG_DIR    指定配置目录,默认 :/etc/salt/

-q, --quiet          安静模式,不输出信息到控制台

-y, --yes            对所有询问是否继续,回答yes,默认:false

Logging Options:     设置loggin选项会覆盖掉配置文件中对日志的配置.

--log-file=LOG_FILE      指定日志文件路径,默认: /var/log/salt/key.

--log-file-level=LOG_LEVEL_LOGFILE   日志文件等级,可设置下面中的一个值 'all', 'garbage','trace', 'debug', 'info', 'warning', 'error', 'quiet'.默认: 'warning'.

--key-logfile=KEY_LOGFILE    将所有的输出发送到指定的文件,默认: '/var/log/salt/key'

--out=OUTPUT, --output=OUTPUT    把salt-key命令的输出信息发送给指定的outputer. 可设置为下面参数值 'no_return', 'virt_query'.'grains', 'yaml', 'overstatestage', 'json', 'pprint','nested', 'raw', 'highstate', 'quiet', 'key', 'txt',

--out-indent=OUTPUT_INDENT, --output-indent=OUTPUT_INDENT      设置输出行缩进的空格数. 负数取消输出缩进编排.仅对使用的outputer有效.

--out-file=OUTPUT_FILE, --output-file=OUTPUT_FILE       把显示输出到指定的文件

--no-color, --no-colour      关闭字体颜色

--force-color, --force-colour    强制开启输出颜色渲染

-l ARG, --list=ARG     打印公钥key. 可设置下面三个值"pre", "un", and "unaccepted" 会显示 不许可/未签名 keys. "acc" or "accepted"会显示 许可/已签名 keys. "rej" or "rejected"会显示拒绝的 keys.  "all" 会显示所有 keys.

-L, --list-all         会显示所有公钥,相当月: "--list all"

-a ACCEPT, --accept=ACCEPT   许可指定的公钥(使用--include-all选项,可以指定除了挂起的key外的所有reject状态的公钥)

-A, --accept-all    许可所有pending的公钥

-r REJECT, --reject=REJECT    拒绝指定的公钥 (使用--include-all选项可以指定除了挂起的key外的所有accept状态的公钥)

-R, --reject-all    拒接所有pending的公钥

--include-all       配合 accepting/rejecting 选项使用,指定所有非pending状态的公钥

-p PRINT, --print=PRINT    打印指定的公钥

-P, --print-all      Print all public keys

-d DELETE, --delete=DELETE    根据公钥的名称删除公钥

-D, --delete-all    删除所有 keys

-f FINGER, --finger=FINGER      打印指定key的指纹信息

-F, --finger-all    打印所有key的指纹信息

Key 常用选项:

--gen-keys=GEN_KEYS       对生成的key配置设置一个salt使用的名称。

--gen-keys-dir=GEN_KEYS_DIR     设置生成key对的放置目录,默认当前目录。default=.

--keysize=KEYSIZE        为生成key设置位数, 仅跟--gen-keys选项配合时有效,数值大小必须大于2048,否则会被提升至2048位,默认2048default=2048

a)查看当前的salt key信息

[root@linux-node1 ~]# salt-key -L      //或者直接salt-key

Accepted Keys:

minion-192-168-1-102

Unaccepted Keys:

Rejected Keys:

b)测试被控主机的连通性

[root@linux-node1 ~]# salt '*' test.ping

minion-192-168-1-102:

True

c)远程命令执行(cmd模块),格式:salt  'client配置的id' 模块.方法  '命令参数'

(其中'*'表示所有的client)

[root@linux-node1 ~]# salt '*' cmd.run 'uptime'

minion-192-168-1-102:

21:51:44 up 61 days, 16:44, 2 users, load average: 0.79, 0.55, 0.47

[root@linux-node1 ~]# salt 'minion-192-168-1-102' cmd.run 'uptime'

minion-192-168-1-102:

22:11:50 up 61 days, 17:05, 2 users, load average: 0.44, 0.59, 0.63

[root@linux-node1 ~]# salt 'minion-192-168-1-102' cmd.run 'w'

minion-192-168-1-102:

22:14:20 up 61 days, 17:07, 2 users, load average: 0.46, 0.52, 0.59

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

root pts/0 124.165.97.64 04:50 57:20 0.32s 0.32s -bash

root pts/3 124.165.97.64 Mon20 8:46 0.20s 0.20s -bash

[root@linux-node1 ~]# salt 'minion-192-168-1-102' cmd.run 'who'

minion-192-168-1-102:

root pts/0 Feb 7 04:50 (124.165.97.64 )

root pts/3 Feb 6 20:41 (124.165.97.64 )

[root@linux-node1 ~]# salt '*' cmd.run 'df -h'

minion-192-168-1-102:

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/VolGroup00-LogVol00

8.1G 6.8G 901M 89% /

tmpfs 1.9G 0 1.9G 0% /dev/shm

/dev/vda1 190M 67M 113M 38% /boot

[root@linux-node1 ~]# salt '*' cmd.run 'touch /root/test'

minion-192-168-1-102:

[root@linux-node1 ~]# salt '*' cmd.run 'echo "monion-server" >> /root/test'

minion-192-168-1-102:

到monion机器上查看是否有/root/test文件创建及其内容

[root@linux-node2 ~]# ll /root/test

-rw-r--r--. 1 root root 0 Feb 7 21:51 /root/test

[root@linux-node2 ~]# cat /root/test

monion-server

远程批量传输文件(salt-cp命令)

下面表示将master主控端的/mnt/aa文件传输到所有minion被控端的/opt下

[root@linux-node1 ~]# salt-cp '*' /mnt/aa  /opt/

{'minion-192-168-1-102': {'/opt/aa': True}}

注意上面命令只用于文件的传输,目录的传输需要用到cp模块,模块用法详见Saltstack自动化操作记录

(2)-模块使用

---------------------------------------------------------顺便说一下-------------------------------------------------------

minion端的认证

当/etc/salt/master文件里没有配置auto_accept:True时,需要通过salt-key命令来进行证书认证操

作,其中:

salt-key -L:显示已经或未认证的被控端id,Acceptd Keys为已认证清单,Unaccepted Keys为未认证清单

salt-key -D:删除所有认证主机id证书

salt-key -d id:删除单个id证书

salt-key -A:接受所有id证书请求

salt-key -a id:接受单个id证书请求

minion启动的时候会创建KEY

[root@linux-node2 ~]# ll /etc/salt/pki/minion/

total 12

-rw-r--r--. 1 root root 800 Feb 7 05:16 minion_master.pub

-r--------. 1 root root 3247 Feb 7 05:16 minion.pem

-rw-r--r--. 1 root root 800 Feb 7 05:16 minion.pub

master启动的时候会创建KEY

[root@linux-node1 ~]# ll /etc/salt/pki/master/

total 28

-r--------. 1 root root 3243 Feb 7 17:39 master.pem

-rw-r--r--. 1 root root 800 Feb 7 17:39 master.pub

drwxr-xr-x. 2 root root 4096 Feb 8 12:02 minions

drwxr-xr-x. 2 root root 4096 Feb 7 17:39 minions_autosign

drwxr-xr-x. 2 root root 4096 Feb 7 17:39 minions_denied

drwxr-xr-x. 2 root root 4096 Feb 7 17:39 minions_pre

drwxr-xr-x. 2 root root 4096 Feb 7 17:39 minions_rejected

先检查一下所有的key信息,发现没有等待统一的key(Unaccepted Keys下面没有信息)

[root@linux-node1 master]# salt-key

Accepted Keys:

minion-192-168-1-102

Unaccepted Keys:

Rejected Keys:

模拟等待同意的Key:把minions目录下的文件传输到minions_pre目录下

[root@linux-node1 ~]# ll /etc/salt/pki/master/minions

total 4

-rw-r--r--. 1 root root 800 Feb 8 12:02 minion-192-168-1-102

[root@linux-node1 ~]# cp /etc/salt/pki/master/minions/* /etc/salt/pki/master/minions_pre/

[root@linux-node1 ~]# ll /etc/salt/pki/master/minions_pre/

total 4

-rw-r--r--. 1 root root 800 Feb 8 12:07 minion-192-168-1-102

再次查看key,发现有了等待同意的key

[root@linux-node1 ~]# salt-key

Accepted Keys:

minion-192-168-1-102

Unaccepted Keys:

minion-192-168-1-102

Rejected Keys:

执行同意操作:-A选项表示全部同意

[root@linux-node1 ~]# salt-key -A

The following keys are going to be accepted:

Unaccepted Keys:

minion-192-168-1-102

Proceed? [n/Y] y

[root@linux-node1 ~]# salt-key //发现key已经被同意了

Accepted Keys:

minion-192-168-1-102

Unaccepted Keys:

如果不用上面的-A选项,可以使用-a选项,自定义匹配,也可以使用*通配符。上面命令也可以是:

[root@linux-node1 ~]# salt-key -a minion-*

The following keys are going to be accepted:

Unaccepted Keys:

minion-192-168-1-102

Proceed? [n/Y] y

通过认证的主机位置会发生改变,原本在minion_pre下面(yum install -y tree )

[root@linux-node1 ~]# tree /etc/salt/pki/master/

/etc/salt/pki/master/

├── master.pem

├── master.pub

├── minions

│   └── minion-192-168-1-102

├── minions_autosign

├── minions_denied

├── minions_pre

└── minions_rejected

5 directories, 3 files

其实上面的master下面minion中的文件是minion端的公钥,同时在master认证通过的时候,master也偷偷的把他的公钥放到了minion端一份。用事实说话,在minion端上查看。

[root@linux-node2 ~]# ll /etc/salt/pki/minion/

总用量 12

-rw-r--r-- 1 root root 451 12月 28 23:11 minion_master.pub

-r-------- 1 root root 1675 12月 28 23:03 minion.pem

-rw-r--r-- 1 root root 451 12月 28 23:03 minion.pub

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

为了试验效果,再追加一台被控制端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重要组件之一,重要作用是收集被控主机的基本系统信息)进行匹配过滤.

格式为'<grain value>:<glob expression>'。

比如过滤内核为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}

截图如下:

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

注意:将字符字典转换成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

Saltstack是一个大型分布式的配置管理系统(安装升级卸载软件,检测环境),也是一个远程命令执行系统。saltstack的两大功能:远程执行和配置管理。

实验目的:服务器 Master和 客户端Minion 系统配置成功,Master机通讯 Minion。

实验准备步骤:

服务器

Master:192.168.8.1(master.hello.com),

客户端

minion:192.168.8.2(minion.hello.com)。

【2台虚拟机做测试,域名,是写host实现。系统均是centos6.3_64】

两台机器可以互通,且可以上外网,(随意ping www.baidu.com 测试 )由于测试,我关闭了防火墙和selinux。生产线上需写防火墙规则。

实验开始:

1. 2台机器(master和minion)由于虚拟机找不到salt包,故安装epel,来帮助查询更多的安装包

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

2. 然后清除yum缓存,更好的安装新包

yum clean all

在 master 和minion

3. 两台机器供安装新包准备工作完成,接下来开始在主master和minion上分别操作

Master 操作:安装salt-master

yum -y install salt-master

4. minion操作 安装salt-minion

yum -y install salt-minion

5. 在 客户端minion 修改/etc/salt/minion 文件中,找到

# master:salt  修改成 master:master.hello.com

6. 在服务端master : 启动master服务

service salt-master start

7. 客户端minion:启动minion服务

service salt-minion start

8. 服务端接收客户端的证书:

salt-key -a minion.hello.com

9. 在minion 上查看证书名。(如果证书名不正确,可删除掉/etc/salt/minion_id,然后重启minion服务,

10. 主服务器上查看证书

salt-key -L

11. 在主服务器上操作:测试是否连通从

salt 'minion.hello.com' test.ping

返回True 说明 测试是ok的,客户端是存活状态。

master默认监听两个端口,

4505(publish_port)为salt的消息发布系统,

4506(ret_port)为salt客户端与服务端通信的端口,所以确保客户端能跟服务端的这2个端口通信 .

需求:分发 从服务器运行指令,例如:可以指定某客户端或者所有客户端运行安装nginx。

Master 与 Minion 认证

1  minion 在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion 里面  设置)下自动生成 minion.pem(private key)和 minion.pub(public key),然后将 minion.pub  发送给 master。

2  master 在接收到minion的public key后,通过salt-key命令accept minion public key,  这样在 master 的/etc/salt/pki/master/minions 下的将会存放以 minion id 命名的 public  key, 然后 master 就能对 minion 发送指令了。

KEY 管理:

Salt 在 master 和 minion 数据交换过程中使用 AES 加密, 为了保证发送给 minion 的指令不会被篡改,master 和 minion 之间认证采用信任的接受(trusted, accepted )的 key.  在发送命令到 minion 之前,minion 的 key 需要先被 master 所接受(accepted). 运行  salt-key 可以列出当前 key 的状态

  1. 修改 master 配置, vim /etc/salt/master 去掉前面 #号

2. 告诉master 的salt,配置管理文件在哪里,根据你是如何安装salt,有时需要自动创建 /srv/salt目录,然后需要创建一个top.sls 文件,这个也是入口文件,可以用于作为其他服务器的基础配置文件。

vim /srv/salt/top.sls

dev:

'minion.hello.com':

- nginx

3. 在/srv/salt/ 目录下,创建 dev目录,dev 目录下创建 nginx(这些目录和文件名,随意定义,清晰的表示自己安装什么服务即可)

cd /srv/salt

mkdir dev

cd dev

mkdir nginx

4. 在/srv/salt/dev/nginx 目录下,指定配置文件内容nginx.sls ( 缩进为2个空格,冒号后面1个空格)

nginx:

pkg:

- installed

service:

- running

- enable: Ture

- watch:

- file: /etc/nginx/nginx.conf

- file: /etc/nginx/conf.d/default.conf

- require:

- pkg: nginx

/etc/nginx/nginx.conf:

file.managed:

- source: salt://nginx/nginx.conf

- mode: 664

- user: root

- group: root

/etc/nginx/conf.d/default.conf:

file.managed:

- source: salt://nginx/default.conf

- mode: 664

- user: root

- group: root

解释说明:

第一行:告诉管理工具,这是一个id说明,如我这是管理nginx配置的,我就写nginx

第二行:告诉管理工具,这个软件需要被安装,如果没安装就会执行yum安装

第三行:需要安装的软件名称

第四行:告诉管理工具,这是服务管理

第五行:告诉管理工具,这个服务需保证是运行状态

第六行:告诉管理工具,这个服务设置开机启动

第七-九行:观察file文件改动,有改动就重启服务

第十二行:文件标识

第十三行:文件管理

第十四行:指定数据源在哪里,即服务端的源,当这个文件被改动时,就会触发包管理工具,更改上面file指定的文件,可以

看成是同步更新。

第十五行:指定file文件的权限

第十六行:指定文件的所属用户

第十七行:指定文件的所属组

第十八行-第二十三行,请参考 十二——十七行

5. 然后把master上nginx目录下的 nginx.conf  和 default.conf 复制到salt 的nginx目录下(/srv/salt/nginx)

现在进行测试吧:

rpm -qa | grep nginx

现在我们在服务端进行推送管理:

salt 'minion.hello.com' state.highstate

然后再客户端验证

到这里就完成master 指定客户端安装nginx服务。如果有几百台机器同时需要安装,岂不是很方便。

本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1908935,如需转载请自行联系原作者

Saltstack自动化环境部署相关推荐

  1. Docker selenium自动化 - Python调用容器实例跑自动化查天气实例演示,docker selenium自动化环境部署过程

    Docker selenium自动化 - 环境部署与 Python 自动化运行实战演示 第一章:docker selenium 环境部署 ① 下载 selenium 镜像 ② 容器 selenium ...

  2. CI:Jenkins自动化环境部署(一)

    Jenkins自动化环境部署(一) Jenkins 1. 下载并配置环境变量 1. java 2. jenkins 1. 启动Jenkins Jenkins Jenkins是开源CI&CD软件 ...

  3. Mac下web自动化环境部署

    1.前提:安装python环境,文件可参考:https://www.cnblogs.com/nbnuan/p/9717881.html 2.浏览器很多,主流的浏览器有:ie,firefox,chrom ...

  4. 自动化环境部署工具的编写

    开发这个工具的初衷是为了解决一个问题,问题描述如下: 人工部署环境时,会由于不同的用户无意更改conf中的配置,导致最终结果diff追查时候的问题. 为了解决这个问题,有了这个工具的雏形,具体完成功能 ...

  5. saltstack(1)环境部署、(2)Grains

    文章目录 一.saltstack部署 1.安装和启动 1)准备yum源 2)master和minion安装包 3)master端执行命令允许minion连接 4)master端测试与minion端的连 ...

  6. Android自动化测试环境部署及adb sdkmanager avdmanager Monitor DDMS工具使用及命令详解

    环境部署及工具使用 系列文章 前言 环境部署 硬件环境 软件环境 ADB工具 adb组成 adb命令 android命令 sdkmanager 命令 avdmanager命令 管理模拟器 monito ...

  7. saltstack自动化运维部署--安装apache\原码安装nginx服务

    对saltstack自动化运维部署的认识 原理 SaltStack 是一种基于 C/S 架构的服务器基础架构集中化管理平台,管理端称为 Master,客户端称为 Minion.SaltStack 具备 ...

  8. 企业运维实战--自动化运维Saltstack(上)之saltstack的安装部署、远程执行、grains和pillar详解以及Jinja模板的使用

    企业运维实战--自动化运维Saltstack(上) 前言 一.Saltstack安装部署 二.sls文件远程执行 saltstack安装httpd并启动 saltstack源码编译安装nginx 启动 ...

  9. ansible自动化运维(二)——环境部署及常用模块的使用

    实验环境 主机 ip server1(主控端) 172.25.6.1 server2(节点) 172.25.6.2 server3(节点) 172.25.6.3 一.环境部署 ansible的配置文件 ...

最新文章

  1. 使用xilinx的documentation navigator快速查找资料
  2. 【Flutter】StatelessWidget 组件 ( Container 组件 | BoxDecoration 组件 | Text 组件 | Icon 组件 )
  3. hive的新分区和旧分区的概念问题
  4. 【数论】【杜教筛】选数(P3172)
  5. Android 中像素px和dp的转化
  6. 2020-06-05 原始套接字/AF_PACKET链路层访问
  7. Oracle、 Mysql 、 SQLserver 分页查询
  8. 如何提高matlab的运算速度慢,如何提高MATLAB的运算速度
  9. 年末总结 | 音视频开发进阶 2021 干货合集
  10. 一次对天翼安全网关的渗透
  11. java 口袋算法_【算法笔记】递归(神奇的口袋)
  12. SQL对象名无效的解决
  13. JinKo 多路温度测试仪使用说明
  14. 台式计算机启动时 每次按f1,电脑开机每次都要按f1怎么办|电脑开机要按f1的解决方法...
  15. tp5微信公众号发送模板消息
  16. 解决Fiddler不能抓包问题
  17. 密码学入门(2):对称密码
  18. 【每日早报】2019/08/12
  19. 1.7Hadoop-HDFS命令
  20. cesium加载geoJson格式的图斑方法

热门文章

  1. 厉害!国内大学生计算机编程第一人,一人挑战一个队,百度最年轻 T10,现创业自动驾驶...
  2. python ftp文件夹文件递归上传推送
  3. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 处理静态资源
  4. Android 5.0状态栏和导航栏
  5. 静态方法和实例化方法的区别
  6. 前端面试查漏补缺--(一) 防抖和节流
  7. Mobx入门之三:Provider inject
  8. 用户配置,用户组管理,用户管理
  9. subprocess模块
  10. ubuntu服务器常见使用技巧及-kill掉后GPU显存不释放进程-