文章目录
1、saltstack安装与配置
官方文档:http://docs.saltstack.cn/
saltsack是一个配置管理系统,能够维护预定义状态的远程节点;是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
[root@server1 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-3000.el7.noarch.rpm
[root@server1 ~]# yum list salt-*
[root@server1 ~]# yum install -y salt-master.noarch
[root@server1 ~]# systemctl enable --now salt-master.service
[root@server1 ~]# netstat -antlp
saltstack采用C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口。
每个节点安装minion端通过消息队列订阅数据,master发布数据,所有端口通过4505拿到数据,是并行的。4505做消息队列的发布和订阅系统。
4506端口是请求响应端,当客户端执行结束后,想知道结果,通过4506端口反馈。
minion端配置
server2 server3做同样的配置
[root@server1 yum.repos.d]# scp salt-3000.repo server2:/etc/yum.repos.d/
[root@server2 yum.repos.d]# vim salt-3000.repo
gpgcheck=0
[root@server2 ~]# sed -i "s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.d/salt-3000.repo
[root@server2 ~]# cat /etc/yum.repos.d/salt-3000.repo
[root@server2 ~]# yum install -y salt-minion.noarch
[root@server2 ~]# cd /etc/salt/
[root@server2 salt]# vim minion
16 master: 192.168.0.1
[root@server2 salt]# systemctl enable --now salt-minion.service
[root@server3 salt]# systemctl enable --now salt-minion.service
[root@server1 ~]# netstat -antlp
tcp 0 0 192.168.0.1:4506 192.168.0.2:58004 ESTABLISHED 3565/python
tcp 0 0 192.168.0.1:4506 192.168.0.3:33720 ESTABLISHED 3565/python
master端执行命令允许minion连接
[root@server1 ~]# yum install -y lsof
[root@server1 ~]# salt-key -L ##列出
[root@server1 ~]# salt-key -A ##允许所有
[root@server1 ~]# salt-key -L
[root@server1 ~]# netstat -antlp
tcp 0 0 192.168.0.1:4505 192.168.0.2:50796 ESTABLISHED 3559/python
tcp 0 0 192.168.0.1:4505 192.168.0.3:52172 ESTABLISHED 3559/python
[root@server1 ~]# lsof -i :4505
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 3559 root 15u IPv4 31266 0t0 TCP *:4505 (LISTEN)
salt-mast 3559 root 17u IPv4 87974 0t0 TCP server1:4505->server2:50796 (ESTABLISHED)
salt-mast 3559 root 18u IPv4 87975 0t0 TCP server1:4505->server3:52172 (ESTABLISHED)
master端执测试与minion的连接
[root@server1 ~]# salt '*' test.ping ##test 调用的模块 ping 模块内的ping方法
[root@server1 ~]# salt '*' cmd.run "ip addr"
[root@server1 ~]# salt '*' cmd.run hostname
[root@server1 ~]# salt server2 test.ping
[root@server1 ~]# salt server* test.ping
[root@server1 ~]# salt server? test.ping
[root@server1 ~]# salt server[23] test.ping
执行过的命令都被保存,默认缓存是24小时,
[root@server1 salt]# cd /var/cache/salt/
[root@server1 salt]# ls
master
[root@server1 salt]# cd master/
[root@server1 master]# ls
jobs minions proc queues roots syndics tokens
[root@server1 master]# cd jobs/
[root@server1 jobs]# ls
43 5b 8f bb
[root@server1 ~]# yum install -y python-setproctitle.x86_64
[root@server1 ~]# systemctl restart salt-master.service
[root@server1 ~]# ps ax #查看进程
[root@server2 salt]# pwd
/etc/salt
[root@server2 salt]# ls
cloud cloud.deploy.d cloud.profiles.d master minion minion_id proxy roster
cloud.conf.d cloud.maps.d cloud.providers.d master.d minion.d pki proxy.d
[root@server2 salt]# cat minion_id
server2
minion_id:启动minion后,会产生主机名文件,更改主机名后,要删除这个文件,每次启动时都会用原来生成的文件id去连接master,不删除文件的话,会读取这个文件,更改主机名后会不生效。删除后重启,会自动以当前主机名生成新的文件。
2、saltstack远程执行
salt 命令由三个主要部分构成:salt'<target>'<funcation>[arguments]
target: 指定哪些minion, 默认的规则是使用glob匹配minion id.
# salt '*' test.ping
Targets也可以使用正则表达式:
# salt -E 'server[1-3]' test.ping
Targets也可以指定列表:
# salt -L 'server2,server3' test.ping
funcation是module提供的功能,Salt内置了大量有效的functions.
# salt '*' cmd.run 'uname -a'
arguments通过空格来界定参数.
# salt 'server2' sys.doc pkg #查看pkg模块文档
# salt 'server2' sys.doc pkg | grep pkg.install
# salt 'server2' pkg.install httpd
# salt 'server2' pkg.remove httpd
salt内置的执行模块列表:
http://docs.saltstack.cn/ref/modules/all/index.html
[root@server1 ~]# salt server2 pkg.install httpd
[root@server1 ~]# salt server2 cmd.run 'rpm -q httpd'
[root@server1 ~]# salt 'server2' sys.doc service ###查看service模块文档
[root@server1 ~]# salt 'server2' service.start httpd
[root@server1 ~]# vim index.html
server2
[root@server1 ~]# salt-cp server2 index.html /var/www/html
[root@server1 ~]# curl server2
server2
[root@server1 ~]# salt server2 file.stats /var/www/html/index.html
配置管理
Salt 状态系统的核心是SLS,或者叫SaLt State 文件。
•SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
•sls文件命名:
•sls文件以”.sls”后缀结尾,但在调用是不用写此后缀。
•使用子目录来做组织是个很好的选择。
• init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以``apache/init.sls`` 就是表示``apache``.
•如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.
创建一个sls文件:
# vim /srv/salt/apache.sls
httpd: # ID声明
pkg: # 状态声明
- installed # 函数声明
指定主机执行:
# salt server2 state.sls apache
准备Top文件:
# vim /srv/salt/top.sls
base:
'*':
- apache
批量执行:
# salt '*' state.highstate
编写远程执行模块:在server2 中部署apache
在server2 中部署apache
[root@server1 ~]# cd /srv/
[root@server1 srv]# mkdir salt
[root@server1 srv]# cd salt/
[root@server1 salt]# mkdir apache
[root@server1 salt]# mv ~/index.html apache/
[root@server1 salt]# cd apache/
[root@server1 apache]# mkdir files
[root@server1 apache]# vim files/index.html
server2
[root@server1 apache]# vim install.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- source: salt://apache/files/index.html
- name: /var/www/html/index.html
service.running:
- name: httpd
[root@server1 apache]# salt server2 state.sls apache.install ##所有的文件路径都是基于/srv/salt来确定的,调用apache目录下的install文件
[root@server1 apache]# md5sum files/index.html ##每个文件都有md5码
01bc6b572ba171d4d3bd89abe9cb9a4c files/index.html
[root@server2 salt]# tree .
[root@server2 salt]# pwd ##缓存路径
/var/cache/salt
[root@server2 salt]# cd minion/files/base/apache/
[root@server2 apache]# ls
files install.sls
[root@server2 apache]# cd files/
[root@server2 files]# ls
index.html
[root@server2 files]# md5sum index.html
01bc6b572ba171d4d3bd89abe9cb9a4c index.html
[root@server1 apache]# scp server2:/etc/httpd/conf/httpd.conf file/
[root@server1 apache]# vim files/httpd.conf
Listen 8080
[root@server1 apache]# vim install.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- source: salt://apache/files/index.html
- name: /var/www/html/index.html
service.running:
- name: httpd
- enable: true
- watch:
- file: /etc/httpd/conf/httpd.conf
##唯一性声明
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/files/httpd.conf
[root@server1 apache]# salt server2 state.sls apache.install
[root@server2 salt]# netstat -antlp ##未触发成功时,更改端口多试几次
tcp6 0 0 :::8080 :::* LISTEN 14505/httpd
另一种写法
[root@server1 apache]# vim install.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- source: salt://apache/files/httpd.conf
- name: /etc/httpd/conf/httpd.conf
service.running:
- name: httpd
- enable: true
- watch:
- file: apache
[root@server1 apache]# salt server2 state.sls apache.install
init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以``apache/init.sls`` 就是表示``apache``.
如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.
创建模块
[root@server1 ~]# mkdir /srv/salt/_modules ##创建模块目录
[root@server1 ~]# cd /srv/salt/_modules
[root@server1 _modules]# ls
[root@server1 _modules]# vim mydisk.py ##编写模块文件
def df():
return __salt__['cmd.run']('df -h')
[root@server1 _modules]# salt server2 saltutil.sync_modules ##同步模块
server2:
- modules.mydisk
[root@server1 _modules]# salt server2 mydisk.df
[root@server1 _modules]# salt server2 cmd.run df
[root@server2 salt]# cd /var/cache/salt/minion/
[root@server2 minion]# tree .
3、grains
grains定义数据系统
- Grains是SaltStack的一个组件,存放在SaltStack的minion端。
- 当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
- 由于grains是静态数据,因此不推荐经常去修改它。
- 应用场景:
信息查询,可用作CMDB。
在target中使用,匹配minion。
在state系统中使用,配置管理模块。
信息查询
用于查询minion端的IP、FQDN等信息。
默认可用的grains:
列出所有的key
列出所有 key和值
指定key的值
自定义grains项
在/etc/salt/minion中定义
[root@server2 minion]# cd /etc/salt/
[root@server2 salt]# vim minion ##129行
grains:
roles:
- apache
[root@server2 salt]# systemctl restart salt-minion
[root@server1 _modules]# salt server2 test.ping
server2:
True
[root@server1 _modules]# salt server2 grains.item ipv4
server2:
----------
ipv4:
- 127.0.0.1
- 192.168.0.2
[root@server1 _modules]# salt server2 grains.item roles ##指定角色
server2:
----------
roles:
- apache
[root@server1 _modules]# pwd
/srv/salt/_modules
在/etc/salt/grains中定义
[root@server3 salt]# pwd
/etc/salt
[root@server3 salt]# vim grains
roles:
- nginx
[root@server1 _modules]# salt server3 saltutil.sync_grains ##同步数据
[root@server1 _modules]# salt '*' grains.item roles
在salt-master端创建_grains目录
[root@server1 _modules]# mkdir /srv/salt/_grains
[root@server1 _modules]# cd /srv/salt/_grains
[root@server1 _grains]# vim my_grain.py
def my_grain():
grains = {}
grains['salt'] = 'stack'
grains['hello'] = 'world'
return grains
[root@server1 _grains]# salt '*' saltutil.sync_grains ##同步grains到minion端
[root@server1 _grains]# salt '*' grains.item hello
[root@server1 _grains]# salt '*' grains.item salt
[root@server2 ~]# tree /var/cache/salt/
grains匹配运用:在server3部署nginx
在target中匹配minion
在top文件中匹配:nginx
不同的主机部署不同的服务:server3部署nginx
[root@server1 _grains]# cd /srv/salt/
[root@server1 salt]# vim top.sls
base:
'roles:apache':
- match: grain
- apache
'roles:nginx':
- match: grain
- nginx
[root@server1 salt]# cd apache/
[root@server1 apache]# ls
files install.sls
[root@server1 apache]# mv install.sls init.sls
[root@server1 salt]# mkdir nginx
[root@server1 salt]# cd nginx/
[root@server1 nginx]# mkdir files
[root@server1 nginx]# vim init.sls
nginx:
file.managed:
- source: salt://nginx/files/nginx-1.18.0.tar.gz
- name: /mnt/nginx-1.18.0.tar.gz
[root@server1 nginx]# cd files/
[root@server1 files]# ls
[root@server1 files]# pwd
/srv/salt/nginx/files
[root@foundation50 qq]# scp nginx-1.18.0.tar.gz root@192.168.0.1:/srv/salt/nginx/files
[root@server1 salt]# salt '*' state.highstate
[root@server2 ~]# ps ax
14508 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
14509 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
14510 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
14511 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
[root@server3 salt]# cd /mnt/
[root@server3 mnt]# ls
nginx-1.18.0.tar.gz
nginx源码方式安装
[root@server1 nginx]# pwd
/srv/salt/nginx
[root@server1 nginx]# vim install.sls
nginx-install:
pkg.installed:
- pkgs:
- gcc
- pcre-devel
- openssl-devel
file.managed:
- source: salt://nginx/files/nginx-1.18.0.tar.gz
- name: /mnt/nginx-1.18.0.tar.gz
cmd.run:
- name: cd /mnt && tar zxf nginx-1.18.0.tar.gz && cd nginx-1.18.0 && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx
[root@server1 nginx]# salt server3 state.sls nginx.install
install.sls
[root@server1 files]# scp server3:/usr/local/nginx/conf/nginx.conf .
[root@server1 files]# vim nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@server1 files]# vim nginx.conf ##默认情况下nginx服务是nobody身份运行,更改为nginx用户运行。
2 user nginx;
[root@server1 nginx]# vim init.sls
include:
- nginx.install
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
nginx-service:
user.present:
- name: nginx
- shell: /sbin/nologin
- home: /usr/local/nginx
- createhome: false
file.managed:
- source: salt://nginx/files/nginx.service
- name: /usr/lib/systemd/system/nginx.service
service.running:
- name: nginx
- enable: true
- reload: true
- watch:
- file: /usr/local/nginx/conf/nginx.conf
[root@server1 nginx]# salt server3 state.sls nginx
[root@server1 nginx]# curl server3
<title>Welcome to nginx!</title>
[root@server1 nginx]# salt '*' state.highstate
[root@server3 conf]# ps aux
nginx 18051 0.0 0.2 46320 2032 ? S 20:36 0:00 nginx: worker process
nginx.service
init.sls
4、Jinja模板
通过jinja模板可以为不同服务器定义各自的变量。
Jinja最基本的用法是使用控制结构包装条件:
[root@server1 apache]# salt server2 grains.item os
server2:
----------
os:
RedHat
[root@server1 apache]# salt server2 grains.item fqdn
server2:
----------
fqdn:
server2
[root@server1 salt]# vim test.sls
/mnt/testfile:
file.append:
{% if grains['fqdn'] == 'server2' %}
- text: server2
{% elif grains['fqdn'] == 'server3' %}
- text: server3
{% endif %}
[root@server1 salt]# salt '*' state.sls test
[root@server2 mnt]# cat /mnt/testfile
server2
[root@server3 ~]# cat /mnt/testfile
server3
Jinja在普通文件的使用:
[root@server1 apache]# vim init.sls ##添加在文件最后行
/var/www/html/index.html:
file.managed:
- source: salt://apache/files/index.html
- template: jinja
- context:
NAME: {{ grains['ipv4'][-1] }}
[root@server1 apache]# salt server2 state.sls apache
[root@server2 html]# cat index.html
RedHat - server2
192.168.0.2
[root@server1 apache]# vim init.sls ##优化
apache:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- source: salt://apache/files/httpd.conf
- name: /etc/httpd/conf/httpd.conf
- template: jinja
- context:
port: 80
bind: {{ grains['ipv4'][-1] }}
service.running:
- name: httpd
- enable: true
- watch:
- file: apache
/var/www/html/index.html:
file.managed:
- source: salt://apache/files/index.html
- template: jinja
- context:
NAME: {{ grains['ipv4'][-1] }}
[root@server1 apache]# vim files/httpd.conf
Listen {{ bind }}:{{ port }} ## 直接引用grains变量
[root@server1 apache]# vim files/index.html
{{ grains['os'] }} - {{ grains['fqdn'] }}
{{ NAME }}
[root@server1 apache]# salt server2 state.sls apache
[root@server2 html]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.0.2:80 0.0.0.0:* LISTEN 15847/httpd
配置文件被更改