安装saltstack
准备工作:
yum -y install libffi-devel zlib-devel bzip2-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
安装libressl
下载地址: https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.7.4.tar.gz
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。或者 :https://pan.baidu.com/s/1zZSPmERAvkEU4-ggj-wpgA
提取码:zusy
cd libressl-2.7.4 ./configure --prefix=/usr/local make make install
libressl代替openssl
vim /etc/ld.so.conf.d/local.conf #新建local.conf文件,添加下面一行 /usr/local/lib # 将 /usr/local/lib 目录加入到模块加载目录。 ldconfig -v #重新加载共享模块: openssl version #查看版本
安装python3.7
下载链接:https://pan.baidu.com/s/1zZSPmERAvkEU4-ggj-wpgA
提取码:zusy
让python使用libressl ,修改如下源码包中Setup.dist文件,取消如下注释:
vim /usr/src/Python-3.7.3/Modules/Setup.dist
#_socket socketmodule.c #SSL=/usr/local #libressl的安装目录 #_ssl _ssl.c \ #-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ #-L$(SSL)/lib -lssl -lcrypto
cd /usr/src/Python-3.7.3 ./configure --prefix=/usr/local/python make make install
修改默认的python版本
rm -rf /usr/bin/python #删除/usr/bin下面python2的超链接 ln -s /usr/local/python/bin/* /usr/bin/ ln -s /usr/bin/python3.7 /usr/bin/python
修改下面内容,否则无法使用yum
vim /usr/bin/yum #!/usr/bin/python ==> #!/usr/bin/python2.7 vi /usr/libexec/urlgrabber-ext-down #!/usr/bin/python ==> #!/usr/bin/python2.7
如果不修改urlgrabber-ext-down文件,用yum安装软件时会出现下面的情况:
Error downloading packages: net-tools-2.0-0.24.20131004git.el7.x86_64: [Errno 5] [Errno 2] No such file or directory
检测libressl和python3.7
[root@localhost pip-19.0.3]# ldd /usr/local/python/bin/python3 | fgrep ssl libssl.so.45 => /usr/local/lib/libssl.so.45 (0x00007f0636fe3000) [root@localhost pip-19.0.3]# python Python 3.7.3 (default, Apr 5 2019, 02:28:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import ssl >>>
安装pip-19.0.3
[root@localhost src]# cd pip-19.0.3/ [root@localhost pip-19.0.3]# python -V Python 3.7.3 [root@localhost pip-19.0.3]# python setup.py install [root@localhost ~]# ln -s /usr/local/python/bin/pip* /usr/bin/ [root@localhost ~]# ls /usr/bin/pip* -l lrwxrwxrwx 1 root root 25 Apr 5 03:08 /usr/bin/pip -> /usr/local/python/bin/pip lrwxrwxrwx 1 root root 26 Apr 5 03:08 /usr/bin/pip3 -> /usr/local/python/bin/pip3 lrwxrwxrwx 1 root root 28 Apr 5 03:08 /usr/bin/pip3.7 -> /usr/local/python/bin/pip3.7
重启电脑后才能使用pip install xx:
pip install -U halite pip install cherrypy pip install paste pip install gevent #如果装不上就先安装saltstack之后再装它 pip install pyopenssl
安装saltstack
yum install salt-master salt-minion salt-api -y
[root@localhost ~]# vim /etc/salt/master external_auth: pam: testuser: //稍后创建此用户 - .* - '@runner' halite: #以下内容需要手动添加 level: 'debug' server: 'cherrypy' host: '0.0.0.0' port: '8080' cors: False tls: True certpath: '/etc/pki/tls/certs/localhost.crt' keypath: '/etc/pki/tls/certs/localhost.key' pempath: '/etc/pki/tls/certs/localhost.pem' [root@localhost ~]# useradd testuser [root@localhost ~]# passwd testuser
二、 saltstack的配置
1、 服务端的配置
1) #更新主控关键项
vim /etc/salt/master #绑定Master通信IP interface: 192.168.1.205 #自动认证,避免手动运行salt-key来确认证书信息 auto_accept: True #指定Saltstack文件根目录 file_roots base: -/srv/salt
systemctl restart salt-master
systemctl start salt-master systemctl enable salt-master systemctl start salt-api systemctl enable salt-api
2、 被控制端的配置
vim /etc/salt/minion #指定master主机IP master: 192.168.1.205 #修改被控主机识别id,建议使用操作系统主机名来配置 id: node1 //另外一台为node2
systemctl start salt-minion systemctl enable salt-minion
三、校验安装结果
通过test模块的ping的方法,可以确认服务器与被控端是否建议信任关系。
#ping单个客户
sudo salt ‘node1’ test.ping sudo salt ‘node2’ test.ping
#ping所有被控端
salt '*' test.ping
master配置文件:
interface: 0.0.0.0 # 默认值:0.0.0.0(所有的网络地址接口); 绑定到本地的某个网络地址接口 publish_port: 4505 # ; 设置master与minion的认证通信端口 user: root # ;运行salt进程的用户 max_open_files: 100000 #salt-master可以打开的最大句柄数 worker_threads: 5 #启动用来接收或应答minion的线程数 ret_port: 4506 #master用来发送命令或者接收minions的命令执行返回信息 pidfile: /var/run/salt-master.pid #指定master的pid文件位置 root_dir: / # 该目录为salt运行的根目录,改变它可以使salt从另外一个目录开始运行,好比chroot pki_dir: /etc/salt/pki/master # 这个目录是用来存放pki认证秘钥 cachedir: /var/cache/salt/master # 用来存放缓存信息,salt工作执行的命令信息 verify_env: True # 在启动验证和设置权限配置目录 keep_jobs: 24 #设置保持老的工作信息的过期时间,单位小时 job_cache: True #设置master维护的工作缓存,这是一个很好的功能,当你的Minons超过5000台时,他将很好的承担这个大的架构,关闭这个选项,之前的工作执行以及工作系统将无法被利用,一般不推荐关掉改选项,开启改选项将会是很明智的,他将使master获得更快的IO系统 timeout: 5 #默认值:5 ;master执行命令的可以接受的延迟时间 output: nested #默认值:nested ;salt命令的输出格式 sock_dir: /var/run/salt/master #默认值:/var/run/salt/master ; 指定unix socket主进程通信的socket创建路径 minion_data_cache: True # 默认值:True ;minion data cache是关于minion信息存储在master上的参数,这些信息主要是pillar 和 grains数据.这些数据被缓存在cachedir定义的目录下的minion目录下以minion名为名的目录下并且预先确定哪些minions将从 执行回复 include: /etc/salt/extra_config #默认值:/etc/salt/extra_config ;包含其他路径上的配置文件
Security settings
#open_mode: False #open_mode是一个危险的安全特性,当master遇到pki认证系统,秘钥混淆和身份验证失效时,打开open_mode,master将会接受 所有的身份验证。这将会清理掉pki秘钥接受的minions。 通常情况下open_mode不应该被打开,它只适用于短时间内清理pki keys,若要打开它,可将值调整为True #auto_accept: False #这个设置将会使master自动接受所有发送公钥的minions #autosign_file: /etc/salt/autosign.conf #如果autosign_file的值被指定,那么autosign_file将会通过该输入允许所有的匹配项,首先会搜索字符串进行匹配,然后通过正则表达式进行匹配。这是不安全的
#client_acl: # 默认值:{} ;开启对系统上非root的系统用户在master上执行特殊的模块,这些模块名可以使用正则表达式进行表示
1 2 3 4 | client_acl: larry: - test . ping - network.* |
#client_acl_blacklist #默认值:{} ;黑名单用户或模块,表示所有非sudo用户以及root都无法通过cmd这个模块执行命令,默认情况改配置是完全禁用的
1 2 3 4 5 6 | client_acl_blacklist: users : - root - '^(?!sudo_).*$' # all non sudo users modules: - cmd |
#external_auth: #默认值:{} ; salt的认证模块采用外部的认证系统用来做认证和验证用户在salt系统中的访问区域
1 2 3 | pam: fred: - test .* |
#file_recv: False #默认值:False ; 允许minions推送文件到master上,这个选项默认是禁用的,出于安全考虑 #file_recv_max_size: 100 # 默认值:100 设置一个hard-limit文件的大小,可以推到master。
State System settings
state_top: top.sls #默认值:top.sls ; 状态系统使用一个入口文件告诉minions在什么环境下使用什么模块,这个状态入口文件被定义在基础环境的相对根路径下 renderer: yaml_jinja #默认值:yaml_jinja ;使用渲染器用来渲染minions的状态数据 failhard: False #默认值:False ; 设置一个全局的failhard表示,当单个的状态执行失败后,将会通知所有的状态停止运行状态 state_verbose: True #state_verbose允许从minions返回更多详细的信息,通常清空下只返回失败或者已经更改,但是将state_verbose设置为True,将会返回所有的状态检查 state_output: full #state_output的设置将会改变信息输出的格式, 当被设置为”full”时,将全部的输出一行一行的显示输出; 当被设置为”terse“时,将会 被缩短为一行进行输出; 当被设置为”mixed”时,输出样式将会是简洁的,除非状态失败,这种情况下将会全部输出; 当被设置为”change”时,输出 将会完全输出除非状态没有改变
File Server settings
# file_roots: # salt运行一个轻量级的文件服务器通过ZeroMQ对minions进行文件传输,因此这个文件服务器是构造在master的守护进程中,并且不需要依赖于专用的端口
文件服务器的工作环境传递给master,每一个环境可以有多个根目录,但是相同环境下多个文件的子目录不能相同,否则下载的文件将不能被可靠的保证,一个基础环境依赖于主的入口文件,
1 2 3 4 5 6 7 8 9 10 | Example: file_roots: base: - /srv/salt/ dev: - /srv/salt/dev/services - /srv/salt/dev/states prod: - /srv/salt/prod/services - /srv/salt/prod/states |
#hash_type: md5 # 默认值:md5 ; hash_type是用来当发现在master上需要对一个文件进行hash时的hash使用的算法,默认是md5.但是它也支持sha1,sha224,shar256,shar384,shar512
#file_buffer_size: 1048576 # 默认值:1048576 ;文件服务器的缓存区大小
#fileserver_backend: # 默认值: fileserver_backend:
\n\t - roots
;salt支持模块化的后端文件系统服务器,它允许salt通过第三方的系统来管理收集文件并提供给minions使用,可以配置多个后端文件系统,这里支 持gitfs、hgfs、roots、s3fs文件调用的搜索顺序按照后台文件系统的配置顺序来搜索,默认的设置只开启了标准的后端服务器roots,具 体的根选项配置通过file_roots参数设置
1 2 3 | fileserver_backend: - git - roots |
##### Pillar settings #####
#pillar_roots: # 默认值: base: \n\t - /srv/pillar 设置不同的环境对应的存放pillar数据的目录,这个配置和file_roots参数配置一样
1 2 3 4 5 6 7 | pillar_roots: base: - /srv/pillar dev: - /srv/pillar/dev prod: - /srv/pillar/prod |
##### Logging settings #####
#log_file: /var/log/salt/master # 默认值:/var/log/salt/master ;master的日志可以发送到一个普通文件,本地路径名或者网络位置
1 2 3 4 | eg: log_file: /var/log/salt/master log_file: log_file: udp: //loghost :10514 |
#log_level: warning #默认值:warning ; 按照日志级别发送信息到控制台 可选项:# One of 'garbage', 'trace', 'debug', info', 'warning', 'error', 'critical'.
1 | log_level: warning |
#log_level_logfile: warning #默认值:warning ; 按照日志级别发送信息到日志文件
#log_datefmt: '%H:%M:%S' #默认值:%H:%M:%S ;发送到控制台信息所用的日期时间格式,更多详情
log_fmt_console
默认值: [%(levelname)-8s] %(message)s
控制台日志信息格式,
1 | log_fmt_console: '[%(levelname)-8s] %(message)s' |
log_fmt_logfile
默认值: %(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s
%(asctime)s:2003-07-08 16:49:45 %(msecs)03.0f:当前时间的毫秒部分 %(name):日志记录调用器的名字 %(levelname):日志记录级别 %(message)s:日志详细信息
1 | log_fmt_logfile: '%(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s' |
log_granular_levels #默认值:{} ; 这可以更加具体的控制日志记录级别
##### Node Groups #####
1 2 | nodegroups: webgroup1: 'L@_host_serv_1.lansgg.com,_host_serv_1.lansgg.com' |
上面配置是我这边测试用;编辑后,重启master
1 | [root@master salt] # salt -N webgroup1 test.ping |
高级用法:
关于组的混合匹配:(Compound matchers)
匹配中可以使用and、or及not等boolean型操作
例如,想匹配所有minion中主机名(minion id)以webserv开头并且运行在Debian系统上或者minion的主机名(minion id)匹配正则表达式web-dc1-srv.*:
salt -C ‘webserv* and G@os:Debian or E@web-dc1-srv.*’ test.ping
在top.sls中可以如下使用:
base:
‘webserv* and G@os:Debian or E@web-dc1-srv.*’:
– match: compound
– webserver
遇到的问题:
ModuleNotFoundError: No module named 'salt'
-- The result is failed. Apr 20 01:34:27 localhost.localdomain systemd[1]: Unit salt-master.service entered failed state. Apr 20 01:34:27 localhost.localdomain systemd[1]: salt-master.service failed. Apr 20 01:34:27 localhost.localdomain polkitd[5770]: Unregistered Authentication Agent for unix-process:6074:4301 (system bus name :1.13, object path /org/freedesktop Apr 20 01:35:04 localhost.localdomain polkitd[5770]: Registered Authentication Agent for unix-process:6082:8015 (system bus name :1.14 [/usr/bin/pkttyagent --notify-f Apr 20 01:35:04 localhost.localdomain systemd[1]: Reloading. Apr 20 01:35:04 localhost.localdomain systemd[1]: Configuration file /usr/lib/systemd/system/auditd.service is marked world-inaccessible. This has no effect as config Apr 20 01:35:04 localhost.localdomain systemd[1]: Configuration file /usr/lib/systemd/system/wpa_supplicant.service is marked executable. Please remove executable per Apr 20 01:35:04 localhost.localdomain polkitd[5770]: Unregistered Authentication Agent for unix-process:6082:8015 (system bus name :1.14, object path /org/freedesktop Apr 20 01:35:12 localhost.localdomain polkitd[5770]: Registered Authentication Agent for unix-process:6100:8814 (system bus name :1.15 [/usr/bin/pkttyagent --notify-f Apr 20 01:35:12 localhost.localdomain systemd[1]: Starting The Salt Master Server... -- Subject: Unit salt-master.service has begun start-up -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit salt-master.service has begun starting up. Apr 20 01:35:12 localhost.localdomain systemd[1]: salt-master.service: main process exited, code=exited, status=1/FAILURE Apr 20 01:35:12 localhost.localdomain salt-master[6105]: Traceback (most recent call last): Apr 20 01:35:12 localhost.localdomain salt-master[6105]: File "/usr/bin/salt-master", line 6, in <module> Apr 20 01:35:12 localhost.localdomain salt-master[6105]: from salt.scripts import salt_master Apr 20 01:35:12 localhost.localdomain salt-master[6105]: ModuleNotFoundError: No module named 'salt' Apr 20 01:35:12 localhost.localdomain systemd[1]: Failed to start The Salt Master Server. -- Subject: Unit salt-master.service has failed -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit salt-master.service has failed. -- -- The result is failed. Apr 20 01:35:12 localhost.localdomain systemd[1]: Unit salt-master.service entered failed state.
解决方法:
pip install salt
