1.saltstack(C/S架构)安装与配置
1.1 master端安装
本机配置的是红帽7对应的saltstack ,使用的python2。
[root@server1 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-3000.el7.noarch.rpm ##配置仓库,官方源
[root@server1 ~]# yum install https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm ##阿里源
[root@server1 ~]# yum install salt-master.noarch -y ##安装master端
[root@server1 ~]# systemctl enable --now salt-master.service ##设置开机启动
[root@server1 ~]# netstat -antlp ##查看4505 4506端口
实验环境使用纯净的虚拟机,以免发生冲突!!!(新建一个虚拟机)
1.2 一主两从的搭建
## 一主就是1.1安装的master
## 下面设置俩从
## server1操作
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# ls
redhat.repo rhel7.6.repo salt-3000.repo
[root@server1 yum.repos.d]# scp salt-3000.repo server2:/etc/yum.repos.d/
[root@server1 yum.repos.d]# scp salt-3000.repo server3:/etc/yum.repos.d/ ##发送仓库文件到server2.3
## server2和3操作,修改仓库文件,gpgcheck=0(server2和server3一样的操作,只做server2)
[root@server2 ~]# yum list salt-*
[root@server2 ~]# yum install -y salt-minion.noarch
[root@server2 ~]# cd /etc/salt/
[root@server2 salt]# ls
cloud cloud.maps.d master minion.d proxy.d
cloud.conf.d cloud.profiles.d master.d pki roster
cloud.deploy.d cloud.providers.d minion proxy
## master 和minion文件都有,但是只需要编辑minion文件即可
[root@server2 salt]# vim minion
## 编辑内容 16行 master: 172.25.13.1
[root@server2 salt]# systemctl enable --now salt-minion.service
## master端执行命令允许minion连接:
netstat -antlp ##查看端口是否和4505连接
salt-key --help
salt-key -L ##查看accept状态
salt-key -A ##建立连接
salt-key -L ##查看accept状态
netstat -antlp ##查看状态
yum install lsof -y
lsof -i :4505
##一些基本的测试内容
[root@server1 ~]# salt '*' test.ping
server3:
True
server2:
True
[root@server1 ~]# salt '*' cmd.run hostname
server3:
server3
server2:
server2
[root@server1 ~]# salt '*' cmd.run "ip addr show eth0"
显示内容不写了
测试链接成功与否
看到链接的是4506端口,不对
添加server3
salt的一些基本命令,和ansible -m 差不多
1.3 查看salt master进程的详细信息
[root@server1 ~]# yum install python-setproctitle.x86_64 -y
[root@server1 ~]# systemctl restart salt-master.service
[root@server1 ~]# ps ax
1.4 minion_id的状态
[root@server2 salt]# cd /etc/salt/
[root@server2 salt]# ls
cloud cloud.maps.d master minion.d proxy
cloud.conf.d cloud.profiles.d master.d minion_id proxy.d
cloud.deploy.d cloud.providers.d minion pki roster
[root@server2 salt]# cat minion_id ##相当于主机名,如果修改了主机名,这个文件需要删除,才可以再次生效。
server2[root@server2 salt]#
2. saltstack远程执行
2.1 命令行形式
- 远程执行shell命令(类似于ansible 远程执行)
- Salt命令由三个主要部分构成:
salt '<target>' <function> [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 #查看模块文档
# salt 'server2' pkg.install httpd
# salt 'server2' pkg.remove httpd
salt内置的执行模块列表:
http://docs.saltstack.cn/ref/modules/all/index.html
[root@server1 ~]# salt 'server2' sys.doc pkg | grep pkg.install ##sys.doc 是查看帮助的命令
[root@server1 ~]# salt server2 pkg.install httpd ##远程安装httpd
[root@server1 ~]# salt server2 cmd.run 'rpm -q httpd' ## 通过cmd.run命令查看http安装成功与否
[root@server1 ~]# salt 'server2' service.start httpd ##服务模块
## 测试cp模块
[root@server1 ~]# vim index.html
[root@server1 ~]# cat index.html
server2
[root@server1 ~]# salt-cp server2 index.html /var/www/html
server2:
----------
/var/www/html/index.html:
True
[root@server1 ~]# salt server2 file.stats /var/www/html ##将server1上的index.html复制到server2上并查看状态
[root@server1 ~]# curl server2
server2
2.2 脚本文件形式
- 了解YAML语法
- 规则一: 缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs。
规则二: 冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
my_key: my_value
规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。
- list_value_one
- list_value_two
- 配置管理
- 创建一个sls文件:(文件书写格式)
# vim /srv/salt/apache.sls
httpd: # ID声明
pkg: # 状态声明
- installed # 函数声明
指定主机执行:
# salt server2 state.sls apache
- 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.
2.2.1 脚本文件的默认书写位置
[root@server1 ~]# cd /etc/salt/
[root@server1 salt]# ls
cloud cloud.maps.d master minion.d proxy.d
cloud.conf.d cloud.profiles.d master.d pki roster
cloud.deploy.d cloud.providers.d minion proxy
[root@server1 salt]# vim master
## 默认目录需要自己新建
[root@server1 srv]# pwd
/srv
[root@server1 srv]# mkdir salt ##建立默认目录
[root@server1 srv]# cd salt/
[root@server1 salt]# ls
[root@server1 salt]# mkdir apache ## 创建模块目录
[root@server1 salt]# cd apache/ ##每一个脚本文件,建立一个目录,方便管理
2.2.2 书写脚本文件例子
[root@server1 ~]# mv index.html /srv/salt/apache/ 移动刚才的测试文件到目录下
[root@server1 ~]# cd /srv/salt/apache/
[root@server1 apache]# ls
index.html
[root@server1 apache]# vim install.sls ##脚本文件以sls结尾
## 书写脚本不可以使用tab,必须是俩个空格
模块参考过程
实验
[root@server1 ~]# mv index.html /srv/salt/apache/
[root@server1 ~]# cd /srv/salt/apache/
[root@server1 apache]# ls
index.html
[root@server1 apache]# vim install.sls
[root@server1 apache]# cat install.sls
apache:
pkg.installed: ##模块
- pkgs:
- httpd
- php
- php-mysql
file.managed: ##模块
- source: salt://apache/index.html
- name: /var/www/html/index.html
service.running: ##模块
- name: httpd
[root@server1 apache]# salt server2 state.sls apache.install ##远程执行,执行不需要必须在salt目录,任何位置都可以执行
查看server2看看是不是执行成功,文件是否传送成功
[root@server2 salt]# cd /var/cache/salt/minion/
accumulator/ extmods/ files/ proc/
[root@server2 salt]# cd /var/cache/salt/minion/files/
[root@server2 files]# ls
base
[root@server2 files]# cd base/apache/
[root@server2 apache]# ls
index.html install.sls
[root@server2 apache]# md5sum index.html ##看是不是和md5码是否和server1上的一致
测试
2.3 编写远程执行模块
- 创建模块目录:
# mkdir /srv/salt/_modules
编写模块文件:
# vim /srv/salt/_modules/mydisk.py
def df():
return __salt__['cmd.run']('df -h')
同步模块:
# salt server2 saltutil.sync_modules
- 运行模块:
# salt server2 mydisk.df
3. grains
- grains简介
- Grains是SaltStack的一个组件,存放在SaltStack的minion端。
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
由于grains是静态数据,因此不推荐经常去修改它。
应用场景:
信息查询,可用作CMDB。
在target中使用,匹配minion。
在state系统中使用,配置管理模块。
3.1 信息查询
- 信息查询
- 用于查询minion端的IP、FQDN等信息。
默认可用的grains:
# salt '*' grains.ls
- 查看每一项的值:
# salt '*' grains.items
- 取单项的值:
# salt server3 grains.item ipv4
# salt server3 grains.item fqdn ##主机名
3.2 自定义grains项
3.2.1 server2上定义roles
- 在/etc/salt/minion中定义:
# vim /etc/salt/minion #直接修改配置文件
grains:
roles:
- apache
重启salt-minion,否则数据不会更新:
# systemctl restart salt-minion
3.2.2 server3上使用grains文件定义roles
- 在/etc/salt/grains中定义:(server3上)
# vim /etc/salt/grains:
roles:
- nginx
同步数据:(server1)
# salt server3 saltutil.sync_grains
查询自定义项:(server1)
# salt server3 grains.item roles
3.3 编写grains模块
- 在salt-master端创建_grains目录:
# mkdir /srv/salt/_grains
# vim /srv/salt/_grains/my_grain.py
def my_grain():
grains = {}
grains['salt'] = 'stack'
grains['hello'] = 'world'
return grains
# salt '*' saltutil.sync_grains #同步grains到minion端
3.4 grains匹配运用
- 在target中匹配minion:
# salt -G roles:apache test.ping
- 在top文件中匹配:
# vim /srv/salt/top.sls
base:
'roles:apache':
- match: grain
- apache.install
3.4.1 在target中匹配minion
3.4.2 在top文件中匹配
分别在server2和server3上配置apache和nginx
编写top文件
执行top文件
4. server3部署nginx小实验
- top文件
- server2部署apache
- server3部署nginx
vim init.sls ##负责初始化文件
vim install.sls ##负责安装
salt '*' state.highstate ##执行top脚本
## cat 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
## cat 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
5. Jinja模板
5.1 Jinja模板使用方式
- Jinja最基本的用法是使用控制结构包装条件:
# vim /srv/salt/test.sls
/mnt/testfile:
file.append:
{% if grains['fqdn'] == 'server2' %}
- text: server2
{% elif grains['fqdn'] == 'server3' %}
- text: server3
{% endif %}
grains可以查看很多item
- Jinja在普通文件的使用:
# vim /srv/salt/init.sls、
/var/www/html/index.html:
file.managed:
- source: salt://apache/files/index.html
- template: jinja ##必须写的,核心步骤
- context:
NAME: test
[root@server1 apache]# cat init.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: /etc/httpd/conf/httpd.conf
#/etc/httpd/conf/httpd.conf:
# file.managed:
# - source: salt://apache/files/httpd.conf
/var/www/html/index.html:
file.managed:
- source: salt://apache/files/index.html
- template: jinja
- context:
NAME: test
[root@server1 apache]# ls
files init.sls
[root@server1 apache]# cd files/
[root@server1 files]# ls
httpd.conf index.html
[root@server1 files]# vim index.html
[root@server1 files]# cat index.html
{{ NAME }} ##引用变量
[root@server1 files]# salt server2 state.sls apache
测试
小实验1:引用变量
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.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: /etc/httpd/conf/httpd.conf
#/etc/httpd/conf/httpd.conf:
# file.managed:
# - source: salt://apache/files/httpd.conf
/var/www/html/index.html:
file.managed:
- source: salt://apache/files/index.html
- template: jinja
# - context:
# NAME: test
[root@server1 files]# pwd
/srv/salt/apache/files
[root@server1 files]# cat index.html
{{ grains['os'] }} - {{ grains['fqdn'] }}
[root@server1 files]# salt server2 state.sls apache
小实验2