saltstacksaltstack自动化运维(master与minion配置远程执行sls文件modulesgrainsjinjapillar)
Posted dezasseis
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了saltstacksaltstack自动化运维(master与minion配置远程执行sls文件modulesgrainsjinjapillar)相关的知识,希望对你有一定的参考价值。
一、saltstack简介
模块-官网文档:http://docs.saltstack.cn/ref/modules/all/index.html#all-salt-modules
saltstack简介
- saltstack是一个配置管理系统,能够维护预定义状态的远程节点。
- saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
- saltstack是运维人员提高工作效率、规范业务配置与操作的利器。
saltstack通信机制
-
SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口。
-
Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口(请求响应端口)。
特点
- 基于python开发的C/S架构配置管理工具
- 底层使用ZeroMQ消息队列pub/sub方式通信
- 使用SSL证书签发的方式进行认证管理,传输采用AES加密
服务架构
- 服务器端:Master
- 客户端:Minion
功能
- 远程执行
- 配置管理/状态管理
- 云管理(cloud)
- 事件驱动
运行方式
- local本地运行
- Master/Minion传统方式
- Syndic分布式
- Salt ssh
配置文件
- /etc/salt/master:主控端(控制端)配置文件
- /etc/salt/minion:受控端配置文件
二、安装与配置
master端:
server1:172.25.2.1
minion端:
server2:172.25.2.2
server3:172.25.2.3
01_minion端配置
- 配置软件仓库
vim /etc/yum.repos.d/salt-3000.repo
[salt-3000]
name=SaltStack 3000 Release Channel for Python 2 RHEL/Centos $releasever
baseurl=https://mirrors.aliyun.com/saltstack/yum/redhat/7/$basearch/3000
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key, file:///etc/pki/rpm-gpg/centos7-signing-key
- 安装salt-minion
yum install -y salt-minion
- 设置对应的master端
vim /etc/salt/minion
16 master: 172.25.2.1
- 开启服务
systemctl enable --now salt-minion
- 每次修改主机名后,都要删除
/etc/salt/minion_id
此文件,并修改解析
02_master端配置
- 配置软件仓库
yum install https://repo.saltstack.com/yum/redhat/salt-repo-3000.el7.noarch.rpm
sed -i "s/repo.saltstack.com/mirrors.aliyun.com\\/saltstack/g" /etc/yum.repos.d/salt-3000.repo
- 查看仓库文件
cat /etc/yum.repos.d/salt-3000.repo
[salt-3000]
name=SaltStack 3000 Release Channel for Python 2 RHEL/Centos $releasever
baseurl=https://mirrors.aliyun.com/saltstack/yum/redhat/7/$basearch/3000
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key, file:///etc/pki/rpm-gpg/centos7-signing-key
- 安装salt-master
yum install -y salt-master
- 开启服务
systemctl enable --now salt-master
- 认证
salt-key -A
:接受所有minion等待认证的key
salt-key -L
:列出所有公钥信息
-a minion#接受指定minion等待认证的key
-r minion#拒绝指定minion等待认证的key
-R#拒绝所有minion等待认证的key
03_远程测试
- 查看端口及进程
yum install -y lsof
#可以显示监听端口详细信息
yum install -y python-setproctitle
#可以显示进程详细信息
systemctl restart salt-master.service
- 测试
salt '*' test.ping
salt '*' cmd.run hostname
salt '*' cmd.run 'uname -a'
三、远程执行shell命令
salt '*' cmd.run 'uname -a'
:查看内核相关内容
salt 'server2' sys.doc pkg
:查看模块文档
salt 'server2' pkg.install httpd
:安装apache
salt 'server2' pkg.remove httpd
:卸载apache
http://docs.saltstack.cn/ref/modules/all/index.html
salt 'server2' sys.doc pkg
:查看模块文档
- 测试httpd
#安装httpd
salt server2 pkg.install httpd
#列出安装包
salt server2 cmd.run 'rpm -q httpd'
##开启服务
salt server2 service.start httpd
- 复制文件
echo server2 > index.html
salt-cp server2 index.html /var/www/html/
四、编写.sls文件
- 规则一: 缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs。 - 规则二: 冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
my_key: my_value - 规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。
list_value_one
list_value_two
mkdir -p /srv/salt/apache/files
mv index.html /srv/salt/apache/files
01_安装单个软件包
方法一:
vim /srv/salt/apache/install.sls
httpd:
pkg.installed
salt server2 state.sls apache.install
方法二:
vim /srv/salt/apache/install.sls
apache:
pkg.installed:
- name: httpd
salt server2 state.sls apache.install
02_安装多个软件包
vim /srv/salt/apache/install.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
salt server2 state.sls apache.install
03_文件管理
vim /srv/salt/apache/install.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- source: salt://apache/files/index.html
- name: /var/www/html/index.html
salt server2 state.sls apache.install
- 改变发布测试页内容
vim /srv/salt/apache/files/index.html
server2
server2
server2
salt server2 state.sls apache.install
发生变化
04_服务管理
整合方法:
vim /srv/salt/apache/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
salt server2 state.sls apache.install
分开方法
vim /srv/salt/apache/install.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
/var/www/html/index.html:
file.managed:
- source: salt://apache/files/index.html
httpd:
service.running
salt server2 state.sls apache.install
- 修改端口
方法一:
cp /etc/httpd/conf/httpd.conf apache/files/
:复制模板文件
vim apache/files/httpd.conf
:修改端口检测
vim /srv/salt/apache/install.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
file.managed:
- source: salt://apache/files/index.html
- name: /var/www/html/index.html
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/files/httpd.conf
salt server2 state.sls apache.install
server2 测试
方法二:
vim /srv/salt/apache/install.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
file.managed:
- source: salt://apache/files/httpd.conf
- name: /etc/httpd/conf/httpd.conf
service.running:
- name: httpd
- enable: true
- watch:
- file: apache
salt server2 state.sls apache.install
五、编写远程执行模块 _modules
mkdir /srv/salt/_modules
:创建模块目录vim _modules/mydisk.py
:编写模块
def df():
return __salt__['cmd.run']('df -h')
- salt server2 cmd.run df
salt server2 saltutil.sync_modules
:同步模块
- 同步后可在minion主机的 /var/cache/salt/minion/extmods/modules/ 查看到
六、grains配置(存放在minion端)
- Grains是SaltStack的一个组件,存放在SaltStack的minion端。
- 当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
- 由于grains是静态数据,因此不推荐经常去修改它。
应用场景:
- 信息查询,可用作CMDB。
- 在target中使用,匹配minion。
- 在state系统中使用,配置管理模块。
master端查看信息
#列出每一项
salt server2 grains.ls
#查看每一项的具体值
salt server2 grains.items
#查看单项的值
salt server2 grains.item ipv4
salt server2 grains.item fqdn
01_minion端添加grains
server2和server3方法均可适用
server2
- 编辑配置文件
vim /etc/salt/minion
129 grains:
130 roles:
131 - apache
- 重启服务
systemctl restart salt-minion
server3
- 编辑配置文件
vim /etc/salt/grains
129 grains:
130 roles:
131 - apache
- 同步server3数据
salt server3 saltutil.sync_grains
- 查询自定义项
02_编写grains模块
在server1
- 建立文件夹
mkdir /srv/salt/_grains
- 编辑grains模块
vim /srv/salt/_grains/mygrains.py
def my_grains():
grains = {}
grains['salt'] = 'stack'
grains['hello'] = 'world'
return grains
-
同步grains模块到minion端
salt '*' saltutil.sync_grains
-
列出grains
03_grains匹配运用
- 在target中匹配minion
salt -G roles:apache cmd.run hostname
salt -G roles:nginx test.ping
salt -G salt:stack test.ping
salt -G hello:world test.ping
- top.sls文件匹配
1 mkdir -p /srv/salt/nginx/files/
[root@server1 salt]# ls nginx/files/
nginx-1.18.0.tar.gz
2 vim /srv/salt/top.sls
base:
'roles:apache':
- match: grain
- apache
'roles:nginx':
- match: grain
- nginx
3 vim /srv/salt/nginx/init.sls
nginx:
file.managed:
- source: salt://nginx/files/nginx-1.18.0.tar.gz
- name: /mnt/nginx-1.18.0.tar.gz
4 salt '*' state.highstate
:读取所有环境的top.sls文件
七、nginx应用
cd /src/salt/
vim nginx/files/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.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
vim nginx/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
vim nginx/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
salt server3 state.sls nginx.install
scp server3:/usr/local/nginx/conf/nginx.conf nginx/files/
vim nginx/files/nginx.conf
user nginx;
salt server3 state.sls nginx
salt '*' state.highstate
八、jinja模板
- 定义:{% XXX %}
- 引用:{{ XXX }}
01_示例
vim test.sls
/mnt/testfile:
file.append:
{% if grains['fqdn'] == 'server2' %}
- text: server2
{% elif grains['fqdn'] == 'server3' %}
- text: server3
{% endif %}
salt '*' state.sls test
- 查看实验结果
02_apache结合jinja模板
cd /src/salt/
vim apache/init.sls
apache:
pkg.installed:
- pkgs:
- httpd
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] }}
vim apache/files/index.html
{{ grains['os'] }} - {{ grains['fqdn'] }}
{{ NAME }}
vim apache/files/httpd.conf
Listen {{ bind }}:{{ port }}
salt server2 state.sls apache
- 在minion端查看实验结果
九、pillar
01_pillar简介
- pillar和grains-样也是一个数据系统,但是应用场景不同。
- pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才
可以看到对应的信息。 - pillar更加适合在配置管理中运用
02_常用命令
- 刷新pillar数据
salt '*' saltutil.refresh_pillar
- 查询pillar数据
salt '*' pillar.items
salt '*' pillar.item XXX
- 数据匹配
salt -I XXX:XXX test.ping
03_定义pillar
- 创建pillar默认目录
mkdir /srv/pillar
- 自定义pillar项
vim /srv/pillar/package.sls
{% if grains['fqdn'] == 'server3' %}
package: httpd
{% elif grains['fqdn'] == 'server2' %}
package: mairadb
{% endif %}
vim /srv/pillar/top.sls
base:
'*':
- package
- 刷新pillar数据
salt '*' saltutil.refresh_pillar
- 查询pillar数据
salt '*' pillar.items
不刷新就可查询到
salt '*' pillar.item package
必须刷新才可查询
- 数据匹配
salt -I package:httpd test.ping
04_应用于apache
vim /srv/pillar/package.sls
{% if grains['fqdn'] == 'server3' %}
package: nginx
{% elif grains['fqdn'] == 'server2' %}
port: 8080
bind: 172.25.2.2
{% endif %}
vim /srv/salt/apache/init.sls
apache:
pkg.installed:
- pkgs:
- httpd
file.managed:
- source: salt://apache/files/httpd.conf
- name: /etc/httpd/conf/httpd.conf
- template: jinja
- context:
port: {{ pillar['port'] }}
bind: {{ pillar['bind'] }}
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] }}
vim /srv/salt/apache/files/httpd.conf
Listen {{ bind }}:{{ port }}
salt server2 state.sls apache
05_应用于jinja模板import导入变量
1 vim /srv/salt/apache/lib.sls
{% set port = 80 %}
2 vim /srv/salt/apache/files/httpd.conf
{% from 'apache/lib.sls' import port %}#做完实验删除
Listen {{ bind }}:{{ port }}
3 salt server2 state.sls apache
发现在/srv/pillar/package.sls
和 /srv/salt/apache/lib.sls
都定义了port变量,最后读取的才被使用,lib.sls的port80被使用
以上是关于saltstacksaltstack自动化运维(master与minion配置远程执行sls文件modulesgrainsjinjapillar)的主要内容,如果未能解决你的问题,请参考以下文章
自动化运维工具之SaltStack-1SaltStack介绍及安装