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/masteretcd_pillar_config: etcd.host: 192.168.3.12 etcd.port: 4001ext_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.cfgbalance 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.slsinclude:
- haproxy.installhaproxy-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 - reload: 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.itemsnode2.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.13mini1: ---------- 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/bashMAIN_ADD_HOST=$1create_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" ];thenecho 'status check ok'elseecho 'status check not ok'exitfi}etcd_key(){ADD_HOST=$1curl 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