├── roles ├── fe │ ├── vars │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ └── cfg.json.j2 ├── hbs │ ├── vars │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ └── cfg.json.j2 ├── alarm │ ├── vars │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ └── cfg.json.j2 ├── graph │ ├── vars │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ └── templates │ │ └── cfg.json.j2 ├── judge │ ├── vars │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ └── cfg.json.j2 ├── query │ ├── vars │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ ├── templates │ │ ├── graph_backends.txt.j2 │ │ └── cfg.json.j2 │ └── tasks │ │ └── main.yml ├── task │ ├── vars │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ └── cfg.json.j2 ├── agent │ ├── vars │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ └── cfg.json.j2 ├── common │ ├── vars │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── tasks │ │ ├── main.yml │ │ ├── python_env.yml │ │ ├── go.yml │ │ └── python.yml ├── sender │ ├── vars │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ └── cfg.json.j2 ├── links │ ├── tasks │ │ └── main.yml │ ├── vars │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ ├── gunicorn.conf.j2 │ │ └── config.py.j2 ├── nodata │ ├── vars │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ └── cfg.json.j2 ├── prepare │ ├── templates │ │ └── golang.sh.j2 │ ├── vars │ │ └── main.yml │ └── tasks │ │ └── main.yml ├── transfer │ ├── vars │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ └── cfg.json.j2 ├── dashboard │ ├── tasks │ │ └── main.yml │ ├── vars │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ ├── gunicorn.conf.j2 │ │ └── config.py.j2 ├── gateway │ ├── vars │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ └── cfg.json.j2 ├── aggregator │ ├── vars │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ └── templates │ │ └── cfg.json.j2 └── portal │ ├── vars │ └── main.yml │ ├── tasks │ └── main.yml │ ├── handlers │ └── main.yml │ └── templates │ ├── gunicorn.conf.j2 │ └── config.py.j2 ├── prepare.yml ├── .gitattributes ├── .gitignore ├── site.yml ├── README.md ├── hosts └── group_vars └── all /roles/fe/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/fe/vars/main.yml 3 | 4 | module: fe -------------------------------------------------------------------------------- /roles/hbs/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/hbs/vars/main.yml 3 | 4 | module: hbs -------------------------------------------------------------------------------- /roles/alarm/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/alarm/vars/main.yml 3 | 4 | module: alarm -------------------------------------------------------------------------------- /roles/graph/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/graph/vars/main.yml 3 | 4 | module: graph -------------------------------------------------------------------------------- /roles/judge/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/judge/vars/main.yml 3 | 4 | module: judge -------------------------------------------------------------------------------- /roles/query/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/query/vars/main.yml 3 | 4 | module: query -------------------------------------------------------------------------------- /roles/task/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/task/vars/main.yml 3 | 4 | module: task -------------------------------------------------------------------------------- /roles/agent/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/agent/vars/main.yml 3 | 4 | module: agent 5 | -------------------------------------------------------------------------------- /roles/common/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/common/vars/main.yml 3 | 4 | module: common -------------------------------------------------------------------------------- /roles/sender/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/sender/vars/main.yml 3 | 4 | module: sender -------------------------------------------------------------------------------- /roles/links/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: 3 | 4 | - include: ../../common/tasks/python.yml 5 | -------------------------------------------------------------------------------- /roles/nodata/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/nodata/vars/main.yml 3 | 4 | module: nodata 5 | -------------------------------------------------------------------------------- /roles/prepare/templates/golang.sh.j2: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | export GOPATH={{ gopath }}:${GOPATH} 4 | -------------------------------------------------------------------------------- /roles/prepare/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/prepare/vars/main.yml 3 | 4 | module: prepare -------------------------------------------------------------------------------- /roles/transfer/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/transfer/vars/main.yml 3 | 4 | module: transfer -------------------------------------------------------------------------------- /roles/dashboard/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: 3 | 4 | - include: ../../common/tasks/python.yml 5 | -------------------------------------------------------------------------------- /roles/gateway/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/gateway/vars/main.yml 3 | 4 | module: gateway 5 | -------------------------------------------------------------------------------- /roles/aggregator/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/aggregator/vars/main.yml 3 | 4 | module: aggregator 5 | -------------------------------------------------------------------------------- /roles/fe/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/fe/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | -------------------------------------------------------------------------------- /roles/links/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/links/vars/main.yml 3 | 4 | module: links 5 | frame: frame 6 | -------------------------------------------------------------------------------- /roles/portal/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/portal/vars/main.yml 3 | 4 | module: portal 5 | frame: frame 6 | -------------------------------------------------------------------------------- /roles/hbs/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/hbs/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | -------------------------------------------------------------------------------- /roles/task/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/tasks/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | -------------------------------------------------------------------------------- /roles/agent/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/agent/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | -------------------------------------------------------------------------------- /roles/alarm/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/alarm/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | -------------------------------------------------------------------------------- /roles/dashboard/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/dashboard/vars/main.yml 3 | 4 | module: dashboard 5 | frame: rrd 6 | -------------------------------------------------------------------------------- /roles/gateway/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/agent/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | -------------------------------------------------------------------------------- /roles/nodata/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/agent/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | -------------------------------------------------------------------------------- /roles/sender/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/sender/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | -------------------------------------------------------------------------------- /roles/transfer/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/agent/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | -------------------------------------------------------------------------------- /prepare.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # 3 | 4 | - hosts: localhost 5 | user: root 6 | connection: local 7 | roles: 8 | - prepare 9 | -------------------------------------------------------------------------------- /roles/aggregator/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/agent/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | -------------------------------------------------------------------------------- /roles/judge/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | -------------------------------------------------------------------------------- /roles/portal/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/portal/tasks/main.yml 3 | 4 | - include: ../../common/tasks/python.yml 5 | -------------------------------------------------------------------------------- /roles/agent/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/alarm/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/fe/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/graph/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/hbs/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/judge/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/links/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/nodata/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/portal/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/query/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/sender/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/task/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/aggregator/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/dashboard/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/gateway/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/transfer/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/handlers/main.yml 3 | 4 | - include: ../../common/handlers/main.yml 5 | -------------------------------------------------------------------------------- /roles/query/templates/graph_backends.txt.j2: -------------------------------------------------------------------------------- 1 | {% for host in groups['graph'] %} 2 | graph-{{ loop.index }} {{ host }}:{{ graph['rpc']['listen'] }} 3 | {% endfor %} 4 | -------------------------------------------------------------------------------- /roles/links/templates/gunicorn.conf.j2: -------------------------------------------------------------------------------- 1 | workers = {{ links['gunicorn']['workers'] }} 2 | bind = "0.0.0.0:{{ links['gunicorn']['bind'] }}" 3 | proc_name = 'falcon-links' 4 | pidfile = 'var/app.pid' 5 | limit_request_field_size = 0 6 | limit_request_line = 0 7 | -------------------------------------------------------------------------------- /roles/portal/templates/gunicorn.conf.j2: -------------------------------------------------------------------------------- 1 | workers = {{ portal['gunicorn']['workers'] }} 2 | bind = "0.0.0.0:{{ portal['gunicorn']['bind'] }}" 3 | proc_name = 'falcon-portal' 4 | pidfile = 'var/app.pid' 5 | limit_request_field_size = 0 6 | limit_request_line = 0 7 | -------------------------------------------------------------------------------- /roles/dashboard/templates/gunicorn.conf.j2: -------------------------------------------------------------------------------- 1 | workers = {{ dashboard['gunicorn']['workers'] }} 2 | bind = ":{{ dashboard['gunicorn']['bind'] }}" 3 | proc_name = 'falcon-{{ module }}' 4 | pidfile = '{{ deploy_root }}/{{ module }}/var/app.pid' 5 | limit_request_field_size = 0 6 | limit_request_line = 0 7 | -------------------------------------------------------------------------------- /roles/graph/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/agent/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | 6 | - name: ensure rrd storage dir exist 7 | file: path={{ graph['rrd']['storage'] }} owner={{ deploy_user }} group={{ deploy_group }} mode="u+rw" state=directory recurse=yes 8 | notify: 9 | - restart {{ module }} 10 | - check {{ module }} status 11 | -------------------------------------------------------------------------------- /roles/hbs/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "debug": {{ hbs['debug']|lower }}, 3 | "database": "{{ dsn_hbs_portal }}", 4 | "hosts": "", 5 | "maxIdle": {{ hbs['maxIdle'] }}, 6 | "listen": ":{{ hbs['rpc']['listen'] }}", 7 | "trustable": [""], 8 | "http": { 9 | "enabled": true, 10 | "listen": "0.0.0.0:{{ hbs['http']['listen'] }}" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /roles/query/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/tasks/main.yml 3 | 4 | - include: ../../common/tasks/go.yml 5 | 6 | - name: update {{ module }} backends 7 | template: 8 | src=graph_backends.txt.j2 9 | dest={{ deploy_root }}/{{ module }}/graph_backends.txt 10 | group={{ deploy_group }} 11 | owner={{ deploy_user }} 12 | mode=0755 13 | backup=yes 14 | notify: 15 | - restart {{ module }} 16 | - check {{ module }} status 17 | -------------------------------------------------------------------------------- /roles/common/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # 3 | 4 | - name: restart {{ module }} 5 | shell: "su -l {{ deploy_user }} -c 'cd {{ deploy_root }}/{{ module }}/ && ./control stop ; sleep 5 && ./control start'" 6 | ignore_errors: yes 7 | 8 | - name: wait {{ module }} active 9 | wait_for: port={{ port['http'][module] }} delay=5 timeout=60 10 | 11 | - name: check {{ module }} status 12 | shell: "curl http://127.0.0.1:{{ port['http'][module] }}{{ health[module] }} |grep ok" 13 | 14 | -------------------------------------------------------------------------------- /roles/common/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/common/tasks/main.yml 3 | 4 | - name: ensure deploy group exist 5 | group: name={{ deploy_group }} gid={{ deploy_gid }} state=present 6 | 7 | - name: ensure deploy user exist 8 | user: name={{ deploy_user }} uid={{ deploy_uid }} group={{ deploy_group }} state=present createhome=yes 9 | 10 | - name: ensure deploy path permisstion 11 | file: path={{ deploy_root }} owner={{ deploy_user }} group={{ deploy_group }} mode="u+rwx" state=directory recurse=yes 12 | -------------------------------------------------------------------------------- /roles/common/tasks/python_env.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: 3 | 4 | - name: install dependency 5 | yum: name={{ item }} state=present 6 | with_items: 7 | - "@development-tools" 8 | - python-virtualenv 9 | - python-pip 10 | - mysql-devel 11 | - python-devel 12 | - MySQL-python 13 | 14 | - name: install {{ module }} env 15 | pip: 16 | virtualenv="{{ deploy_root }}/{{ module }}/env" 17 | requirements="{{ deploy_root }}/{{ module }}/pip_requirements.txt" 18 | extra_args="-i http://pypi.douban.com/simple" 19 | -------------------------------------------------------------------------------- /roles/sender/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "debug": {{ sender['debug']|lower }}, 3 | "http": { 4 | "enabled": true, 5 | "listen": "0.0.0.0:{{ sender['http']['listen'] }}" 6 | }, 7 | "redis": { 8 | "addr": "{{ redis }}", 9 | "maxIdle": {{ sender['Redis']['maxIdle'] }} 10 | }, 11 | "queue": { 12 | "sms": "/sms", 13 | "mail": "/mail" 14 | }, 15 | "worker": { 16 | "sms": {{ sender['worker']['sms'] }}, 17 | "mail": {{ sender['worker']['mail'] }} 18 | }, 19 | "api": { 20 | "sms": "{{ sender['api']['sms'] }}", 21 | "mail": "{{ sender['api']['mail'] }}" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /roles/aggregator/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "debug": {{ aggregator['debug']|lower }}, 3 | "http": { 4 | "enabled": true, 5 | "listen": "0.0.0.0:{{ aggregator['http']['listen'] }}" 6 | }, 7 | "database": { 8 | "addr": "{{ dsn_aggregator_portal }}", 9 | "idle": {{ aggregator['database']['idle'] }}, 10 | "ids": [{{ id_begin }}, {{ id_end }}], 11 | "interval":{{ aggregator['database']['interval'] }} 12 | }, 13 | "api": { 14 | "hostnames": "{{ portal_uri }}/api/group/%s/hosts.json", 15 | "push": "http://{{ transfer_ip }}:{{ transfer['http']['listen'] }}/api/push", 16 | "graphLast": "{{ query_uri }}/graph/last" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /roles/links/templates/config.py.j2: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | __author__ = 'Ulric Qin' 3 | 4 | # -- app config -- 5 | DEBUG = {{ links['config']['debug'] }} 6 | 7 | # -- db config -- 8 | DB_HOST = "{{ dsn_links_links_host }}" 9 | DB_PORT = {{ dsn_links_links_port }} 10 | DB_USER = "{{ dsn_links_links_user }}" 11 | DB_PASS = "{{ dsn_links_links_pass }}" 12 | DB_NAME = "{{ dsn_links_links_name }}" 13 | 14 | # -- cookie config -- 15 | SECRET_KEY = "{{ links['config']['secret_key'] }}" 16 | SESSION_COOKIE_NAME = "{{ links['config']['session_cookie_name'] }}" 17 | PERMANENT_SESSION_LIFETIME = {{ links['config']['permanent_session_lifetime'] }} 18 | 19 | try: 20 | from frame.local_config import * 21 | except Exception, e: 22 | print "[warning] %s" % e 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear on external disk 35 | .Spotlight-V100 36 | .Trashes 37 | 38 | # Directories potentially created on remote AFP share 39 | .AppleDB 40 | .AppleDesktop 41 | Network Trash Folder 42 | Temporary Items 43 | .apdisk 44 | -------------------------------------------------------------------------------- /roles/alarm/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "debug": {{ alarm['debug']|lower }}, 3 | "uicToken": "{{ alarm['uicToken'] }}", 4 | "http": { 5 | "enabled": true, 6 | "listen": "0.0.0.0:{{ alarm['http']['listen'] }}" 7 | }, 8 | "queue": { 9 | "sms": "/sms", 10 | "mail": "/mail" 11 | }, 12 | "redis": { 13 | "addr": "{{ redis }}", 14 | "maxIdle": {{ alarm['Redis']['maxIdle'] }}, 15 | "highQueues": [ 16 | "event:p0", 17 | "event:p1", 18 | "event:p2", 19 | "event:p3", 20 | "event:p4", 21 | "event:p5" 22 | ], 23 | "lowQueues": [ 24 | "event:p6" 25 | ], 26 | "userSmsQueue": "/queue/user/sms", 27 | "userMailQueue": "/queue/user/mail" 28 | }, 29 | "api": { 30 | "portal": "{{ portal_uri }}", 31 | "uic": "{{ fe_uri }}", 32 | "links": "{{ links_uri }}" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /roles/portal/templates/config.py.j2: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | __author__ = 'Ulric Qin' 3 | 4 | # -- app config -- 5 | DEBUG = {{ portal['config']['debug'] }} 6 | 7 | # -- db config -- 8 | DB_HOST = "{{ dsn_portal_portal_host }}" 9 | DB_PORT = {{ dsn_portal_portal_port }} 10 | DB_USER = "{{ dsn_portal_portal_user }}" 11 | DB_PASS = "{{ dsn_portal_portal_pass }}" 12 | DB_NAME = "{{ dsn_portal_portal_name }}" 13 | 14 | # -- cookie config -- 15 | SECRET_KEY = "{{ portal['config']['secret_key'] }}" 16 | SESSION_COOKIE_NAME = "{{ portal['config']['session_cookie_name'] }}" 17 | PERMANENT_SESSION_LIFETIME = {{ portal['config']['permanent_session_lifetime'] }} 18 | 19 | UIC_ADDRESS = { 20 | 'internal': '{{ fe_uri }}', 21 | 'external': '{{ fe_ext_uri }}', 22 | } 23 | 24 | UIC_TOKEN = "{{ portal['config']['uic_token'] }}" 25 | 26 | MAINTAINERS = ['root'] 27 | CONTACT = "{{ portal['config']['contact'] }}" 28 | 29 | COMMUNITY = True 30 | 31 | try: 32 | from frame.local_config import * 33 | except Exception, e: 34 | print "[warning] %s" % e 35 | -------------------------------------------------------------------------------- /roles/common/tasks/go.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: roles/{{ module }}/tasks/main.yml 3 | 4 | - name: make {{ module }} dir 5 | file: 6 | path={{ deploy_root }}/{{ module }} 7 | owner={{ deploy_user }} 8 | group={{ deploy_group }} 9 | mode=0755 10 | state=directory 11 | 12 | - name: update {{ module }} code 13 | unarchive: 14 | src="{{ gopath }}/{{ code_root }}/{{ module }}/{{ module }}.tar.gz" 15 | dest="{{ deploy_root }}/{{ module }}/" 16 | owner={{ deploy_user }} 17 | group={{ deploy_group }} 18 | follow=yes 19 | notify: 20 | - restart {{ module }} 21 | - wait {{ module }} active 22 | - check {{ module }} status 23 | 24 | - name: update {{ module }} conf 25 | template: 26 | src=../../{{ module }}/templates/cfg.json.j2 27 | dest={{ deploy_root }}/{{ module }}/cfg.json 28 | group={{ deploy_group }} 29 | owner={{ deploy_user }} 30 | mode=0755 31 | backup=yes 32 | notify: 33 | - restart {{ module }} 34 | - wait {{ module }} active 35 | - check {{ module }} status 36 | -------------------------------------------------------------------------------- /roles/query/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "debug": "{{ query['debug']|lower }}", 3 | "http": { 4 | "enabled": {{ query['http']['enabled']|lower }}, 5 | "listen": "0.0.0.0:{{ query['http']['listen'] }}" 6 | }, 7 | "graph": { 8 | "connTimeout": {{ query['graph']['connTimeout'] }}, 9 | "callTimeout": {{ query['graph']['callTimeout'] }}, 10 | "maxConns": {{ query['graph']['maxConns'] }}, 11 | "maxIdle": {{ query['graph']['maxIdle'] }}, 12 | "replicas": {{ query['graph']['replicas'] }}, 13 | "cluster": { 14 | {% for host in groups['graph'] %} 15 | {% if loop.last %} 16 | "graph-{{ loop.index }}" : "{{ host }}:{{ graph['rpc']['listen'] }}" 17 | {% else %} 18 | "graph-{{ loop.index }}" : "{{ host }}:{{ graph['rpc']['listen'] }}", 19 | {% endif %} 20 | {% endfor %} 21 | } 22 | }, 23 | "api": { 24 | "query": "{{ query_uri }}", 25 | "dashboard": "{{ dashboard_uri }}", 26 | "max": {{ query['api']['max'] }} 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /roles/graph/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "pid": "{{ deploy_root }}/{{ module }}/var/app.pid", 3 | "log": "info", 4 | "debug": {{ graph['debug']|lower }}, 5 | "http": { 6 | "enabled": true, 7 | "listen": "0.0.0.0:{{ graph['http']['listen'] }}" 8 | }, 9 | "rpc": { 10 | "enabled": true, 11 | "listen": "0.0.0.0:{{ graph['rpc']['listen'] }}" 12 | }, 13 | "rrd": { 14 | "storage": "{{ graph['rrd']['storage'] }}" 15 | }, 16 | "db": { 17 | "dsn": "{{ dsn_graph_graph }}", 18 | "maxIdle": {{ graph['db']['maxIdle'] }} 19 | }, 20 | "callTimeout": {{ graph['callTimeout'] }}, 21 | "migrate": { 22 | "enabled": {{ graph['migrate']['enabled']|lower }}, 23 | "concurrency": {{ graph['migrate']['concurrency'] }}, 24 | "replicas": {{ graph['migrate']['replicas'] }}, 25 | "cluster": { 26 | {% for host in groups['graph'] %} 27 | {% if loop.last %} 28 | "graph-{{ loop.index }}" : "{{ host }}:{{ graph['rpc']['listen'] }}" 29 | {% else %} 30 | "graph-{{ loop.index }}" : "{{ host }}:{{ graph['rpc']['listen'] }}", 31 | {% endif %} 32 | {% endfor %} 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /roles/gateway/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "debug": {{ gateway['debug']|lower }}, 3 | "http": { 4 | "enabled": true, 5 | "listen": "0.0.0.0:{{ gateway['http']['listen'] }}" 6 | }, 7 | "rpc": { 8 | "enabled": true, 9 | "listen": "0.0.0.0:{{ gateway['rpc']['listen'] }}" 10 | }, 11 | "socket": { 12 | "enabled": false, 13 | "listen": "0.0.0.0:4444", 14 | "timeout": 3600 15 | }, 16 | "transfer": { 17 | "enabled": {{ gateway['transfer']['enabled']|lower }}, 18 | "batch": {{ gateway['transfer']['batch'] }}, 19 | "connTimeout": {{ gateway['transfer']['connTimeout'] }}, 20 | "callTimeout": {{ gateway['transfer']['callTimeout'] }}, 21 | "maxConns": {{ gateway['transfer']['maxConns'] }}, 22 | "maxIdle": {{ gateway['transfer']['maxIdle'] }}, 23 | "cluster": { 24 | {% for host in groups['transfer'] %} 25 | {% if loop.last %} 26 | "transfer-{{ loop.index }}" : "{{ host }}:{{ transfer['rpc']['listen'] }}" 27 | {% else %} 28 | "transfer-{{ loop.index }}" : "{{ host }}:{{ transfer['rpc']['listen'] }}", 29 | {% endif %} 30 | {% endfor %} 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /roles/nodata/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "debug": {{ nodata['debug']|lower }}, 3 | "http": { 4 | "enabled": true, 5 | "listen": "0.0.0.0:{{ nodata['http']['listen'] }}" 6 | }, 7 | "query":{ 8 | "connectTimeout": {{ nodata['query']['connectTimeout'] }}, 9 | "requestTimeout": {{ nodata['query']['requestTimeout'] }}, 10 | "queryAddr": "{{ query_uri[7:] }}" 11 | }, 12 | "config": { 13 | "enabled": true, 14 | "dsn": "{{ dsn_nodata_portal }}", 15 | "maxIdle": {{ nodata['config']['maxIdle'] }} 16 | }, 17 | "collector":{ 18 | "enabled": true, 19 | "batch": {{ nodata['collector']['batch'] }}, 20 | "concurrent": {{ nodata['collector']['concurrent'] }} 21 | }, 22 | "sender":{ 23 | "enabled": true, 24 | "connectTimeout": {{ nodata['sender']['connectTimeout'] }}, 25 | "requestTimeout": {{ nodata['sender']['requestTimeout'] }}, 26 | "transferAddr": "{{ transfer_ip }}:{{ transfer['http']['listen'] }}", 27 | "batch": {{ nodata['sender']['batch'] }}, 28 | "block": { 29 | "enabled": false, 30 | "threshold": {{ nodata['sender']['block']['threshold'] }} 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /roles/dashboard/templates/config.py.j2: -------------------------------------------------------------------------------- 1 | #-*-coding:utf8-*- 2 | import os 3 | 4 | #-- dashboard db config -- 5 | DASHBOARD_DB_HOST = "{{ dsn_dashboard_dashboard_host }}" 6 | DASHBOARD_DB_PORT = {{ dsn_dashboard_dashboard_port }} 7 | DASHBOARD_DB_USER = "{{ dsn_dashboard_dashboard_user }}" 8 | DASHBOARD_DB_PASSWD = "{{ dsn_dashboard_dashboard_pass }}" 9 | DASHBOARD_DB_NAME = "{{ dsn_dashboard_dashboard_name }}" 10 | 11 | #-- graph db config -- 12 | GRAPH_DB_HOST = "{{ dsn_dashboard_graph_host }}" 13 | GRAPH_DB_PORT = {{ dsn_dashboard_graph_port }} 14 | GRAPH_DB_USER = "{{ dsn_dashboard_graph_user }}" 15 | GRAPH_DB_PASSWD = "{{ dsn_dashboard_graph_pass }}" 16 | GRAPH_DB_NAME = "{{ dsn_dashboard_graph_name }}" 17 | 18 | #-- app config -- 19 | DEBUG = {{ dashboard['config']['debug'] }} 20 | SECRET_KEY = "{{ dashboard['config']['secret_key'] }}" 21 | SESSION_COOKIE_NAME = "{{ dashboard['config']['session_cookie_name'] }}" 22 | PERMANENT_SESSION_LIFETIME = {{ dashboard['config']['permanent_session_lifetime'] }} 23 | SITE_COOKIE = "{{ dashboard['config']['site_cookie'] }}" 24 | 25 | #-- query config -- 26 | QUERY_ADDR = "{{ query_uri }}" 27 | 28 | BASE_DIR = "{{ deploy_root }}/{{ module }}" 29 | LOG_PATH = os.path.join(BASE_DIR,"log/") 30 | 31 | try: 32 | from rrd.local_config import * 33 | except: 34 | pass 35 | -------------------------------------------------------------------------------- /roles/judge/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "debug": {{ judge['debug']|lower }}, 3 | "debugHost": "{{ judge['debugHost'] }}", 4 | "remain": {{ judge['remain'] }}, 5 | "http": { 6 | "enabled": true, 7 | "listen": "0.0.0.0:{{ judge['http']['listen'] }}" 8 | }, 9 | "rpc": { 10 | "enabled": true, 11 | "listen": "0.0.0.0:{{ judge['rpc']['listen'] }}" 12 | }, 13 | "hbs": { 14 | "servers": [ 15 | {% for host in groups['hbs'] %} 16 | {% if loop.last %} 17 | "{{ host }}:{{ hbs['rpc']['listen'] }}" 18 | {% else %} 19 | "{{ host }}:{{ hbs['rpc']['listen'] }}", 20 | {% endif %} 21 | {% endfor %} 22 | ], 23 | "timeout": {{ judge['Hbs']['timeout'] }}, 24 | "interval": {{ judge['Hbs']['interval'] }} 25 | }, 26 | "alarm": { 27 | "enabled": {{ judge['alarm']['enabled']|lower }}, 28 | "minInterval": {{ judge['alarm']['minInterval'] }}, 29 | "queuePattern": "event:p%v", 30 | "redis": { 31 | "dsn": "{{ redis }}", 32 | "maxIdle": {{ judge['alarm']['Redis']['maxIdle'] }}, 33 | "connTimeout": {{ judge['alarm']['Redis']['connTimeout'] }}, 34 | "readTimeout": {{ judge['alarm']['Redis']['readTimeout'] }}, 35 | "writeTimeout": {{ judge['alarm']['Redis']['writeTimeout'] }} 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /roles/task/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "debug": {{ task['debug']|lower }}, 3 | "http": { 4 | "enable": true, 5 | "listen": "0.0.0.0:{{ task['http']['listen'] }}" 6 | }, 7 | "index": { 8 | "enable": true, 9 | "dsn": "{{ dsn_task_graph }}", 10 | "maxIdle": {{ task['index']['maxIdle'] }}, 11 | "autoDelete": {{ task['index']['autoDelete']|lower }}, 12 | "cluster":{ 13 | {% for host in groups['graph'] %} 14 | {% if loop.last %} 15 | "{{ host }}:{{ graph['http']['listen'] }}" : "{{ index_quartz }}" 16 | {% else %} 17 | "{{ host }}:{{ graph['http']['listen'] }}" : "{{ index_quartz }}", 18 | {% endif %} 19 | {% endfor %} 20 | } 21 | }, 22 | "collector":{ 23 | "enable": true, 24 | "destUrl" : "http://127.0.0.1:{{ agent['http']['listen'] }}/v1/push", 25 | "srcUrlFmt" : "http://%s/statistics/all", 26 | "cluster" : [ 27 | {% for item in task['collector']['cluster'] %} 28 | {% if not loop.last %} 29 | {% for host in groups[item] %} 30 | "{{ item }},{{ host }}:{{ port['http'][item] }}", 31 | {% endfor %} 32 | {% else %} 33 | {% for host in groups[item] %} 34 | {% if not loop.last %} 35 | "{{ item }},{{ host }}:{{ port['http'][item] }}", 36 | {% else %} 37 | "{{ item }},{{ host }}:{{ port['http'][item] }}" 38 | {% endif %} 39 | {% endfor %} 40 | {% endif %} 41 | {% endfor %} 42 | ] 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /roles/fe/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "log": "{{ fe['log_level'] }}", 3 | "company": "{{ fe['company'] }}", 4 | "http": { 5 | "enabled": true, 6 | "listen": "0.0.0.0:{{ fe['http']['listen'] }}" 7 | }, 8 | "cache": { 9 | "enabled": {{ fe['cache']['enabled']|lower }}, 10 | "redis": "{{ redis }}", 11 | "idle": {{ fe['cache']['idle'] }}, 12 | "max": {{ fe['cache']['max'] }}, 13 | "timeout": { 14 | "conn": {{ fe['cache']['timeout']['conn'] }}, 15 | "read": {{ fe['cache']['timeout']['read'] }}, 16 | "write": {{ fe['cache']['timeout']['write'] }} 17 | } 18 | }, 19 | "salt": "{{ fe['salt'] }}", 20 | "canRegister": {{ fe['canRegister']|lower }}, 21 | "ldap": { 22 | "enabled": {{ fe['ldap']['enabled']|lower }}, 23 | "addr": "{{ fe['ldap']['addr'] }}", 24 | "baseDN": "{{ fe['ldap']['baseDN'] }}", 25 | "bindDN": "{{ fe['ldap']['bindDN'] }}", 26 | "bindPasswd": "{{ fe['ldap']['bindPasswd'] }}", 27 | "userField": "{{ fe['ldap']['userField'] }}", 28 | "attributes": ["sn","mail","telephoneNumber"] 29 | }, 30 | "uic": { 31 | "addr": "{{ dsn_fe_uic }}", 32 | "idle": {{ fe['uic']['idle'] }}, 33 | "max": {{ fe['uic']['max'] }} 34 | }, 35 | "shortcut": { 36 | "falconPortal": "{{ portal_uri }}", 37 | "falconDashboard": "{{ dashboard_uri }}", 38 | "falconAlarm": "{{ alarm_uri }}" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /roles/common/tasks/python.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file: 3 | 4 | - name: make {{ module }} dir 5 | file: 6 | path={{ deploy_root }}/{{ module }} 7 | owner={{ deploy_user }} 8 | group={{ deploy_group }} 9 | mode=0755 10 | state=directory 11 | 12 | - name: update {{ module }} code 13 | unarchive: 14 | src="{{ gopath }}/{{ code_root }}/{{ module }}/{{ module }}.tar.gz" 15 | dest="{{ deploy_root }}/{{ module }}/" 16 | owner={{ deploy_user }} 17 | group={{ deploy_group }} 18 | follow=yes 19 | notify: 20 | - restart {{ module }} 21 | - check {{ module }} status 22 | 23 | - name: update {{ module }} conf 24 | template: 25 | src=../../{{ module }}/templates/config.py.j2 26 | dest="{{ deploy_root }}/{{ module }}/{{ frame }}/config.py" 27 | owner={{ deploy_user }} 28 | group={{ deploy_group }} 29 | mode=0600 30 | follow=yes 31 | notify: 32 | - restart {{ module }} 33 | - check {{ module }} status 34 | 35 | - name: update {{ module }} gunicorn.conf 36 | template: 37 | src=../../{{ module }}/templates/gunicorn.conf.j2 38 | dest="{{ deploy_root }}/{{ module }}/gunicorn.conf" 39 | owner={{ deploy_user }} 40 | group={{ deploy_group }} 41 | mode=0600 42 | follow=yes 43 | notify: 44 | - restart {{ module }} 45 | - wait {{ module }} active 46 | - check {{ module }} status 47 | 48 | - include: python_env.yml 49 | when: 50 | - "install_{{ module }}_env" 51 | notify: 52 | - restart {{ module }} 53 | - wait {{ module }} active 54 | - check {{ module }} status 55 | -------------------------------------------------------------------------------- /roles/agent/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "debug": {{ agent['debug']|lower }}, 3 | "hostname": "{{ ansible_default_ipv4['address'] }}", 4 | "ip": "", 5 | "plugin": { 6 | "enabled": {{ agent['plugin']['enabled']|lower }}, 7 | "dir": "./plugin", 8 | "git": "{{ agent['plugin']['git'] }}", 9 | "logs": "./logs" 10 | }, 11 | "heartbeat": { 12 | "enabled": {{ agent['heartbeat']['enabled']|lower }}, 13 | "addr": "{{ heartbeat_ip }}:{{ hbs['rpc']['listen'] }}", 14 | "interval": {{ agent['heartbeat']['interval'] }}, 15 | "timeout": {{ agent['heartbeat']['timeout'] }} 16 | }, 17 | "transfer": { 18 | "enabled": {{ agent['transfer']['enabled']|lower }}, 19 | "addrs": [ 20 | {% set ips = transfer_ip.split(',') %} 21 | {% for item in ips %} 22 | {% if loop.last %} 23 | "{{ item }}:{{ transfer['rpc']['listen'] }}" ], 24 | {% else %} 25 | "{{ item }}:{{ transfer['rpc']['listen'] }}", 26 | {% endif %} 27 | {% endfor %} 28 | "interval": {{ agent['transfer']['interval'] }}, 29 | "timeout": {{ agent['transfer']['timeout'] }} 30 | }, 31 | "http": { 32 | "enabled": {{ agent['http']['enabled']|lower }}, 33 | "listen": ":{{ agent['http']['listen'] }}", 34 | "backdoor": {{ agent['http']['backdoor']|lower }} 35 | }, 36 | "collector": { 37 | "ifacePrefix": ["eth", "em"] 38 | }, 39 | "ignore": { 40 | {% for item in agent['ignore'] %} 41 | {% if loop.last %} 42 | "{{ item }}":true 43 | {% else %} 44 | "{{ item }}":true, 45 | {% endif %} 46 | {% endfor %} 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /site.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # Site Configuration 3 | # ================== 4 | 5 | - hosts: agent 6 | user: root 7 | roles: 8 | - common 9 | - agent 10 | tags: 11 | - agent 12 | 13 | - hosts: transfer 14 | user: root 15 | roles: 16 | - common 17 | - transfer 18 | tags: 19 | - transfer 20 | 21 | - hosts: gateway 22 | user: root 23 | roles: 24 | - common 25 | - gateway 26 | tags: 27 | - gateway 28 | 29 | - hosts: graph 30 | user: root 31 | roles: 32 | - common 33 | - graph 34 | tags: 35 | - graph 36 | 37 | - hosts: query 38 | user: root 39 | roles: 40 | - common 41 | - query 42 | tags: 43 | - query 44 | 45 | - hosts: dashboard 46 | user: root 47 | roles: 48 | - common 49 | - dashboard 50 | tags: 51 | - dashboard 52 | 53 | - hosts: sender 54 | user: root 55 | roles: 56 | - common 57 | - sender 58 | tags: 59 | - sender 60 | 61 | - hosts: fe 62 | user: root 63 | roles: 64 | - common 65 | - fe 66 | tags: 67 | - fe 68 | 69 | - hosts: portal 70 | user: root 71 | roles: 72 | - common 73 | - portal 74 | tags: 75 | - portal 76 | 77 | - hosts: hbs 78 | user: root 79 | roles: 80 | - common 81 | - hbs 82 | tags: 83 | - hbs 84 | 85 | - hosts: judge 86 | user: root 87 | roles: 88 | - common 89 | - judge 90 | tags: 91 | - judge 92 | 93 | - hosts: links 94 | user: root 95 | roles: 96 | - common 97 | - links 98 | tags: 99 | - links 100 | 101 | - hosts: alarm 102 | user: root 103 | roles: 104 | - common 105 | - alarm 106 | tags: 107 | - alarm 108 | 109 | - hosts: task 110 | user: root 111 | roles: 112 | - common 113 | - task 114 | tags: 115 | - task 116 | 117 | - hosts: aggregator 118 | user: root 119 | roles: 120 | - common 121 | - aggregator 122 | tags: 123 | - aggregator 124 | 125 | - hosts: nodata 126 | user: root 127 | roles: 128 | - common 129 | - nodata 130 | tags: 131 | - nodata 132 | -------------------------------------------------------------------------------- /roles/prepare/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # file:roles/prepare/tasks/main.yml 3 | 4 | - name: install epel 5 | yum: name=epel-release state=present 6 | 7 | - name: install golang binary 8 | yum: name={{ item }} state=present 9 | with_items: 10 | - golang 11 | - golang-godoc 12 | when: 13 | - install_go_env 14 | 15 | - name: set GOPATH 16 | template: src=golang.sh.j2 dest=/etc/profile.d/golang.sh group=root owner=root mode=0755 17 | when: 18 | - install_go_env 19 | 20 | - name: install compile tools and libs 21 | yum: name={{ item }} state=present 22 | with_items: 23 | - "@development-tools" 24 | - git 25 | - mysql-libs 26 | - mysql-devel 27 | - python-pip 28 | - python-devel 29 | - python-virtualenv 30 | when: 31 | - install_compile_env 32 | 33 | - name: clone codes 34 | git: repo=https://github.com/open-falcon/{{ item }}.git dest={{ gopath }}/{{ code_root }}/{{ item }} force=yes 35 | with_items: 36 | - agent 37 | - transfer 38 | - gateway 39 | - graph 40 | - query 41 | - sender 42 | - fe 43 | - hbs 44 | - judge 45 | - alarm 46 | - task 47 | - dashboard 48 | - portal 49 | - links 50 | - aggregator 51 | - nodata 52 | when: 53 | - clone_code 54 | 55 | - name: compile golang modules 56 | shell: export GOPATH={{ gopath }} && cd {{ gopath }}/{{ code_root }}/{{ item }} && git checkout master --force && git pull && go get ./... && ./control build && ./control pack && mv falcon-{{ item }}*.tar.gz {{ item }}.tar.gz 57 | when: "'{{ item }}' in compile or 'all' in compile" 58 | with_items: 59 | - agent 60 | - transfer 61 | - gateway 62 | - graph 63 | - query 64 | - sender 65 | - fe 66 | - hbs 67 | - judge 68 | - alarm 69 | - task 70 | - aggregator 71 | - nodata 72 | 73 | - name: complie python modules 74 | shell: cd {{ gopath }}/{{ code_root }}/{{ item }}/ && ./control pack && mv falcon-{{ item }}*.tar.gz {{ item }}.tar.gz 75 | when: 76 | - "'{{ item }}' in compile or 'all' in compile" 77 | with_items: 78 | - dashboard 79 | - portal 80 | - links 81 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Ansible Playbooks for Open-Falon 2 | ==================================== 3 | 4 | 系统需求 5 | ------------------------------------ 6 | 7 | CentOS/RHEL 6.x 8 | 9 | ansible == 1.8.4 (注意,不兼容2.x版本) 10 | 11 | 因为需要安装一些包,安装过程中需要root权限 12 | 13 | 使用方法 14 | ------------------------------------ 15 | 一. 安装基本包保平安 16 | 17 | > yum groupinstall -y 'Development tools' 18 | > 19 | > yum install -y libffi-devel 20 | > 21 | > pip install ansible==1.8.4 22 | 23 | 二. clone 代码 24 | 25 | > git clone https://github.com/iambocai/falcon-playbook.git 26 | 27 | 28 | 三. 洗手,准备环境: 29 | 30 | > cd falcon-playbook 31 | > 32 | > ansible-playbook prepare.yml -c local 33 | 34 | 35 | 四. 参照open-falcon的官方文档初始化redis 和mysql,参见 [这里](http://book.open-falcon.com/zh/install/prepare.html),请确保redis和mysql都开放了对相关模块的读写权限。 36 | 37 | 五. 修改hosts文件中的配置,*注意是这个项目里带的这个哦!不是系统的hosts文件*, 按照你的实际情况修改数据库配置和各个模块的机器列表,并为需要安装模块的机器对这台机器添加ssh key授权(如果担心安全因素,安装完删除本地私钥即可),授权完成后运行`ansible '*' -i ./hosts -m shell -a 'date'`,确保安装机可以顺利登陆所有被安装机器,如果出现异常请参考ansible帮助文档自助解决。正常的输出类似下面 38 | 39 | >[root@cs ~]# ansible '*' -i ./hosts -m shell -a 'date' 40 | 41 | > 192.168.70.128 | success | rc=0 >> 42 | 43 | > Tue Jul 7 16:10:44 CST 2015 44 | 45 | > 46 | 47 | > 192.168.70.129 | success | rc=0 >> 48 | 49 | > Tue Jul 7 16:10:51 CST 2015 50 | 51 | 六. 运行安装 52 | 53 | > ansible-playbook -i ./hosts site.yml 54 | 55 | 56 | 七. enjoy 57 | 58 | 59 | FAQ 60 | ------------------------------------ 61 | 一. open-falcon安装在哪个用户/目录下? 我可以修改么? 62 | 63 | 所有模块默认都安装在falcon账号的/home/falcon/${module}目录下,可以通过修改group_vars/all中的”deploy config“段自行重定义 64 | 65 | 二. 我想安装单个模块,怎么操作? 66 | 67 | 以单独安装agent为例:`ansible-playbook -i ./hosts site.yml -t agent` 即可, 你还可以通过逗号指定安装任意模块,比如:`ansible-playbook -i ./hosts site.yml -t agent,transfer,task` 68 | 69 | 三. 模块的配置是用playbook通过模板生成的,配置中的参数来自很多地方,我要修改参数的时候应该找哪个文件修改? 70 | 71 | 为了避免让初级用户在使用前修改过多配置文件,我将falcon配置中的数据抽为两类:一类是用户必须自定义的(各个模块的机器列表,数据库连接配置),放在hosts文件中,一类是用户在安装时可以不关心的(读写超时等,除了第一类的 :) ),放在group_vars/all里 72 | 如果你在两个文件中都没找到,恩,那他就是固化的写在模板文件里了,你可以修改roles/${module}/templates/cfg.json.j2来达到目的。 73 | 74 | 75 | 相关项目 76 | ------------------------------------ 77 | 78 | [Ansible](http://www,ansible.com) 79 | 80 | [Open-Falcon](http://www.open-falcon.com) 81 | 82 | Licence 83 | ------------------------------------ 84 | Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 85 | -------------------------------------------------------------------------------- /roles/transfer/templates/cfg.json.j2: -------------------------------------------------------------------------------- 1 | { 2 | "debug": {{ transfer['debug']|lower }}, 3 | "minStep": {{ transfer['minStep'] }}, 4 | "http": { 5 | "enabled": true, 6 | "listen": "0.0.0.0:{{ transfer['http']['listen'] }}" 7 | }, 8 | "rpc": { 9 | "enabled": true, 10 | "listen": "0.0.0.0:{{ transfer['rpc']['listen'] }}" 11 | }, 12 | "socket": { 13 | "enabled": false, 14 | "listen": "0.0.0.0:4444", 15 | "timeout": 3600 16 | }, 17 | "judge": { 18 | "enabled": {{ transfer['judge']['enabled']|lower }}, 19 | "batch": {{ transfer['judge']['batch'] }}, 20 | "connTimeout": {{ transfer['judge']['connTimeout'] }}, 21 | "callTimeout": {{ transfer['judge']['callTimeout'] }}, 22 | "maxConns": {{ transfer['judge']['maxConns'] }}, 23 | "maxIdle": {{ transfer['judge']['maxIdle'] }}, 24 | "replicas": {{ transfer['judge']['replicas'] }}, 25 | "cluster": { 26 | {% for host in groups['judge'] %} 27 | {% if loop.last %} 28 | "judge-{{ loop.index }}" : "{{ host }}:{{ judge['rpc']['listen'] }}" 29 | {% else %} 30 | "judge-{{ loop.index }}" : "{{ host }}:{{ judge['rpc']['listen'] }}", 31 | {% endif %} 32 | {% endfor %} 33 | } 34 | }, 35 | "graph": { 36 | "enabled": {{ transfer['graph']['enabled']|lower }}, 37 | "batch": {{ transfer['graph']['batch'] }}, 38 | "connTimeout": {{ transfer['graph']['connTimeout'] }}, 39 | "callTimeout": {{ transfer['graph']['callTimeout'] }}, 40 | "maxConns": {{ transfer['graph']['maxConns'] }}, 41 | "maxIdle": {{ transfer['graph']['maxIdle'] }}, 42 | "replicas": {{ transfer['graph']['replicas'] }}, 43 | "cluster": { 44 | {% for host in groups['graph'] %} 45 | {% if loop.last %} 46 | "graph-{{ loop.index }}" : "{{ host }}:{{ graph['rpc']['listen'] }}" 47 | {% else %} 48 | "graph-{{ loop.index }}" : "{{ host }}:{{ graph['rpc']['listen'] }}", 49 | {% endif %} 50 | {% endfor %} 51 | } 52 | }, 53 | "tsdb": { 54 | "enabled": {{ transfer['tsdb']['enabled']|lower }}, 55 | "batch": {{ transfer['tsdb']['batch'] }}, 56 | "connTimeout": {{ transfer['tsdb']['connTimeout'] }}, 57 | "callTimeout": {{ transfer['tsdb']['callTimeout'] }}, 58 | "maxConns": {{ transfer['tsdb']['maxConns'] }}, 59 | "maxIdle": {{ transfer['tsdb']['maxIdle'] }}, 60 | "retry": {{ transfer['tsdb']['retry'] }}, 61 | "address": "{{ transfer['tsdb']['address'] }}" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /hosts: -------------------------------------------------------------------------------- 1 | [all:vars] 2 | # redis 服务器地址 3 | redis=127.0.0.1:6379 4 | 5 | # fe模块连uic数据库使用的连接参数 6 | dsn_fe_uic=root:@tcp(127.0.0.1:3306)/uic?charset=utf8&loc=Asia%2FChongqing 7 | 8 | # task模块graph数据库使用的连接参数 9 | dsn_task_graph=root:@tcp(127.0.0.1:3306)/graph?loc=Local&parseTime=true 10 | 11 | # hbs模块连portal数据库使用的连接参数 12 | dsn_hbs_portal=root@tcp(127.0.0.1:3306)/falcon_portal?loc=Local&parseTime=true 13 | 14 | # graph模块连接graph数据库使用的连接参数 15 | dsn_graph_graph=root:@tcp(127.0.0.1:3306)/graph?loc=Local&parseTime=true 16 | 17 | # aggregator模块连接portal数据库使用到连接参数 18 | dsn_aggregator_portal=root@tcp(127.0.0.1:3306)/falcon_portal?loc=Local&parseTime=true 19 | 20 | # nodata模块连接portal数据库使用到连接参数 21 | dsn_nodata_portal=root@tcp(127.0.0.1:3306)/falcon_portal?loc=Local&parseTime=true&wait_timeout=604800 22 | 23 | # dashboard模块连dashboard数据库使用的连接参数 24 | dsn_dashboard_dashboard_host=127.0.0.1 25 | dsn_dashboard_dashboard_port=3306 26 | dsn_dashboard_dashboard_user=root 27 | dsn_dashboard_dashboard_pass="" 28 | dsn_dashboard_dashboard_name=dashboard 29 | 30 | # dashboard模块连graph数据库使用的连接参数 31 | dsn_dashboard_graph_host=127.0.0.1 32 | dsn_dashboard_graph_port=3306 33 | dsn_dashboard_graph_user=root 34 | dsn_dashboard_graph_pass="" 35 | dsn_dashboard_graph_name=graph 36 | 37 | # portal模块连portal数据库使用的连接参数 38 | dsn_portal_portal_host=127.0.0.1 39 | dsn_portal_portal_port=3306 40 | dsn_portal_portal_user=root 41 | dsn_portal_portal_pass="" 42 | dsn_portal_portal_name=falcon_portal 43 | 44 | # links模块连links数据库使用的连接参数 45 | dsn_links_links_host=127.0.0.1 46 | dsn_links_links_port=3306 47 | dsn_links_links_user=root 48 | dsn_links_links_pass="" 49 | dsn_links_links_name=falcon_links 50 | 51 | # 因为用户可能会自己在模块前面自己做负载均衡以至配置域名,所以把页面里用到的链接都抽取出来放在这里统一管理,如果你没有负载均衡,只改IP就好 52 | # 监控规则配置页面地址(内网、外网) 53 | portal_uri=http://110.120.119.122:5050 54 | # 监控数据查看页面地址(内网、外网) 55 | dashboard_uri=http://110.120.119.122:8081 56 | # 未恢复报警页面地址(内网、外网) 57 | alarm_uri=http://110.120.119.122:9912 58 | # links的页面地址(内网) 59 | links_uri=http://127.0.0.1:5090 60 | # 导航/uic页面地址(内网) 61 | fe_uri=http://127.0.0.1:1234 62 | # 导航/uic页面地址(外网) 63 | fe_ext_uri=http://110.120.119.122:1234 64 | # Query模块的页面地址(内网) 65 | query_uri=http://127.0.0.1:9966 66 | 67 | # 以下是各个模块需要部署的机器列表,请根据实际情况自行调整 68 | 69 | [agent] 70 | 127.0.0.1 transfer_ip=127.0.0.1,127.0.0.1 71 | [agent:vars] 72 | # agent保持最新的使用的心跳服务器ip 73 | heartbeat_ip=127.0.0.1 74 | 75 | [transfer] 76 | 127.0.0.1 77 | [graph] 78 | 127.0.0.1 79 | [query] 80 | 127.0.0.1 81 | [dashboard] 82 | 127.0.0.1 83 | [sender] 84 | 127.0.0.1 85 | [fe] 86 | 127.0.0.1 87 | [portal] 88 | 127.0.0.1 89 | [hbs] 90 | 127.0.0.1 91 | [judge] 92 | 127.0.0.1 93 | [links] 94 | 127.0.0.1 95 | [alarm] 96 | 127.0.0.1 97 | [task] 98 | 127.0.0.1 index_quartz="0 0 0 ? * 0-5" 99 | [gateway] 100 | #gateway监听端口与transfer相同,不能和transfer同机器部署 101 | #127.0.0.1 102 | #127.0.0.1 103 | [aggregator] 104 | 127.0.0.1 id_begin=1 id_end=-1 105 | [aggregator:vars] 106 | # aggregator汇报数据使用的transfer或gateway服务器ip 107 | transfer_ip=127.0.0.1 108 | 109 | [nodata] 110 | 127.0.0.1 111 | [nodata:vars] 112 | transfer_ip=127.0.0.1 113 | 114 | -------------------------------------------------------------------------------- /group_vars/all: -------------------------------------------------------------------------------- 1 | 2 | ## -------------- global ------------## 3 | 4 | # set GOPATH 5 | gopath: /home/falcon/golang 6 | # open-falcon project code root, relative to gopath 7 | code_root: src/github.com/open-falcon 8 | 9 | # a list of modules should be compiled befor install, 10 | # "all" means all modules 11 | compile: 12 | - all 13 | # - agent 14 | # - transfer 15 | # - graph 16 | # - query 17 | # - hbs 18 | # - task 19 | 20 | # deploy config 21 | deploy_root: /home/falcon 22 | deploy_group: falcon 23 | deploy_gid: 600 24 | deploy_user: falcon 25 | deploy_uid: 600 26 | 27 | ## -------------- prepare ------------## 28 | 29 | # whether to install golang environment on this host? 30 | install_go_env: yes 31 | 32 | # whether to install compile tools on this host? 33 | install_compile_env: yes 34 | 35 | # whether clone code (in order to compile and deploy)? 36 | clone_code: yes 37 | 38 | 39 | ## -------------- agent --------------## 40 | 41 | agent: 42 | debug: false 43 | # if you want to use host ip as key, 44 | # modify to hostname: "{{ ansible_default_ipv4['address'] }}" 45 | hostname: "" 46 | plugin: 47 | enabled: false 48 | git: https://github.com/open-falcon/plugin.git 49 | heartbeat: 50 | enabled: true 51 | addr: 127.0.0.1:6030 52 | interval: 60 53 | timeout: 1000 54 | transfer: 55 | enabled: true 56 | addr: 127.0.0.1:8433 57 | interval: 60 58 | timeout: 1000 59 | http: 60 | enabled: true 61 | listen: 1988 62 | backdoor: false 63 | ignore: 64 | - cpu.busy 65 | - cpu.nice 66 | 67 | ## --------------- transfer -----------## 68 | transfer: 69 | debug: false 70 | minStep: 30 71 | http: 72 | listen: 6060 73 | rpc: 74 | listen: 8433 75 | judge: 76 | enabled: true 77 | batch: 200 78 | connTimeout: 1000 79 | callTimeout: 5000 80 | maxConns: 32 81 | maxIdle: 32 82 | replicas: 500 83 | graph: 84 | enabled: true 85 | batch: 200 86 | connTimeout: 1000 87 | callTimeout: 5000 88 | maxConns: 32 89 | maxIdle: 32 90 | replicas: 500 91 | tsdb: 92 | enabled: false 93 | batch: 200 94 | connTimeout: 1000 95 | callTimeout: 5000 96 | maxConns: 32 97 | maxIdle: 32 98 | retry: 3 99 | address: 127.0.0.1:8088 100 | 101 | ## --------------- gateway -----------## 102 | gateway: 103 | debug: false 104 | http: 105 | listen: 6060 106 | rpc: 107 | listen: 8433 108 | transfer: 109 | enabled: true 110 | batch: 200 111 | connTimeout: 1000 112 | callTimeout: 5000 113 | maxConns: 32 114 | maxIdle: 32 115 | 116 | ## --------------- graph --------------## 117 | graph: 118 | debug: false 119 | http: 120 | listen: 6071 121 | rpc: 122 | listen: 6070 123 | rrd: 124 | storage: /home/falcon/data/graph/6070 125 | db: 126 | maxIdle: 4 127 | callTimeout: 5000 128 | migrate: 129 | enabled: false 130 | concurrency: 2 131 | replicas: "{{ transfer['graph']['replicas'] }}" 132 | 133 | 134 | ## --------------- query --------------## 135 | query: 136 | debug: false 137 | http: 138 | enabled: true 139 | listen: 9966 140 | graph: 141 | connTimeout: 1000 142 | callTimeout: 5000 143 | maxConns: 200 144 | maxIdle: 50 145 | replicas: 500 146 | api: 147 | max: 500 148 | 149 | 150 | ## ------------- dashboard ------------## 151 | install_dashboard_env: yes 152 | dashboard: 153 | gunicorn: 154 | workers: 4 155 | bind: 8081 156 | config: 157 | debug: false 158 | secret_key: secret-key 159 | session_cookie_name: open-falcon 160 | permanent_session_lifetime: 3600 * 24 * 30 161 | site_cookie: open-falcon-ck 162 | 163 | ## --------------- sender -------------## 164 | sender: 165 | debug: false 166 | http: 167 | listen: 6066 168 | Redis: 169 | maxIdle: 5 170 | worker: 171 | sms: 10 172 | mail: 50 173 | api: 174 | sms: http://11.11.11.11:8000/sms 175 | mail: http://11.11.11.11:8000/mail 176 | 177 | ## --------------- fe -----------------## 178 | fe: 179 | log_level: info 180 | company: MI 181 | http: 182 | listen: 1234 183 | cache: 184 | enabled: true 185 | idle: 10 186 | max: 1000 187 | timeout: 188 | conn: 10000 189 | read: 5000 190 | write: 5000 191 | salt: "" 192 | canRegister: true 193 | ldap: 194 | enabled: false 195 | addr: ldap.example.com:389 196 | baseDN: dc=example,dc=com 197 | bindDN: cn=mananger,dc=example,dc=com 198 | bindPasswd: 12345678 199 | userField: uid 200 | uic: 201 | idle: 10 202 | max: 100 203 | 204 | ## ------------- portal ---------------## 205 | install_portal_env: yes 206 | portal: 207 | gunicorn: 208 | workers: 4 209 | bind: 5050 210 | config: 211 | debug: false 212 | uic_token: "" 213 | contact: admin@localdomain 214 | secret_key: 4e.5tyg8-u9ioj 215 | session_cookie_name: falcon-portal 216 | permanent_session_lifetime: 3600 * 24 * 30 217 | 218 | ## --------------- hbs ----------------## 219 | hbs: 220 | debug: false 221 | maxIdle: 100 222 | rpc: 223 | listen: 6030 224 | http: 225 | listen: 6031 226 | 227 | ## --------------- judge -------------## 228 | judge: 229 | debug: false 230 | debugHost: nil 231 | remain: 11 232 | http: 233 | listen: 6081 234 | rpc: 235 | listen: 6080 236 | Hbs: 237 | timeout: 300 238 | interval: 60 239 | alarm: 240 | enabled: true 241 | minInterval: 300 242 | Redis: 243 | maxIdle: 5 244 | connTimeout: 5000 245 | readTimeout: 5000 246 | writeTimeout: 5000 247 | 248 | ## --------------- links -------------## 249 | install_links_env: yes 250 | links: 251 | gunicorn: 252 | workers: 4 253 | bind: 5090 254 | config: 255 | debug: false 256 | secret_key: 4e.5tyg8-u9ioj 257 | session_cookie_name: falcon-links 258 | permanent_session_lifetime: 3600 * 24 * 30 259 | 260 | ## --------------- alarm -------------## 261 | alarm: 262 | debug: false 263 | uicToken: "" 264 | http: 265 | listen: 9912 266 | Redis: 267 | maxIdle: 5 268 | 269 | ## --------------- task --------------## 270 | task: 271 | debug: false 272 | http: 273 | listen: 8001 274 | index: 275 | maxIdle: 4 276 | autoDelete: true 277 | collector: 278 | cluster: 279 | - graph 280 | - transfer 281 | - task 282 | 283 | ## --------------- aggregator -------## 284 | aggregator: 285 | debug: false 286 | http: 287 | listen: 6055 288 | database: 289 | idle: 10 290 | interval: 55 291 | 292 | ## --------------- nodata -----------## 293 | nodata: 294 | debug: false 295 | http: 296 | listen: 6090 297 | query: 298 | connectTimeout: 5000 299 | requestTimeout: 30000 300 | config: 301 | maxIdle: 4 302 | collector: 303 | batch: 200 304 | concurrent: 10 305 | sender: 306 | connectTimeout: 5000 307 | requestTimeout: 30000 308 | batch: 500 309 | block: 310 | threshold: 32 311 | 312 | ## --------------- misc -------------## 313 | port: 314 | http: 315 | agent: "{{ agent['http']['listen'] }}" 316 | transfer: "{{ transfer['http']['listen'] }}" 317 | gateway: "{{ gateway['http']['listen'] }}" 318 | graph: "{{ graph['http']['listen'] }}" 319 | query: "{{ query['http']['listen'] }}" 320 | sender: "{{ sender['http']['listen'] }}" 321 | fe: "{{ fe['http']['listen'] }}" 322 | hbs: "{{ hbs['http']['listen'] }}" 323 | judge: "{{ judge['http']['listen'] }}" 324 | alarm: "{{ alarm['http']['listen'] }}" 325 | task: "{{ task['http']['listen'] }}" 326 | dashboard: "{{ dashboard['gunicorn']['bind'] }}" 327 | portal: "{{ portal['gunicorn']['bind'] }}" 328 | links: "{{ links['gunicorn']['bind'] }}" 329 | aggregator: "{{ aggregator['http']['listen'] }}" 330 | nodata: "{{ nodata['http']['listen'] }}" 331 | health: 332 | agent: /health 333 | transfer: /health 334 | gateway: /health 335 | graph: /health 336 | query: /health 337 | sender: /health 338 | fe: /health 339 | hbs: /health 340 | judge: /health 341 | alarm: /health 342 | task: /health 343 | dashboard: / 344 | portal: /api/health 345 | links: /api/health 346 | aggregator: /health 347 | nodata: /health 348 | --------------------------------------------------------------------------------