1 of 29

How I learned to stop worrying and

love the deployment

2 of 29

投影片

3 of 29

Vinta

@vinta on GitHub / Twitter

4 of 29

StreetVoice

擔任

無法通過圖靈測試的程序員

5 of 29

DEPLOYMENT

IS

FUCKING

HARD

!!!

6 of 29

偉大的航道前半段

$ ssh root@db

$ apt-get install mysql-server

$ mysql -u root

$ ssh root@web1

$ apt-get install nginx

$ vim /etc/nginx/nginx.conf

$ service nginx restart

$ ssh root@web2

$ git clone git@github.com:OnePiece/op.git

7 of 29

雖然我們有 Fabric

但是 Fabric 也只是讓我們在 .py 裡面寫 shell script 而已

8 of 29

  • Ansible
  • Chef
  • Puppet
  • SaltStack

新世界的四皇

9 of 29

SaltStack 是什麼?

  • Configuration Management
  • Remote Execution

10 of 29

一鍵佈署

11 of 29

12 of 29

SaltStack 可以做到什麼程度?

所有你在 command line 可以做到的事情

13 of 29

為什麼要用 SaltStack?

  • 不需要寫 code
  • 其實就是一堆 YAML 格式的檔案
  • 文件很完善
  • 它是用 Python 寫的
  • 帥,自動化佈署

14 of 29

Master

$ curl -L http://bootstrap.saltstack.org | sudo sh -s -- -M -N

Minions

$ wget -O - http://bootstrap.saltstack.org | sudo sh

15 of 29

16 of 29

Components

  • Modules: 內建的 Python 函式庫
    • salt.modules.mysql.db_create('onepiece', 'utf-8')
  • States:(下一頁)
  • Pillars: 機密資訊
    • 資料庫密碼、API key、project path...
  • Grains: 系統資訊
    • hostname、num_cpus、mem_total...

17 of 29

18 of 29

SaLt State (SLS)

  • 定義每一台機器的「狀態」
    • 要安裝哪些軟體?
      • git-core 透過 apt
      • celery 透過 pip
    • 要運行哪些服務?
      • MySQL
      • RabbitMQ
      • NFS
  • 以 YAML 格式寫成,可讀性高

19 of 29

xxx.sls 長這個樣子

/etc/postgresql/9.1/main/postgresql.conf: # ID (unique)

file.managed: # state type

- template: jinja # parameters

- source: salt://postgresql/server/postgresql.conf

- user: postgres

- group: postgres

等價

postgresql-config: # 建議使用這種寫法

file.managed:

- template: jinja

- name: /etc/postgresql/9.1/main/postgresql.conf

- source: salt://postgresql/server/postgresql.conf

- user: postgres

- group: postgres

20 of 29

  • cloud
  • cmd
  • cron
  • file
  • git
  • host
  • iptables
  • mongodb_database
  • mongodb_user
  • mount
  • mysql_database
  • mysql_user
  • npm
  • pip
  • pkg
  • postgres_database
  • postgres_user
  • rabbitmq_user
  • service
  • ssh_auth
  • supervisord
  • timezone
  • user
  • virtualenv
  • ......

21 of 29

目錄結構

22 of 29

可以想成是 Python 的 module

23 of 29

top.sls

24 of 29

base: # environment

'*': # target

- common # state

'db':

- mysql.server

'vender':

- memcache.server

- rabbitmq

'web':

- nfs.client

- django

25 of 29

26 of 29

$ sudo salt '*' state.highstate

27 of 29

DEMO 一下

28 of 29

D 的意志

29 of 29

Deploy