julley 发表于 2018-1-3 20:31:24

saltstack自动化运维系列11基于etcd的saltstack的自动化扩容

  saltstack自动化运维系列11基于etcd的saltstack的自动化扩容
  自动化运维-基于etcd加saltstack的自动化扩容
  # tar -xf etcd-v2.2.1-linux-amd64.tar.gz
  # cd etcd-v2.2.1-linux-amd64
  # cp etcd etcdctl /usr/local/bin/
  查看版本
  # etcd --version
  # mkdir -p /data/etcd
  后台运行进程
  # nohup etcd --name auto_scale --data-dir /data/etcd/ --listen-peer-urls 'http://192.168.3.12:2380,http://192.168.3.12:7001' --listen-client-urls 'http://192.168.3.12:2379,http://192.168.3.12:4001' --advertise-client-urls 'http://192.168.3.12:2379,http://192.168.3.12:4001' &
  # ss -tnlp|grep etcd
  LISTEN   0      128            192.168.3.12:2379                     *:*      users:(("etcd",40909,6))
  LISTEN   0      128            192.168.3.12:2380                     *:*      users:(("etcd",40909,3))
  LISTEN   0      128            192.168.3.12:7001                     *:*      users:(("etcd",40909,5))
  LISTEN   0      128            192.168.3.12:4001                     *:*      users:(("etcd",40909,7))
  创建key和value
  # curl -s http://192.168.3.12:2379/v2/keys/message -XPUT -d value="hello world" | python -m json.tool
  {
  "action": "set",
  "node": {
  "createdIndex": 5,
  "key": "/message",
  "modifiedIndex": 5,
  "value": "hello world"
  }
  }
  查看key和value
  # curl -s http://192.168.3.12:2379/v2/keys/message | python -m json.tool
  {
  "action": "get",
  "node": {
  "createdIndex": 5,
  "key": "/message",
  "modifiedIndex": 5,
  "value": "hello world"
  }
  }
  删除key,可以看到查不到了
  # curl -s http://192.168.3.12:2379/v2/keys/message -XDELETE | python -m json.tool
  {
  "action": "delete",
  "node": {
  "createdIndex": 5,
  "key": "/message",
  "modifiedIndex": 6
  },
  "prevNode": {
  "createdIndex": 5,
  "key": "/message",
  "modifiedIndex": 5,
  "value": "hello world"
  }
  }
  # curl -s http://192.168.3.12:2379/v2/keys/message | python -m json.tool
  {
  "cause": "/message",
  "errorCode": 100,
  "index": 6,
  "message": "Key not found"
  }
  建一个只存在25秒的键值,25秒后发现该键值查不到了
  # curl -s http://192.168.3.12:2379/v2/keys/ttl_use -XPUT -d value='hello world 1' -d ttl=25 | python -m json.tool
  {
  "action": "set",
  "node": {
  "createdIndex": 9,
  "expiration": "2017-04-18T03:04:54.538607442Z",
  "key": "/ttl_use",
  "modifiedIndex": 9,
  "ttl": 25,
  "value": "hello world 1"
  }
  }
  # curl -s http://192.168.3.12:2379/v2/keys/ttl_use | python -m json.tool
  {
  "action": "get",
  "node": {
  "createdIndex": 9,
  "expiration": "2017-04-18T03:04:54.538607442Z",
  "key": "/ttl_use",
  "modifiedIndex": 9,
  "ttl": 24,
  "value": "hello world 1"
  }
  编辑etcd相关配置
  # vim /etc/salt/master
  etcd_pillar_config:
  etcd.host: 192.168.3.12
  etcd.port: 4001
  ext_pillar:
  - etcd: etcd_pillar_config root=/salt/haproxy/
  # /etc/init.d/salt-master restart
  curl -s http://192.168.3.12:2379/v2/keys/salt/haproxy/backend_www_chinasoft_com/web-node1 -XPUT -d value="192.168.3.12:8080" | python -m json.tool
  {
  "action": "set",
  "node": {
  "createdIndex": 11,
  "key": "/salt/haproxy/backend_www_chinasoft_com/web-node1",
  "modifiedIndex": 11,
  "value": "192.168.3.12:8080"
  }
  安装etcd
  # yum install -y python-pip
  # pip search python-etcd
  # pip install python-etcd
  ①编写haproxy的配置文件
  vim /srv/salt/prod/cluster/files/haproxy-outside.cfg
  balance roundrobin
  {% for web,web_ip in pillar.backend_www_chinasoft_com.iteritems() -%}
  server {{ web }} {{ web_ip}} check inter 2000 rise 30 fall 15
  {% endfor %}

  ②编写sls文件
  vim /srv/salt/prod/cluster/haproxy-outside.sls
  include:
  - haproxy.install
  haproxy-service:
  file.managed:
  - name: /etc/haproxy/haproxy.cfg
  - source: salt://cluster/files/haproxy-outside.cfg
  - user: root
  - group: root
  - mode: 644
  - template: jinja# 添加了jinja这一行
  service.running:
  - name: haproxy
  - enable: True

  ->  - require:
  - cmd: haproxy-init
  - watch:
  - file: haproxy-service

  执行以下高级状态,如果报错jinja has no attibute backend_www_chinasoft_com重启一下master即可
  # salt '*' state.highstate
  此时向haproxy添加backend主机
  curl -s http://192.168.3.12:2379/v2/keys/salt/haproxy/backend_www_chinasoft_com/web-node2 -XPUT -d value="192.168.3.12:8080" | python -m json.tool
  curl -s http://192.168.3.12:2379/v2/keys/salt/haproxy/backend_www_chinasoft_com/web-node3 -XPUT -d value="192.168.3.12:8080" | python -m json.tool
  # curl -s http://192.168.3.12:2379/v2/keys/salt/haproxy/backend_www_chinasoft_com/web-node4 -XPUT -d value="192.168.3.12:8080" | python -m json.tool
  执行变更
  # salt '*' state.highstate
  通过访问haproxy的管理界面可以看到成功添加 http://192.168.3.12:8888/haproxy-status

  可以看到pillar的选项,如果不能看到需要修改/etc/salt/master (pillar_opts: False)
  # salt '*' pillar.items
  node2.chinasoft.com:
  ----------
  backend_www_chinasoft_com:
  ----------
  web-node1:
  192.168.3.12:8080
  web-node2:
  192.168.3.12:8080
  web-node3:
  192.168.3.12:8080
  web-node4:
  192.168.3.12:8080
  zabbix-agent:
  ----------
  Zabbix_Server:
  192.168.3.13
  mini1:
  ----------
  backend_www_chinasoft_com:
  ----------
  web-node1:
  192.168.3.12:8080
  web-node2:
  192.168.3.12:8080
  web-node3:
  192.168.3.12:8080
  web-node4:
  192.168.3.12:8080
  zabbix-agent:
  ----------
  Zabbix_Server:
  192.168.3.13
  编写脚本实现自动添加haproxy后端服务器
  # vim auto_add_haproxynode.sh
  

#!/bin/bash  

  
MAIN_ADD_HOST=$1
  
create_host(){
  
echo 'create host ok'
  
}
  

  
deploy_service(){
  
ADD_HOST_PORT='8080'
  
}
  

  
deploy_code(){
  
echo 'deploy code ok'
  
}
  

  
service_check(){
  
STATUS=$(curl -s --head http://"$ADD_HOST":"$ADD_HOST_PORT"/ |grep "200 OK")
  
if [ -n "$STATUS" ];then
  
echo 'status check ok'
  
else
  
echo 'status check not ok'
  
exit
  
fi
  
}
  

  
etcd_key(){
  
ADD_HOST=$1
  
curl http://192.168.3.12:2379/v2/keys/salt/haproxy/backend_www_chinasoft_com/$ADD_HOST -XPUT -d value="192.168.3.19:${ADD_HOST_PORT}"
  
}
  

  
sync_state(){
  
salt '*' state.sls cluster.haproxy-outside env=prod
  
}
  

  
main(){
  
create_host;
  
deploy_service;
  
deploy_code;
  
etcd_key $MAIN_ADD_HOST;
  
sync_state;
  
}
  

  
main $1
  

  执行脚本,可以看到成功添加
  # ./auto_add_haproxynode.sh web-node18
页: [1]
查看完整版本: saltstack自动化运维系列11基于etcd的saltstack的自动化扩容