官网:http://www.saltstack.com/
设置官方YUM仓库:yum install http://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm
yum list salt-* 查看salt的相关安装包
server1(master端)
下载并开启以及设置开机自启动salt-master服务
yum install salt-master.noarch -y
systemctl enable --now salt-master.service
4506端口的作用:salt Master Ret接口,支持认证、文件服务、结果收集等功能
4505端口的作用:salt Master pub接口,提供远程执行命令发送功能
在server2、3(minion端)
下载salt-minion 并修改配置文件 开启并设置开机自启动服务
yum install salt-minion.noarch
vim /etc/salt/minion
16 master: 172.25.21.1 #:号后面必须带个空格 master顶格写
systemctl enable --now salt-minion.service
注意:如果minion端更改完hostname名后 需要删除/etc/salt/minion_id
否则在master端显示的还是之前的hostname
到这,minion端则已经设置好
在server1(master端)
进行公钥的相互交换,master端执行命令允许minion连接
salt-key 密钥管理
salt-key -L ##查看所有minion-key
salt-key -a ##接受某个minion-key
salt-key -d ##删除某个minion-key
salt-key -A ##接受所有的minion-key
salt-key -D ##删除所有的minion-key
salt '*' test.ping #出现true则表示成功
lsof (list open files)是一个列出当前系统打开文件的工具
yum install -y lsof
lsof -i :4505
lsof -i :4506
可以看出server1通过4505发送给server2和3
server1通过4506收集server2和3的信息
下载python获取进程名字的工具,可以看到运行进程的名字
yum install -y python-setproctitle.x86_64
systemctl restart salt-master.service
ps ax
远程执行命令在matser端输入
salt [options] '' [arguments]
target:指定哪些minion,默认的规则是使用glob匹配minion id
如: salt '*' test.ping
salt -E 'server[1-3]' test.ping
salt -L 'server2,server3' test.ping
function是module提供的功能,Salt内置了大量有效的functions
如: salt '*' cmd.run hostname
salt '*' cmd.run 'uname -a'
arguments通过空格来界定参数
如: salt 'server2' sys.doc pkg 查看pkg模块文档
salt 'server2' sys.doc service 查看service模块文档
salt内置的执行模块列表
测试master和minion端连接
远程执行显示hostname名字
远程执行下载安装包的命令模板
远程执行在server2下载httpd服务
salt 'server2' pkg.install httpd
远程查看server2的httpd和minion的版本信息
salt 'server2' pkg.version httpd
salt 'server2' pkg.version salt-minion
salt 'server2' service.start httpd
salt 'server2' service.stop httpd
首先在matser端(server1)
编辑master配置文件(默认base是/srv/salt)
如果你不想修改 可以忽略下面这步操作
vim /etc/salt/master
如果修改了 那就要重启服务salt-master
mkdir /srv/salt
创建模块目录
mkdir /srv/salt/_modules
vim /srv/salt/_modules/my_disk.py
def df():
return __salt__['cmd.run']('df -h')
#df 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计
同步模块
salt server2 saltutil.sync_modules
会同步到server2的/var/cache/salt/minion/files/base
在master运行模块
salt server2 my_disk.df
则显示了server2的文件系统磁盘使用情况统计
YAML语法
规则一: 缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs。
规则二: 冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
my_key: my_value
规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。
- list_value_one
- list_value_two
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.
首先在base(也就是/srv/salt)下建立目录apache,在这个目录下建立init.sls,编写内容如下
文件意思大致:下载安装包httpd和php,运行、开机自启动、刷新httpd服务,watch的作用:运行中的 httpd 服务将会关注/etc/httpd/conf/httpd.conf文件的变化,如果发生变化,将会触发重启服务的操作 file.managed可以把自己修改的httpd.conf模板同步到你下载的httpd主机
apache:
pkg.installed:
- pkgs:
- httpd
- php
service.running:
- name: httpd
- enable: true
- reload: true
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf
需要在base下的apache下有一个httpd.conf的配置文件,这个可以自己修改自己所需的内容,在远程执行安装时候会将这个httpd.conf的配置文件模板填入到你安装的机器的httpd.conf的配置文件中
salt server2 state.sls apache
在master端运行这条命令,即可为server2远程安装httpd服务
首先在base(也就是/srv/salt)下建立目录nginx,在这个目录下建立init.sls,编写内容如下
文件意思大致:安装nginx的依赖性问题,同步base下nginx目录中的nginx压缩包到远程安装主机的/mnt目录下,然后命令运行,进入/mnt—>解压缩nginx压缩包–>进入解压后的目录–>将debug注释掉(在解压后目录的auto/cc/gcc文件中)–>进行源代码安装三部曲
- creates: /usr/local/nginx
这句话的作用是判定有没有/usr/loacl/nginx存在 避免二次安装 如果存在这个目录 则不会执行操作
nginx-install:
pkg.installed:
- pkgs:
- gcc
- pcre-devel
- openssl-devel
file.managed:
- name: /mnt/nginx-1.20.1.tar.gz
- source: salt://nginx/nginx-1.20.1.tar.gz
cmd.run:
- name: cd /mnt && tar zxf nginx-1.20.1.tar.gz && cd nginx-1.20.1 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-threads --with-file-aio &> /dev/null && make &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx
需要提前将nginx压缩包放入到base下nginx目录中
salt server3 state.sls nginx
在master端运行这条命令,即可为server3远程安装nginx服务
拷贝一个nginx.conf配置文件模板到base下nginx目录中,并进行修改
vim nginx.conf
拷贝一个nginx.service配置文件模板到base下nginx目录中,保证在安装nginx的主机可以通过systemctl来控制
文件内容大致跟上面httpd内容一致,唯一的不同就是这个嵌套了nginx的安装,第一二行表示调用nginx,也就是上面写的远程执行安装nginx服务,剩下的行则是远程配置nginx
include:
- nginx
nginx-user:
user.present:
- name: nginx
- shell: /sbin/nologin
- home: /usr/local/nginx
- createhome: false
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/nginx.conf
nginx-service:
file.managed:
- name: /usr/lib/systemd/system/nginx.service
- source: salt://nginx/nginx.service
service.running:
- name: nginx
- enable: true
- reload: true
- watch:
- file: /usr/local/nginx/conf/nginx.conf
curl server3 可以查看nginx是否开启成功
grains简介
Grains是SaltStack的一个组件,存放在SaltStack的minion端。
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
由于grains是静态数据,因此不推荐经常去修改它。
salt server* grains.item ipv4 获取server2的ipv4
两种设置minion端roles的方式
第一种:server2中设置roles
vim /etc/salt/minion
grains:
roles: apache
systemctl restart salt-minion.service 重启salt-minion,否则数据不会更新
第二种:server3中设置roles
vim grains
roles: nginx
salt server3 saltutil.sync_grains 同步数据,否则数据不会更新
server1(master):
在server1下查询
salt server? grains.item roles
在salt-master端创建_grains目录
mkdir /srv/salt/_grains
vim /srv/salt/_grains/grains.py
#!/usr/bin/env python
def grains():
# initialize a grains dictionary
grains = {}
# Some code for logic that sets grains like
grains['hello'] = 'world'
grains['salt'] = 'stack'
return grains
salt '*' saltutil.sync_grains 同步grains到minion端
查看hello和salt的信息
在target中匹配minion
salt -G ‘roles:apache’ cmd.run hostname
-G 'roles:apache’可以匹配为server2 (由于在上面的设置)
命令显示结果为 在远程执行获取server2的hostname名
在top文件中匹配
vim /srv/salt/top.sls
base:
'roles:apache':
- match: grain
- apache
'roles:nginx':
- match: grain
- nginx.service
上图文件内容大致为 roles匹配到apache时,执行apache 匹配到nginx时,执行nginx.service
salt '*' state.highstate ###state.highstate 这个是全局的所有的环境的所有的状态生效
pillar简介
pillar和grains一样也是一个数据系统,但是应用场景不同。
pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。
pillar更加适合在配置管理中运用。
定义pillar基础目录
编辑master配置文件(默认base是/srv/pillar)
如果你不想修改 可以忽略下面这步操作
vim /etc/salt/master
mkdir /srv/pillar
systemctl restart salt-master.service
vim /srv/pillar/pkgs.sls
{% if grains['fqdn'] == 'server2' %}
package: httpd
{% elif grains['fqdn'] == 'server3' %}
package: nginx
{% endif %}
vim top.sls
base:
'*':
- pkgs
如果grains的fqdn信息为server2 则pillar下package的信息为httpd
如果grains的fqdn信息为server3 则pillar下package的信息为nginx
调用pkgs.sls
salt '*' saltutil.refresh_pillar #刷新pillar数据
salt '*' pillar.items #查询pillar数据
远程执行pillar下package信息为httpd的主机运行hostname
salt -I ‘package:httpd’ cmd.run hostname
Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。
通过jinja模板可以为不同服务器定义各自的变量。
两种分隔符: {% … %} 和 {{ … }},前者用于执行诸如 for 循环 或赋值的语句,后者把表达式的结果打印到模板上。
修改之前的 /srv/pillar/pkgs.sls
如果grains的fqdn信息为server2 则pillar下package的信息为httpd port的信息为80
如果grains的fqdn信息为server3 则pillar下package的信息为httpd port的信息为8080
vim /srv/pillar/pkgs.sls
{% if grains['fqdn'] == 'server2' %}
package: httpd
port: 80
{% elif grains['fqdn'] == 'server3' %}
package: httpd
port: 8080
{% endif %}
修改之前apache目录下的init.sls文件
vim /srv/salt/apache/init.sls
- {{ pillar['package'] }}
填入pillar的package信息
http_port: {{ pillar['port'] }}
填入pillar的port信息
http_host: {{ grains['ipv4'][-1] }}
填入grains的ipv4的最后一条信息
apache:
pkg.installed:
- pkgs:
- {{ pillar[‘package’] }}
service.running:
- name: httpd
- enable: true
- reload: true
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf
- template: jinja
- context:
http_port: {{ pillar['port'] }}
http_host: {{ grains['ipv4'][-1] }}
下载httpd后的同步的httpd.conf模板格式
vim /srv/salt/apache/httpd.conf
Listen {{ http_host }}:{{ http_port }}