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
可以用来定义修改指定文件任意内容
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']}}
配置文件匹配条件修改:
推送:
salt server3 state.sls httpd.service