c4rt1y

saltsack基础大全

0x01 saltsack介绍

Saltstack是一个大型分布式的配置管理系统(安装升级卸载软件,检测环境),也是一个远程命令执行系统。saltstack的两大功能:远程执行和配置管理。 

0x02 环境介绍

#centos7服务器2台
master 10.10.10.20
slave  10.10.10.30

#两种方法设置host(每台对应每台的host地址)
echo "master" > /etc/hostname
hostname master

#设置host
cat >>/etc/hosts <<EOF 
10.10.10.20 master
10.10.10.30 slave
EOF	

#安装gcc和prel
yum -y install epel-release

#关闭firewalld
systemctl stop firewalld.service
systemctl disable firewalld.service

#关闭selinux
sed -i 's:SELINUX=enforcing:SELINUX=disabled:g' /etc/selinux/config

#重新启动电脑,使用setenforce 0无效
reboot

0x03 环境搭建

##master上安装(由于之开启了两台,所以同时安装了子节点)
yum install salt-master salt-minion -y

#使用sed修改内容
sed -i '/#master: salt/a\master: master'  /etc/salt/minion
sed -i '/#id:/a\id: slave'  /etc/salt/minion

#修改配置文件如下
vi /etc/salt/minion
master: master
id: slave

#启动master和salve
systemctl start salt-master.service
systemctl start salt-minion.service


#slave上安装
yum install  salt-minion -y

#使用sed修改内容
sed -i '/#master: salt/a\master: master'  /etc/salt/minion
sed -i '/#id:/a\id: slave'  /etc/salt/minion

#修改配置文件如下
vi /etc/salt/minion
master: master
id: slave

#启动salve
systemctl start salt-minion.service


##master上
#查看服务器情况,可以添加服务器信息等
salt-key -L    
#添加服务器 -a代表 选择加入master组  -A 全部加入master组
salt-key -a slave
salt-key -A

#测试
salt '*' test.ping
#发现返回两个True,代表测试OK成功

0x04 saltstack函数

##master操作
#查看所有支持函数
salt 'salve' sys.list_modules
#查看函数
salt 'salve' sys.list_functions test

#查看函数帮助文档
salt 'salve' sys.doc test.echo

#ping测试
salt '*' test.ping
#远程执行命令
salt '*' cmd.run 'uptime'
#安装
salt '*' pkg.installed

#概要模式
salt --summary  '*' cmd.run 'uptime'
#以JSON数据显示
salt --out=json '*' cmd.run 'uptime'
#以yaml数据显示
salt --out=yaml '*' cmd.run 'uptime'
#还有其他的比如raw、nested、quiet


目标
*	任意多个字符
?	任意一个字符
[]  字符集
E   正则
L   列出
N   组
G   Grains
P   Pillar

#1.远程管理
salt 'salve' cmd.run 'w'


#2.远程安装
#安装httpd
salt 'salve' pkg.install 'httpd'
#查看httpd版本
salt 'salve' pkg.version 'httpd'
#查看httpd版本
salt 'salve' pkg.remove 'httpd'

#3.服务管理
#查看启动状态
salt 'salve' service.status httpd
#启动httpd
salt 'salve' service.start httpd
#暂停httpd
salt 'salve' service.stop httpd
#重启httpd
salt 'salve' service.restop httpd


#4.文件管理
#查看文件状态
salt 'salve' file.stats /etc/yum.conf
#查看文件状态
salt 'salve' file.chown /etc/passwd root root

#5.用户管理
#添加用户
salt 'salve' user.add name <uid> <gid> <groups> <home> <shell>
salt 'salve' user.add mysql

#查看用户信息
salt 'salve' user.info mysql

#删除用户
salt 'salve' user.delete mysql

0x05 Grains和Pillar函数使用

##master上使用state部署(注意必须采取的是2个空格)
vi /etc/salt/master
file_roots
  base:
    - /srv/salt

#重启
systemctl restart salt-master.service


##Grains使用
#获取操作系统类型
salt  'salve' grains.item os
#ping操作系统是Centos的
salt -G 'os:Centos' test.ping
#获取操作系统类型的版本
salt  'salve' grains.item osrelease
#ping操作系统类型版本是7
salt -G 'osrelease:7.*' test.ping
#操作系统centos上执行w命令
salt -G os:Centos cmd.run 'w'

#获取当前存在的可使用的所有grains的函数和用法
salt '*' grains.items

#grains也可以自定义设置变量,如下
#方法一
#字符串
salt 'salve' grains.setval hello 'nihao'
#数组
salt 'salve' grains.setval hellos ['1','2','3']

#方法二(master)
mkdir -pv /srv/salt/_grains/
vi /srv/salt/_grains/my_grains_test.py
def hello1():
  grains = {}
  grains['hello1'] = 'hello1'
  return grains

salt  '*' saltutil.sync_modules
salt  '*' sys.reload_module
现在查看
salt 'salve' grains.item hello1,则出现了

另一种是在(minion)
cat /etc/salt/grains 增加



#读取变量
salt 'salve' grains.item hellos
salt 'salve' grains.get hellos

#删除
salt 'salve' grains.delval
或者
cat /etc/salt/grains 里面删除
rm -rf /etc/salt/grains

#由于Grains是全局变量,每个函数里面取值不一样可能是唯一区别,但是我们想将内容直接去分化,所以可以采取Pillar自定义变量,从而可以进行区分,主要作用是ACL
#Pillar使用

#这一步可开课不开
grep '^[a-Z]' /etc/salt/master
pillar_opts: True


#设置pillar路径(注意必须采取的是2个空格)
/etc/salt/master
pillar_roots:
  base:
    - /srv/pillar
systemctl restart salt-master.service

mkdir -pv /srv/pillar

0x06 Grains和Pillar实战演示

##Grains实战
#第一次内容
#创建一个apache.sls [文件格式必须是sls结尾]
vi /srv/salt/apache.sls
apache-install: 			#名字
  pkg.installed:			#安装软件
    - names:				#软件名字
      - httpd 				
      - httpd-devel

#安装
salt '*' state.sls apache
#卸载
salt '*' pkg.remove httpd


#第二次内容
#创建一个apache.sls [文件格式必须是sls结尾]
vi /srv/salt/apache.sls
apache-install: 			#名字
  pkg.installed:			#安装软件
    - names:				#软件名字
      - httpd 				
      - httpd-devel


apache-service:      		#名字
  service.running 			#启动软件
    - name: httpd 			#启动的软件名字
    - enable: True  		#启动为真
    - reload: True  		#重新载入为真
    - require:  			#需求,必须是apache-install存在,才可以进入这一步
      - pkg: apache-install

#安装
salt '*' state.sls apache
#卸载
salt '*' pkg.remove httpd


第三次内容
#创建一个apache.sls [文件格式必须是sls结尾]
vi /srv/salt/apache.sls
apache_install: 			#名字
  pkg.installed: 			#启动软件
    - name: httpd 			#启动的软件名字

apache.service:				#名字
  service.running: 			#启动软件
    - name: httpd 			#启动的软件名字
    - enable: True 		 	#启动为真
    - reload: True 			#重新载入为真
    - require:  			#需求,必须是apache-install存在,才可以进入这一步
      - pkg: apache_install
    - watch: 				#必须先执行httpd_conf,才进去apache.service
      - file: httpd_conf

httpd_conf:
  file.managed:  			#文件管理
    - name: /etc/httpd/conf/httpd.conf   	#必须存在该文件
    - source: salt://httpd.conf 		 	#这里的路径是file_roots的base设置的路径
    - user: root   							#执行移动权限的用户是root
    - group: root 							#执行移动权限的组是root
    - mode: 600 							#该文件的权限



#安装
salt '*' state.sls apache
#卸载
salt '*' pkg.remove httpd


#Pillar演示
#创建一个
vi /srv/pillar/master.sls
private_key:master

vi /srv/pillar/slave.sls
private_key:slave

vi /srv/pillar/top.sls
base:
  'master':
    - master
  'slave':
    - slave

salt '*' saltutil.refresh_pillar

0x07 jinja2模板学习

#各种变量
vi /srv/salt/jinja/var.sls 
{% set var = 'hello world!' %}
{% set list = [1,2,3]] %}
{% set dict = {1:'a',2:'b',3:'c'} %}
test_var:
  cmd.run:
    - name: echo "var is {{ var }},list is {{ list[0] }},dict is {{ dict[0] }}"

salt '*' state.sls jinja/var 

#循环
#for
{% set lists = [1,2,3] %}
{% for list in lists %}
{{ list }}
{% endfor %}

vi /srv/salt/jinja/for.sls 
{% set lists = [1,2,3] %}
{% for list in lists %} 
test_var{{ list }}:
  cmd.run:
    - name: echo list is {{ list }}
{% endfor %}

salt '*' state.sls jinja/for 


#dict字典
{% set dict = {1:'a',2:'b',3:'c'} %}
{% for key,value in dict%}
{{ key }}
{{ value }}
{% endfor %}


#if 判断语句
vi /srv/salt/jinja/if.sls 
{% set id = 3 %}
{% if id>3 %}
    {% set id = 10 %}
{% elif id<3 %}
    {% set id = 0 %}
{% else %}
    {% set id = 3 %}
{% endif %}
test_var:
  cmd.run:
    - name: echo id is {{ id }}


salt '*' state.sls jinja/if 



vi /srv/salt/jinja/if1.sls 
{% set id = 3 %}
test_var:
  cmd.run:
{% if id>3 %}
    - name: echo id is 10
{% elif id<3 %}
    - name: echo id is 0
{% elseif %}
    - name: echo id is 3
{% endif %}

salt '*' state.sls jinja/if1

#实战演示1
vi /srv/salt/jinja/var.sls 
{% set var = 'hello world!' %}
test_var:
  cmd.run:
    - name: echo "var is {{ var }}"


salt '*' state.sls jinja/var 


#实战演示2
vi /srv/salt/template.sls 
template_test:
  file.managed:
    - source: salt://test.j2
    - name: /tmp/test.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja


vi /srv/salt/test.j2 
cpu_num = {{ grains['num_cpus'] }}
mem_total = {{ grains['mem_total'] }}
hostname = {{ grains['host'] }}


vi /srv/salt/top.sls
base:
  '*':
    - apache

salt '*' state.highstate

0x08 ssh-salt-salt演示

#使用ssh-salt的话,可以不需要进入节点上安装salt-minion

#在master上安装
yum install ssh-salt -y

#里面有默认的配置方案,我写的是参考方案
vi  /etc/salt/roster
master:
  host: 10.10.10.20      ## 主机
  user: root             ## ssh连接的用户名
  passwd: 123456         ## ssh连接的密码
  port: 22               ## 端口
  timeout: 3           
slave:
  host: 10.10.10.30      ## 主机
  user: root             ## ssh连接的用户名
  passwd: 123456         ## ssh连接的密码
  port: 22               ## 端口
  timeout: 3            

#然后执行下列语句
salt-ssh "salve" cmd.run "yum install  epel-release -y"
salt-ssh "salve" cmd.run "yum install salt-minion -y"

salt-ssh "salve" cmd.run "sed -i '/#master: salt/a\master: master'  /etc/salt/minion"
salt-ssh "salve" cmd.run "sed -i '/#id:/a\id: salve'  /etc/salt/minion"

#下面基本步骤就差不多了,也就不演示了。github上存在大量的stalstack的演示写法,自动化安装,自动化扩容等等。

0x09 资料来源

老男孩12期
http://lilongzi.blog.51cto.com/5519072/1859962
GoTop