发布系统

    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
View Code

 

  

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
内置grains
- minion
vim /etc/salt/minion  # 配置文件内

grains:
  roles:
    - webserver
    - memcache
  deployment: datacenter4
  cabinet: 13

#在服务端获取salt "salt1" grains.get key
自定义 minion
    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


在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")

 

posted @ 2018-04-08 20:26  选择远方,风雨兼程。  阅读(151)  评论(0)    收藏  举报