发布系统
1. 发布系统:实现方案对比
背景:开发这套系统的背景
- 第1阶段:scp/FTP
- 第2阶段:shell脚本+FTP(运维人员)
f = open('ftp://zzz.zip')
- 第3阶段:shell脚本+SVN(运维人员) /shell脚本+GIT(运维人员)
- 第4阶段:jekins:
- 配置 shell脚本+SVN(运维人员) /shell脚本+GIT(运维人员)
运维:点击
- 第5阶段:自己开发发布系统(目标:构建运维自动化)
原来公司是使用jekins脚本进行发布,为了以后构建运维自动化并且在发布系统中定制更多的自定义行为以及权限等控制,让发布变得更简单,
以后发布系统时就不需要运维,开发自行操作。
发布系统解决方案:
- 服务器拉代码执行:
- 速度慢
- 服务器装编译器
- 发布机
- 拉代码;同步:rsync/ssh/saltstack
- 好处
- 发布机上编译代码
- 增量同步
- 公司基于什么来做的?
- 原来公司用的就是saltstack
PS:由于开发这套系统,学了些salt知识。
1. 安装saltstack
在 Master 端和 Minion 端都需要安装 epel 的 yum源
# 32位操作系统 [root@SaltStack-Master ~]# rpm -ivh http://mirrors.zju.edu.cn/epel/6/i386/epel-release-6-8.noarch.rpm # 64位操作系统 [root@SaltStack-Master ~]# rpm -ivh http://mirrors.zju.edu.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm
master
1. 安装salt-master
yum install salt-master
2. 修改配置文件:/etc/salt/master
interface: 0.0.0.0 # 表示Master的IP
3. 启动
service salt-master start
service salt-master stop
/bin/systemctl start salt-master.service
/bin/systemctl stop salt-master.service
minion
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: c2.salt.com # 客户端在salt-master中显示的唯一ID
3. 启动
service salt-minion start
日志或debug模式打开
master:
salt-master -l debug
minion:
以日志形式打开:
salt-minion -l debug
master防火墙需要关闭:
如果要关闭iptables,可以通过命令/etc/init.d/iptables stop 停止
firewall-cmd --state #查看默认防火墙状态
systemctl stop firewalld.service
2. 授权
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
3. 执行命令
salt 'c2.salt.com' cmd.run 'ifconfig'
import salt.client
local = salt.client.LocalClient()
result = local.cmd('c2.salt.com', 'cmd.run', ['ifconfig'])
4. state
state是Saltstack最核心的功能,通过预先定制好的sls(salt state file)文件对被控制主机进行状态管理,支持包括程序包(pkg)、文件(file)、网络配置(network)、系统服务(service)、系统用户(user)等
在master上进行相关配置,根据salt-master上的配置,在远程服务器上执行相关:命令/文件操作/服务设置等
将master上的一个文件,同步到客户端
- cd /srv/salt - 创建自己的模块 比如s7code - cd s7code - 创建文件 必须叫 init.sls a. 在master - cd /srv/salt s7code/ ├── files │ └── xx.py └── init.sls - vim init.sls /data/xx.py: # 客户端地址 file: - managed - source: salt://s7code/files/xx.py # 服务端文件地址 - user: root - makedirs: True # 没有创建文件夹 - mode: 644 # 权限 b. 推送文件 salt '*' state.sls s7code
将master上的文件夹同步到客户端
a. 在master - cd /srv/salt - vim init.sls s7code/ ├── files │ └── video │ ├── a.py │ ├── b.py │ └── c.py └── init.sls xxxxxx: # 别名 file.recurse: - name: /data/codes # 目标路径 - source: salt://s7code/files/video # 源路径 - user: root - makedirs: True - file_mode: 644 - dir_mode: 755 b. 推送文件 salt 'w1.com' state.sls s7code salt '*' state.sls s7code
软链接
ln -s 源地址 目标地址 示例:ln -s /data/codes/video /srv/salt/files/video
使用模版语言
[root@python7 s7code]# vim init.sls xxxxxx: file.recurse: - name: /data/codes_{{grains['os']}}/video - source: salt://s7code/files/video - user: root - makedirs: True - file_mode: 644 - dir_mode: 755
5. grains
静态值:最开始执行一次后,默认永远是当前值。
内置:
内置:查看所有静态信息
salt "salt1" grains.ls
salt "salt1" grains.items
salt "salt1" grains.get key
- SSDs - biosreleasedate - biosversion - cpu_flags - cpu_model - cpuarch - disks - dns - domain - fqdn - fqdn_ip4 - fqdn_ip6 - gid - gpus - groupname - host - hwaddr_interfaces - id - init - ip4_gw - ip4_interfaces - ip6_gw - ip6_interfaces - ip_gw - ip_interfaces - ipv4 - ipv6 - kernel - kernelrelease - kernelversion - locale_info - localhost - lsb_distrib_codename - lsb_distrib_id - machine_id - manufacturer - master - mdadm - mem_total - nodename - num_cpus - num_gpus - os - os_family - osarch - oscodename - osfinger - osfullname - osmajorrelease - osrelease - osrelease_info - path - pid - productname - ps - pythonexecutable - pythonpath - pythonversion - saltpath - saltversion - saltversioninfo - selinux - serialnumber - server_id - shell - swap_total - systemd - uid - username - uuid - virtual - zfs_support - zmqversion
- minion vim /etc/salt/minion # 配置文件内 grains: roles: - webserver - memcache deployment: datacenter4 cabinet: 13 #在服务端获取salt "salt1" grains.get key
vim /srv/salt/_grains/xx.py # 必须在 /srv/salt/_grains/目录下 import time def xxo(): s = {} s['xkkkkkkkkkkkkk1'] = str(time.time()) s['xkkkkkkkkkkkkk2'] = 123 return s
在master上执行 salt '*' saltutil.sync_grains 同步创建granins
6. pillar
内置
# 修改配置文件
vim /etc/salt/master
pillar_opts: True
PS: 重启生效
#查询
salt '*' pillar.items
salt '*' pillar.data
salt '*' pillar.get key
自定义 pillar
vim /srv/pillar/top.sls # 入口文件 base: '*': # 匹配的主机名 - 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
vim /etc/salt/master
ext_pillar:
- zhou: # :冒号结束不加参数
或
- zhou:{api:http://www.oldbody.com}
vim /usr/lib/python2.6/site-packages/salt/pillar/wupeiqi.py # 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: 修改配置文件后,需要重启
PS: py2中执行系统命令使用 commands.getoutput("ls")
py3中: subprocess.check_call("ls",cwd="xxxx")
既然选择了远方,便是风雨兼程...

浙公网安备 33010602011771号