menny 发表于 2018-8-1 09:23:37

saltstack与docker结合构建高可用和自动发现服务

#!/usr/bin/env python  

  
# coding:utf-8
  

  
import sys
  
import docker
  
import redis
  
import subprocess
  
import re
  

  
cli = docker.Client(base_url='unix://var/run/docker.sock')
  
conn = redis.StrictRedis(host='192.168.79.55', port=2001)# 根据实际情况修改
  

  
def delete_redis(key):
  
      conn.delete(key)
  

  
def insert_redis(key,value):
  
      conn.set(key,value)
  

  
def get_ip():
  
      out = subprocess.Popen(
  
                '/sbin/ip addr show eth0',
  
                shell=True,
  
                close_fds=True,
  
                stdout=subprocess.PIPE,
  
                stderr=subprocess.STDOUT).communicate()
  
      info = re.compile(r'inet\s*(.*?)/\d+\s*brd\s*').search(out)
  
      ip = info.group(1)
  
      return ip
  

  
def get_info(container):
  
      info = cli.inspect_container(container)
  
      ip = get_ip()
  
      port = info['NetworkSettings']['Ports']['80/tcp']['HostPort']
  
      name = info['Name']
  

  
      return name,ip+':'+port
  

  

  
def stop_container(container):
  
      name,value = get_info(container)
  
      cli.stop(container)
  
      delete_redis(name)
  

  
def start_container(container):
  
      cli.start(container,publish_all_ports=True)
  
      name,value = get_info(container)
  
      insert_redis(name,value)
  

  
def create_container(image):
  
      container_id = cli.create_container(image=image)
  
      start_container(container_id)
  

  
def check_args():
  
      if len(sys.argv) != 3 or sys.argv not in ['run','start','stop']:
  
                print '\nUsage: %s run <image name>:<version>' % sys.argv
  
                print ' %s start <container name or id>'% sys.argv
  
                print ' %s stop <container name or id>\n'       % sys.argv
  
                sys.exit(1)
  

  
def main():
  
      check_args()
  
      if sys.argv == 'run':
  
                create_container(sys.argv)
  
      elif sys.argv == 'stop':
  
                stop_container(sys.argv)
  
      elif sys.argv == 'start':
  
                start_container(sys.argv)
  
      else:
  
                check_args()
  

  
if __name__ == "__main__":
  
      main()
页: [1]
查看完整版本: saltstack与docker结合构建高可用和自动发现服务