saltstack的安装配置及简单使用


saltstack的安装配置及简单使用

saltstack 和 Puppet Chef 一样可以让同时在多台服务器上执行命令,包括安装和配置软件。

Salt有两个主要的功能:配置管理远程执行

安装和配置

如果用yum无法安装,提示:No package salt-master available.请先安装epel源

cd /usr/local/src/ 
wget http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm

然后再 yum 安装
  • 安装,配置 master
master

	"""
	1. 安装salt-master
	yum install salt-master
	2. 修改配置文件:/etc/salt/master
	interface: 0.0.0.0    # 表示Master的IP 
	3. 启动
	service salt-master start
	"""
  • 安装,配置 slave
slave

	"""
	1. 安装salt-minion
	    yum install salt-minion

	2. 修改配置文件 /etc/salt/minion
	    master: 10.211.55.4           # master的地址
	    或
	    master:
	        - 10.211.55.4
	        - 10.211.55.5
	    random_master: True

	    id: slave_id                   # 客户端在salt-master中显示的唯一ID
	3. 启动
	    service salt-minion start
	"""
  • 授权
	"""
	salt-key -L                # 查看已授权和未授权的slave
	salt-key -a  salve_id      # 接受指定id的salve
	salt-key -r  salve_id      # 拒绝指定id的salve
	salt-key -d  salve_id      # 删除指定id的salve
	"""
  • 执行命令
在master服务器上对salve进行远程操作

salt 'slave_id' cmd.run  'ifconfig'
  • py文件运行命令
pip install salt

import salt.client
local = salt.client.LocalClient()
result = local.cmd('c2.salt.com', 'cmd.run', ['ifconfig'])
  • 设置开机启动
master主机执行chkconfig salt-master on
minion主机执行chkconfig salt-minion on


saltstack的几个常用命令


state 对被控制主机进行状态管理

state是Saltstack最核心的功能,通过预先定制好的sls(salt state file)文件对被控制主机进行状态管理,支持包括程序包(pkg)、文件(file)、网络配置(network)、系统服务(service)、系统用户(user)等。

  • (1) 将master上的一个文件,同步到客户端

在 master 端 配置

	1 cd /srv/salt

	2 mkdir mycode
		mycode/
			├── files
			│   └── xx.py
			└── init.sls

	3 vim init.sls 
			/data/xx.py: ID
			    file:
				- managed
				- source: salt://mycode/files/xx.py
				- user: root
				- makedirs: True
				- mode: 644

执行命令推送文件

salt '*' state.sls mycode

显示结果

----------
ID: /data/xx.py
Function: file.managed
Result: True
Comment: File /data/xx.py updated
Started: 21:52:21.507086
Duration: 308.826 ms
Changes:   
----------
diff:
  New file
mode:
  0644

Summary
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1


  • (2) 将master上的文件夹,同步到客户端

在master 配置

	1 - cd /srv/salt

	2 - mkdir s7code
		s7code/
		├── files
		│   └── video
		│       ├── a.py
		│       ├── b.py
		│       └── c.py
		└── init.sls

	3 - vim init.sls 

		/data/xx.py:         # 对应的ID
		    file.recurse:    # 上传文件夹
			- name: /data/codes   # 上传的路径
			- source: salt://s7code/files/video   # 源路径
			- user: root
			- makedirs: True
			- file_mode: 644
			- dir_mode: 755

执行命令推送文件

salt '*' state.sls s7code

显示结果

----------
ID: /data/xx.py
Function: file.recurse
Name: /data/codes
Result: True
Comment: Recursively updated /data/codes
Started: 22:06:00.073110
Duration: 417.839 ms
Changes:   
----------
/data/codes/1.py:
  ----------
  diff:
      New file
  mode:
      0644
/data/codes/2.py:
  ----------
  diff:
      New file
  mode:
      0644
/data/codes/3.py:
  ----------
  diff:
      New file
  mode:
      0644

Summary
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1


grains 用于保存服务器的静态信息

内置grains

- salt "slave1" grains.ls
- salt "slave2" grains.items
- salt "*" grains.get key 

自定义grains

	- minion 
		vim /etc/salt/minion 
			grains:
			  roles:
				- webserver
				- memcache
			  deployment: datacenter4
			  cabinet: 13
			  cab_u: 14-15

		在master上
			salt '*' saltutil.sync_grains
			salt '*' grains.get cabinet

	- master 
		vim /srv/salt/_grains/xx.py

			import time
			def xxo():
				s = {}
				s['xkkkkkkkkkkkkk1'] = str(time.time())
				s['xkkkkkkkkkkkkk2'] = 123
				return s

		salt 'w1.com' saltutil.sync_grains

应用: 在state中根据目标服务器的信息不同,做不同处理。


pillar 用于保存服务器的动态信息

内置pillar

vim /etc/salt/master
pillar_opts: True

PS: 重启生效

自定义pillar

       vim /srv/pillar/top.sls
                base:
                  'c*':
                    - apache

            vim /srv/pillar/apache.sls
                x1:
                { % if grains['os_family'] == 'Debian' % }
                  apache: apache_1
                  { % elif grains['os_family'] == 'RedHat' % }
                  apache: httpd_2
                  { % elif grains['os'] == 'Arch' % }
                  apache: apache_3
                { % endif % }
                x2:
                { % if grains['ip_interfaces'].get('eth0')[0].startswith('10.10') % }
                  nameservers: ['10.10.9.31','10.10.9.135']
                  zabbixserver: ['10.10.9.234']
                { % else % }
                  nameservers: ['10.20.9.75']
                  zabbixserver: ['10.20.9.234']
                { % endif % }


            PS: 刷新 salt '*' saltutil.refresh_pillar

自定义ext_pillar

	vim /etc/salt/master
                ext_pillar:
                    - wupeiqi:
                    
                    - wupeiqi:{api:http://www.oldbody.com}
            vim /usr/lib/python2.7/site-packages/salt/pillar/wupeiqi.py
                import time
                import commands
                import salt.client

                def ext_pillar(minion_id,pillar,*args,**kwargs):

                    local = salt.client.LocalClient()
                    result = local.cmd(minion_id, 'cmd.run', ['ifconfig'])
                    return {'ifconfig':result.get(minion_id)}

            PS: 修改配置文件后需要重启


代码发布简单流程

	1. 在master上拉代码
	    如果文件存在pull否则clone
	    
	    subprocess.check_call('git clone https://gitee.com/melo/video.git', cwd='/Users/landybird/PycharmProjects/demo', shell=True)

	2. build
	    使用编译器进行编译

	3. 软连接到saltstack

	    ln -s /data/codes/video /srv/salt/mycode/files/video
	    
	3. 将代码推送到指定机器
	
	    xxxxxx:
	      file.recurse:
		- name: /data/codes
		- source: salt://mycode/files/video
		- user: root
		- makedirs: True
		- file_mode: 644
		- dir_mode: 755

	    salt 'c1.com' state.sls mycode

	4. 将代码推送到所有机器
	
	    salt '*' state.sls mycode
Buy me a 肥仔水!