salt的初步使用
salt需要配置master和minion
首先将salt的所有rpm包放到本地做一个yum源方便安装
yum源:
[salt]
name=salt
baseurl=file:///root/rhel6/
gpgcheck=0
安装:
yum install -y salt-master
yum install -y salt-minion
注:master和minion需要时间同步和解析 iptables selinux关闭
minion端只需要配置指向master端即可实现
启动,master minion master端需要认证
查看maser的minion
salt-key -L
通过minion的认证
salt-key -A #通过所有的minion --help
测试minion端是否可以连接
salt server2 test.ping #调用test模块
如果minion可以连接即可实现master端直接查看minion端信息:
salt server2 cmd.run hostname
salt server2 cmd.run df
salt server2 cmd.run 'ip addr'
lsof软件可以查看连接信息(通过监听端口的方式)
master:
lsof -i :4505
lsof -i :4506
minion:
lsof -i :随机 #需要使用查看端口命令找到 netstat -antlp
注:ZMQ 拓扑
若minion端主机名发生变化,需要删除/etc/salt/minion_id 文件 重新认证
tree命令查看拓扑图
/var/cache tree master/ #查看master或者minion端拓扑图
/etc/salt tree pki/ #查看pki/拓扑图
master:
/etc/salt/pki/master/minions
md5sum server2 #查看minion唯一信息
minion:
/etc/salt/pki/minion/
md5sum minion.pub #查看minion唯一信息,与master端相同
salt使用YAML语法写sls文件
salt使用YAML语法基本规则
- 缩进:YAML使用一个固定的缩进风格表示数据层结构关系。Salt需要每个缩进级别由两个空格组成。不要使用tabs。
冒号:Python的字典当然理所当然是简单的键值对。其他语言的用户应该知道这个数据类型叫哈希表或者关联数组。字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。Values的表现形式冒号下面的每一行,用一个空格隔开: my_key: my_value 另一种选择,一个value可以通过缩进与key联接:
my_key:
my_value短横杠:想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一列表的一部分。
list_value_one
list_value_two
list_value_three
接下来写一个简单的sls文件,推送httpd服务
首先,开启master端的base路径,所有的sls文件都是在base路径下实现
vim /etc/salt/master
file_roots:
base:
- /srv/salt
修改完配置文件都需要重启生效
注:切忌salt的配置文件也需要使用YAML语法
mkdir /srv/salt
mkdir httpd
/srv/salt/httpd/:
vim install.sls
apache-install:
pkg.installed:
- pkgs:
- httpd
service.running:
- name: httpd
- enable: True
- reload: True
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://httpd/files/httpd.conf
- user: root
- group: root
- mode: 644
- require:
- pkg: apache-install
vim service.sls
include:
- httpd.install
apache:
service.running:
- name: httpd
- enable: True
- reload: True
- watch:
- file: /etc/httpd/conf/httpd.conf
files目录里放配置文件及其他文件如启动脚本
install.sls 是安装文件
service.sls 是服务文件
httpd相对简单的服务通过系统yum源安装
通过salt命令实现推送:
salt server2 state.sls httpd.service #指定minion,调用state模块,服务名,服务文件
注:salt 命令可以搭配使用通配符使推送更加有效
可以看出占用空间很小
du -h install.sls
推送nginx
nginx通过安装第三方rpm包来实现,同时有依赖性的存在
/srv/salt/
mkdir nginx
vim install.sls
include:
- pkgs.nginx
nginx-install:
file.managed:
- name: /mnt/nginx-1.12.0.tar.gz
- source: salt://nginx/files/nginx-1.12.0.tar.gz
cmd.run:
- name: cd /mnt && tar zxf nginx-1.12.0.tar.gz && cd nginx-1.12.0 && sed -i.bak 's/#define NGINX_VER "nginx\/" NGINX_VERSION/#define NGINX_VER "nginx"/g' src/core/nginx.h && sed -i.bak 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio &> /dev/null && make &> /dev/null && make install &> /dev/null
- create: /usr/local/nginx
vim service.sls
include:
- nginx.install
- users.nginx
/etc/init.d/nginx:
file.managed:
- source: salt://nginx/files/nginx
- mode: 755
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
nginx-service:
service.running:
- name: nginx
- enable: True
- reload: True
- watch:
- file: /usr/local/nginx/conf/nginx.conf
files目录下放 的是nginx的配置文件,rpm包以及nginx的启动脚本
由于nginx需要用户及依赖性所以在base路径下配置对应的sls文件较为方便
同样files目录下可以存放依赖性的rpm包
/srv/salt/pkgs/
vim nginx.sls
make:
pkg.installed:
- pkgs:
- gcc
- pcre-devel
- openssl-devel
- zlib-devel
/srv/salt/users/
vim nginx.sls
nginx-group:
group.present:
- name: nginx
- gid: 800
nginx-user:
user.present:
- name: nginx
- uid: 800
- gid: 800
- shell: /sbin/nologin
salt server2 state.sls nginx.service
成功
yum provides */netstat yum包寻找
管理一键部署top文件 ,直接在base路径下
/srv/salt/
vim top.sls
base:
'server2':
- httpd.service
'server3':
- nginx.service
此时部署的命令为:
salt '*' state.highstate #*代表所有minion端,调用state模块
推送负载均衡haproxy:(安装系统yum自带的haproxy)
/srv/salt/
mkdir haproxy
minion端配置yum源:
vim install.sls
haproxy-install:
pkg.installed:
- pkgs:
- haproxy
file.managed:
- name: /etc/haproxy/haproxy.cfg
- source: salt://haproxy/files/haproxy.cfg
service.running:
- name: haproxy
- reload: True
- watch:
- file: haproxy-install
管理用户组:
/srv/salt/users/
vim haproxy.sls
haproxy-group:
group.present:
- name: haproxy
- gid: 200
haproxy-user:
user.present:
- name: haproxy
- uid: 200
- gid: 200
- shell: /sbin/nologin
salt server2 state.sls haproxy.install
利用这三个可基本实现一个负载均衡
vim top.sls
base:
'server1':
- haproxy.install
'server2':
- nginx.service
'server3':
- httpd.service
salt '*' state.highstate
实现:
grains
查看grains信息
salt server2 grains.items #server2 的所有信息
salt server2 grains.item os #os 信息
salt server2 grains.item ipv4 #ip信息
salt server2 grains.item fqdn #主机名信息
salt -G 'os:RedHat' test.ping #可以通过grains筛选minion端
设置grains的三种方式:
1.minion端修改配置文件
vim /etc/salt/minion
grains:
roles:
- haha
重启monion端,即可设置成功
salt server2 grains.item roles #查看刚刚设置信息
salt -G 'roles:haha' test.ping
2.minion端/etc/salt/下直接写grains配置文件,然后master端同步
/etc/salt/
vim grains
roles: nginx
westos: linux
同步命令:
salt server3 saltutil.sync_grains
3.只在master端操作
base路径下创建_grains目录编写py文件
/srv/salt/_grains
vim my_grains.py
#!/usr/bin/env python
def my_grains():
grains = {}
grains['hello'] = 'world'
grains['salt'] = 'saltstack'
return grains
master同步:
salt server3 saltutil.sync_grains
minion端查看文件以同步
grains应用到top文件中
/srv/salt/
vim top.sls
base:
'roles:httpd':
- match: grain
- httpd.service
pillar
master端开启pillar
/etc/salt/
vim master
pillar_roots:
base:
- /srv/pillar
重启master
mkdir /srv/pillar/
简单的pillar模版
/srv/pillar/
mkdir web
/srv/pillar/web
vim apache.sls
{% if grains['fqdn'] == 'server2' %}
apache: httpd
{% elif grains['fqdn'] == 'server3' %}
apache: nginx
{% endif %}
/srv/pillar/
vim top.sls
base:
'*':
- web.apache
更新pillar
salt server[2,3] saltutil.refresh_pillar
通过pillar筛选:
salt -I 'apache:httpd' test.ping
salt -I 'apache:nginx' test.ping
通过网段ip筛选:
salt -S 172.25.40.0/24 test.ping
jinja模版
可以用来定义修改指定文件任意内容
httpd服务为例:
修改他的配置文件:
vim install.sls
apache-install:
pkg.installed:
- pkgs:
- httpd
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://httpd/files/httpd.conf
- template: jinja
- context:
bind: 172.25.40.3
port: 8080
在它的配置文件中写入:
Listen {{bind}}:{{port}}
重新推送:
salt server3 state.sls httpd.service
利用pillar实现:
/srv/pollar/
vim web/apache.sls
{% if grains['fqdn'] == 'server2' %}
apache: httpd
{% elif grains['fqdn'] == 'server3' %}
apache: nginx
bind: 172.25.40.3
port: 80
{% endif %}
/srv/salt/httpd/
vim install.sls
apache-install:
pkg.installed:
- pkgs:
- httpd
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://httpd/files/httpd.conf
- template: jinja
- context:
bind: {{pillar['bind']}}
port: {{pillar['port']}}
配置文件匹配条件修改:
Listen {{pillar['bind']}}:{{pillar['port']}}
推送:
salt server3 state.sls httpd.service
lib文件
举例:
在httpd的files目录下写入lib.sls文件
{% set port = 8080 %}
install.sls文件中pillar模版注释
在httpd配置文件开头写:
{% from 'httpd/files/lib.sls' import test with context %}
推送即可
或者直接配置文件修改:
Listen {{grains['ipv4'][1]}}:80