# 环境准备
192.168.0.110 centos 7.9 hostname:Master
192.168.0.111 centos 7.9 hostname:node1
# 注意点:
服务器时间
防火墙和selinux
一、slatstack安装
https://repo.saltproject.io/
rpm --import https://repo.saltproject.io/py3/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub curl -fsSL https://repo.saltproject.io/py3/redhat/7/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo
salt master安装启动 yum install -y salt-master salt-minion
systemctl enable salt-master systemctl start salt-master salt minion安装 yum install -y salt-minion
修改/etc/salt/minion配置文件
master: 192.168.0.110 # 在minion上标注出master是谁
# id 默认和主机名一样,可以自己有需要进行修改,启动后生成/etc/salt/minion_id,如果需要改id,需要删除这个文件以及master服务器中公钥存放目录/etc/salt/pki/master/minions_pre对应的id文件,已经同意的删除对应目录公钥
systemctl enable salt-minion systemctl start salt-minion
#配置文件 [root@Master salt]# grep -v ^# /etc/salt/master|grep -v ^$ interface: 0.0.0.0 #绑定到本地的0.0.0.0地址 publish_port: 4505 #管理端口,命令发送 user: root #运行salt进程的用户 worker_threads: 5 #salt运行线程数,线程越多处理速度越快,不要超过cpu个数 ret_port: 4506 #执行结果返回端口 pidfile: /var/run/salt-master.pid #pid文件位置 log_file: /var/log/salt/master #日志文件地址 #自动接收minion的key auto_accept: True # 如果对minion信任可以配置master自动接收
# 查看同意的key节点:salt-key命令用于管理mionion秘钥 [root@Master minions_pre]# salt-key Accepted Keys: 已接收的key Denied Keys: 已拒绝的key Unaccepted Keys: 未加入的key Master node1 Rejected Keys: 吊销的key # salt-key -h 常用参数 -A 许可所有的公钥 -a 许可指定公钥 -r 注销掉指定key(该key未被认证) -R 拒绝所有公钥 -d 根据公钥名称删除指定公钥
-D 删除所有
-L 查看key状态 [root@Master minions_pre]# salt-key -A The following keys are going to be accepted: Unaccepted Keys: Master node1 Proceed? [n/Y] Y Key for minion Master accepted. Key for minion node1 accepted. [root@Master minions_pre]# salt-key Accepted Keys: Master node1 Denied Keys: Unaccepted Keys: Rejected Keys:
# minion上生成文件/etc/salt/pki/minion/minion_master.pub 双向交换秘钥进行验证
#验证
[root@Master ~]# salt '*' test.ping
node1:
True
Master:
True
# master 默认端口为 4505和4506,4505端口为发送消息端口,所有minion都会接收到,4506为返回消息端口 # zeromq消息队列 [root@Master salt]# lsof -n -i :4505 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 83600 root 18u IPv4 869809 0t0 TCP *:4505 (LISTEN) salt-mast 83600 root 20u IPv4 1028703 0t0 TCP 192.168.0.110:4505->192.168.0.111:60802 (ESTABLISHED) salt-mast 83600 root 21u IPv4 1032782 0t0 TCP 192.168.0.110:4505->192.168.0.110:41460 (ESTABLISHED) salt-mini 92885 root 22u IPv4 1028705 0t0 TCP 192.168.0.110:41460->192.168.0.110:4505 (ESTABLISHED)
命令执行,状态模块
saltsatck模块:https://www.unixhot.com/docs/saltstack/salt-modindex.html
# 固定写法 # cmd.run 执行命令模块,所有的shell命令都可以执行 [root@Master salt]# salt Master cmd.run 'w' Master: 09:46:07 up 12:21, 2 users, load average: 0.00, 0.04, 0.06 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 01:10 8:35m 0.01s 0.01s -bash root pts/1 192.168.0.125 01:34 7.00s 1.22s 0.86s /usr/bin/python3 /usr/bin/salt Master cmd.run w
列出所有的sys模块
#与系统交互的sys模块 [root@Master ~]# salt 'node1' sys.list_modules
service远程管理服务模块
# 管理服务是系统管理员的重要任务,通过salt管理minion服务会很简单,使用service模块 [root@Master base]# salt 'node1' service.status "sshd" node1: True
service.running #确保服务处于运行状态,如果没用运行就启动
service.enabled # 确保服务是开机启动
service.disabled # 确保服务开机不启动
service.dead # 确保服务当前没有运行,如果运行就停止
pkg安装模块
logstash: pkg.installed # 安装模块 - fromrepo: ppa:wolfnet/logstash #指定yum源 - pkgs: - php-fpm # 列出需要安装的包
pkg.latest #确保软件包是最新版本,如果不是,进行升级
pkg.remove # 确保软件包已卸载,如果之前已安装,进行卸载
pkg.purge # 除remove外,也会删除其配置文件
file文件管理
# 常用方法
file.managed #保证文件存在并为对应状态
file.recurse # 保证目录存在并且为对应状态
file.absent # 保证文件不存在,如果存在就删除
requisites处理状态间关系
# 常用方法
require # 我依赖某个状态,例如安装不成功,就不继续往下走
require_in # 我被某个状态依赖
watch # 我关注某个状态,例如:如果某个服务的配置文件改变,自动重启服务或者reload;查看lnmp例子
watch_in # 我被某个状态关注
二、YAML讲解
salt的配置文件是yaml配置文件,不能用tab
saltstack,k8s,ansible都用的yaml格式配置文件
语法规则
大小写敏感
使用缩进表示层级关系,连续的项目通过减号“-”来表示
缩进时禁止tab键,只能空格
缩进的空格数不重要,相同层级的元素左侧对其即可
# 表示注释行
yaml支持的数据结构
对象: 键值对,也称作映射 mapping 哈希hashes 字典 dict 冒号表示 key: value key冒号后必须有
数组: 一组按次序排列的值,又称为序列sequence 列表list 短横线 - list1
纯量: 单个不可再分的值
1.字串不一定要用双引号标识;
2.在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符);
3.允许在文件中加入选择性的空行,以增加可读性;
4.在一个档案中,可同时包含多个文件,并用“——”分隔;
5.选择性的符号“...”可以用来表示档案结尾(在利用串流的通讯中,这非常有用,可以在不关闭串流的情况下,发送结束讯号)。
# 修改配置文件,标注yaml文件目录
vim /etc/salt/master +677
file_roots:
# 根据环境来定义,如果写了多个目录就会挨个找
base:
- /srv/salt
# 开发环境
dev:
- /srv/salt/dev
[root@Master salt]# mkdir -p /srv/salt/{base,dev,test,prod} # 客户端也执行下
[root@Master salt]# systemctl restart salt-master
apache安装yaml编写
# 唯一标识,id声明,不能重复
apache-install:
# pkg状态模块,installed状态模块的一个方法
pkg.installed:
# name状态:这台机器应该有一个httpd,如果有就不安装,没有就安装
- name: httpd
apache-service:
# service模块,running方法
service.running:
# 检查httpd是否有启动,如果没有启动就启动起来
- name: httpd
# 开机自动启动
- enable: True
命令执行:
# master执行:state为模块,apache后面不需要加xls [root@Master base]# salt 'node1' state.sls apache node1: ---------- ID: apache-install Function: pkg.installed Name: httpd Result: True # 返回结果 Comment: The following packages were installed/updated: httpd Started: 22:40:06.200137 Duration: 97472.676 ms Changes: # 改变 ---------- apr: ---------- new: 1.4.8-7.el7 old: apr-util: ---------- new: 1.5.2-6.el7 old: httpd: ---------- new: 2.4.6-97.el7.centos.1 old: httpd-tools: ---------- new: 2.4.6-97.el7.centos.1 old: mailcap: ---------- new: 2.1.41-2.el7 old: ---------- ID: apache-service Function: service.running Name: httpd Result: True Comment: Service httpd has been enabled, and is running Started: 22:41:43.686190 Duration: 272.505 ms Changes: ---------- httpd: True Summary for node1 ------------ Succeeded: 2 (changed=2) Failed: 0 ------------ Total states run: 2 Total run time: 97.745 s # master执行中在node1上查询,可以看到下面的状态 [root@node1 ~]# ps -ef | grep yum root 20293 20250 1 22:40 ? 00:00:00 /usr/bin/python /usr/bin/yum --quiet --assumeyes check-update --setopt=autocheck_running_kernel=false root 20324 20109 0 22:40 pts/0 00:00:00 grep --color=auto yum [root@node1 ~]# ps -ef | grep yum root 20364 20250 0 22:41 ? 00:00:00 /usr/bin/python /usr/bin/yum -y install httpd root 20376 20109 0 22:41 pts/0 00:00:00 grep --color=auto yum # master执行完成后查看node1是否运行这个服务 [root@Master base]# salt 'node1' service.status "httpd" node1: True
[root@Master base]# salt 'node1' service.stop "httpd"
node1:
True
[root@Master base]# salt 'node1' service.status "httpd"
node1:
False
三、配置管理
sls可以根据用途或项目进行细分,高级状态
# 多级目录执行方法 mkdir /srv/salt/base/web # 命令执行方法 [root@Master base]# salt 'node1' state.sls web.apache
# top.sls 定义每台机器做什么 base: # 环境 'node1': # 节点 - web.apache #执行状态 'node2': - web.apache # 执行top.sls方法,生产中使用比较多 # state.highstate 执行高级状态,默认去base目录下找到top.sls并读取,告诉salt那个minon该执行什么状态 [root@Master base]# salt 'node1' state.highstate # 高级状态依靠的就是topfile
安装一个文件需要3个模块:pkg软件包、file配置文件、服务service
状态模块:https://www.unixhot.com/docs/saltstack/ref/states/all/index.html
四、Saltstack配置管理之LNMP状态管理
# 正式运行之前可以先,在一台试验机上yum安装一次看看有什么问题没 lamp-install: pkg.installed: # 同一个文件环境下只能有一个这种模块 - pkgs: - httpd - php - php-fpm - php-cli - php-mysql - php-common - php-pdo apache-config: file.managed: #file 文件管理模块,管理文件和目录 - name: /etc/httpd/conf/httpd.conf # 文件下载到的minion路径 - source: salt://web/httpd.conf # 代表从当前环境master所在路径,salt://代表/srv/salt/base/目录,web目录下有一个httpd.conf文件,也可以放到FTP上 - user: root # 所属用户 - group: root # 所属组 - mode: 644 # 文件权限
- require: # 依赖lamp-install执行成功
- pkg: lamp-install
# 状态判断
apache-auth:
pkg.installed:
- name: httpd-tools
- require_in:
- cmd: apache-auth
cmd.run:
- name: htpasswd -bc /etc/httpd/conf/htpasswd_file admin admin
- unless: test -f /etc/httpd/conf/htpasswd_file # 判断文件是否存在;unless判断是否为真,如果为真就不执行
apache-conf:
file.recurse:
- name: /etc/httpd/conf.d # 目录文件同步,详情请看后面描述
- source: salt://web/files/apache-conf.d
- watch_in:
- service: lamp-service # 如果我变了,通知服务重启
php-config: # 如果 file.managed: - name: /etc/php.ini - source: salt://web/php.ini - user: root - group: root - mode: 644
/etc/php-fpm.conf:
file.managed:
- source: salt://web/files/php-fpm.conf
- user: root
- group: root
- mode: 644
lamp-service:
service.running:
- name: httpd
- enable: True
- reload: True # 配置文件有改变服务进行reload,如果没有这一行就是重启
- watch:
- file: apache-config
- file: php-config
# 有pkg.installed安装的文件没有安装也会有报错,并提示那些安装了,那些没有安装
第一次:
Comment: The following packages failed to install/update: php-curl
6 targeted packages were installed/updated.
The following packages were already installed: httpd
第二次: php-curl安装失败
Comment: The following packages failed to install/update: php-curl
The following packages were already installed: httpd, php, php-fpm, php-cli, php-mysql, php-common, php-pdo
# 运行时配置文件编写错误
node1:、
Data failed to compile:
----------
Too many functions declared in state 'file' in SLS 'web.lamp'
# 还有一种执行没成功是因为缓存原因,一般再修改一次再用
清理对应客户端缓存:/var/cache/salt/minion/files/base/web/lamp.sls
配置文件也可以单独建立目录放置,但是sls配置里也需要修改为对应目录
file模块管理目录:
# 将本地/srv/salt/base/web/files/apache-conf.d/目录下的所有文件都传送到节点上
apache-conf:
file.recurse:
- name: /etc/httpd/conf.d
- source: salt://web/files/apache-conf.d
# 先找一个节点测试:
# 服务端新建一个文件,修改一个文件;客户端新建一个文件,修改一个文件
# test=True 不改变客户端,只显示需要变动的地方
[root@Master apache-conf.d]# salt 'node1' state.highstate test=True
# 执行结果:
Changes:
----------
/etc/httpd/conf.d/README:
----------
diff:
---
+++
@@ -7,4 +7,3 @@
Files are processed in alphabetical order.
-ddd
/etc/httpd/conf.d/kk:
----------
newfile:
/etc/httpd/conf.d/kk
Succeeded: 5 (unchanged=1, changed=1)
# 正式执行:
[root@Master apache-conf.d]# salt 'node1' state.highstate
# 执行结果:客户端新增了一个文件kk,但是客户端目录里自己加的那个文件也没有消失,修改的文件被服务端覆盖
# file模块操作环境变量追加
# 追加:可以用户环境变量里追加
/etc/profile:
file.append:
- text:
- "#aaa"
- "#bb"
tomcat操作
# tomcat.sls jdk-install: pkg.installed: - pkgs: - java-1.8.0-openjdk tomcat-install: file.managed: - name: /usr/local/src/apache-tomcat-8.5.72.tar.gz - source: salt://web/files/apache-tomcat-8.5.72.tar.gz - user: root - group: root - mode: 755 cmd.run: - name: cd /usr/local/src && tar zxf apache-tomcat-8.5.72.tar.gz && mv apache-tomcat-8.5.72 /usr/local/ && ln -s /usr/local/apache-tomcat-8.5.72 /usr/local/tomcat - unless: test -L /usr/local/tomcat && test -d /usr/local/apache-tomcat-8.5.72
saltstack数据系统-Grains
Grains 是saltstack组件中非常重要之一,在配置部署时候回经常使用,Grains记录minion的静态信息,比如常用属性,CPU、内存、磁盘、网络信息等。
Minions的Grains信息是Minion启动时采集汇报给Master的Grains是以 key value形式存储的数据库,可以看做Host的元数据(metadata)Grains保存着收集到的客户端的详细信息如果slave机器数据变化,grains就过期了
在生产环境中需要自定义Grains,可以通过
Minion配置文件
Grains相关模块定义
Python脚本定义salt 'node1' sys.doc grains#查看grains的命令用法
用途:1.数据采集静态信息 2.匹配minion(例如:匹配特定系统执行) 3.信息查询
salt 'node1' grains.ls 列出所有的grains
salt 'node1' grains.items 可以看到节点的很多信息
salt -G 'os:CentOS' cmd.run 'uptime' 在所有的Centos系统中执行uptime
salt 'node1' grains.item fqdn_ipv4
salt 'node1' grains.item os id host
模板文件里面变量使用{{ 名称 }}
# 举例lnmp中端口使用变量名,master修改 # httpd.conf 修改 第一种:Listen 80 修改为Listen {{ PORT }} 第二种:Listen {{ IPADDR }}:{{ PORT }} # lnmp.sls apache-config: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://web/files/httpd.conf - user: root - group: root - mode: 644 - template: jinja - defaults: PORT: 8080 # 替换{{ PORT }} IPADDR: {{ grains['fqdn_ipv4'][0] }} - require: - pkg: lamp-install