
ãããŸã§ãå€ãã®äŒæ¥ã§å±éãããšå€§ããªåé¡ãçºçããæ°æ¥ãæ°é±éãç¹ã«ç¡èŠãããå Žåã¯æ°ãæãããããšããããŸãã ããããç¶æ³ã¯çµ¶æçã§ã¯ãããŸããã ãã®å°é£ãªäœæ¥ã«åœ¹ç«ã€ããŒã«ãšå®è·µãæ°å€ããããŸãã ãããããããã®ããŒã«ã¯ã»ãšãã©ã®å Žå1ã2æ¥ã§ç¿åŸããããç· ãåããè¿«ã£ãŠããŸãã
ããªãã¯éåžžäœã欲ããã§ããïŒ
- éçºè
ã®ãã·ã³ã§ãããžã§ã¯ããããŒã«ã«ã§è§£é€ããæ©äŒã ãã¹ãŠãŸãã¯å°ãªããšãäžéšã ãããŠãæå°éã®ãã©ã¡ãŒã¿ãŒã§Devæ§æãProdãšç°ãªãããã«ãããã®ã§ãã ããã«ããããç§ã®ãã·ã³ã§äœæ¥ããããã°ãåé¿ã§ããŸãã ãšã«ãããããéçºè
ãOS Xã§ãå¥ã®éçºè
ãWindowsã§ãDebianã§æ¬çªç°å¢ã§äœæ¥ãããã©ãã«ãåŸ
ã€å Žåãããã¯èª°ããç°å¢ãèšå®ããäœæ¥ãè¡ã£ãŠãããšããäºå®ãã«ãŠã³ãããŸããã
- ã³ã³ãœãŒã«ã®ããã€ãã®ã³ãã³ãã§ãä»»æã®ãã·ã³ãšOSã«Devæ§æããããã€ãããã ããã«ããããã°ã®ããã€ãã·ã³ã§ã®äœæ¥ãèŠå ãæžå°ããŸãã ãŸããæçæéã§ä»ã®éçºè
ããããžã§ã¯ãã«åŒãä»ããããšãã§ããŸãïŒæµ®æµªè
ã«ãªããŸãããïŒã
- æ§æã¯ãããã°ã©ããŒãšç®¡çè
ã®äž¡æ¹ã«ãšã£ãŠæç¢ºã§ãªããã°ãªããŸããã
ããã¯ãã¹ãŠãDjangoãããžã§ã¯ãã®äŸã«ã€ããŠãSalt + Vagrantã®æã§å®çŸããŸãã ããããPythonã ãã§ãªãä»ã®èšèªã§ããã»ãšãã©ã®ææ³ã¯éçºè
ã«åœ¹ç«ã¡ãŸãã
ãœãŒã¹ãžã®ãªã³ã¯ãããã«æäŸããŸãïŒ
bitbucket.org/awnion/salt-django-deployãœã«ããšã¯ïŒ
Saltã«ç²ŸéããŠããå Žåã¯ããã®ã»ã¯ã·ã§ã³ãã¹ãããã§ããŸãã
Saltã¯ã¯ã©ã¹ã¿ãŒç®¡çïŒã¯ã©ã¹ã¿ãŒãªãŒã±ã¹ãã¬ãŒã·ã§ã³ïŒã®ããã®éåžžã«åŒ·åãªããŒã«ã§ãããç§ã®å人çãªæèŠã§ã¯ã1å°ã®ãã·ã³ã§äœ¿çšããŠãååã«æ£åœåãããéå°ã«ãªããŸããïŒå€§ãŸãã«èšããšãããŒã ã«1人ã®éçºè
ããããªããã°ãããã¯äœ¿çšãã¹ãã§ã¯ãããŸããããŒãžã§ã³ç®¡çã·ã¹ãã ïŒã
ãœã«ãç¶æ
ã¯ããã·ã³ãã©ã®ç¶æ
ã«ããã¹ãããèšè¿°ããslsæ¡åŒµåãæã€YAMLãã¡ã€ã«ã§ãã ããšãã°ããã®ãã¡ã€ã«ã¯ããã«ããå¿
èŠãããããã®ãµãŒãã¹ã¯èµ·åãããŠããå¿
èŠãããããã®ãŠãŒã¶ãŒã¯ãã®ãããªæš©éãæã£ãŠããå¿
èŠããããŸãã Saltã§ã¯ãã·ã¹ãã ãŠãŒãã£ãªãã£ïŒaptãrpmãcronãinitã¹ã¯ãªãããããŸããŸãªæ§æïŒã®ç¶æ
ãç¶æã§ããã ãã§ãªããããšãã°ããã®ãããªãŠãŒã¶ãŒãRabbitMQã«ååšãããã©ãããææ°ããŒãžã§ã³ã®gitãªããžããªããã¹ãŠã®ããã±ãŒãžãååšãããã©ããã確èªã§ããŸãvirtualenvãªã©ã æ¡ä»¶ã®å®å
šãªãªã¹ãã¯ããã
docs.saltstack.com/ref/states/allã«ãããç§ã®æèŠã§ã¯éåžžã«å°è±¡çã§ãã
å¡©ã«é¢ããããã€ãã®äºå®
- Saltã¯ãèšå®ãã¡ã€ã«ããã³ç¶æ
ãã¡ã€ã«ã®ãã³ãã¬ãŒãèšèªãšããŠJinjaã䜿çšããŸãã ããã¯ä¿¡ããããªãã»ã©äŸ¿å©ã§ãèšå®ã§ãDRYããã©ããŒã§ããŸãã
- ãœã«ãã¯ããã§ã«AppleãNASAãLinkedInãªã©ã®äŒæ¥ã§äœ¿çšãããŠããŸãã
- Saltã¯Pythonã§æžãããŠããŸããã䜿çšããããã«Pythonãç¥ã£ãŠããå¿
èŠã¯ãããŸããã
- Saltã®PDFããã¥ã¡ã³ãã¯çŽ1000ããŒãžã§ãéåžžã«ãã£ãããšæžãããŠããŸãã ããã«ã¯ãAPIã®èª¬æã ãã§ãªããäœ¿çšæ¹æ³ãšäŸããããŸãã
éçºèšå®
ç§ã®æèŠã§ã¯ãåªãã䟿å©ãªéçºç°å¢ã®éèŠæ§ãé倧è©äŸ¡ããããšã¯å°é£ã§ãã ãã ããããã¹ãŠãèªåçšã«ãèšå®ããã«ã¯ãæ°æ¥ãŸãã¯1é±éãããå ŽåããããŸãã ãããã®æ¥ãå°æ¥ååã«ä¿åãã1ã€ã®ã³ãã³ãã§ãããžã§ã¯ãã®çŸåšã®ããŒãžã§ã³ãäžããããšãã§ããæ§æãäœæããŸãããã
git clone <repo_url> && cd <repo_name> && vagrant up
ããŠãããã¯å®éã«ã¯3ã€ã®ããŒã ã§ããããã£ãšç°¡åã«ã§ãããªã-ç§ã¯ããªãã®æãæ¯ãã
ãããã£ãŠã
Vagrantã§ devæ§æãæ§ç¯ããŸãïŒVagrantã«ç²ŸéããŠããªã人ã®ããã«ããäŒãããããšã匷ããå§ãããŸãïŒã
mkdir my_app && cd my_app git init vagrant init
Vagrantã®gitãªããžããªãšèšå®ãmy_appãã©ã«ããŒã«è¡šç€ºãããŸããã
次ã«ã
Vagrantfileã®å
å®¹ãæ¬¡ã®ãã®ã«çœ®ãæããŸãã
Vagrant.configure("2") do |config| config.vm.box = "precise64" config.vm.hostname = "dev-my-app" config.vm.network :private_network, ip: '3.3.3.3' config.vm.synced_folder "salt/roots/salt", "/srv/salt/" config.vm.synced_folder "salt/roots/pillar", "/srv/pillar/" config.vm.provision :salt do |salt| salt.minion_config = "salt/minion" salt.run_highstate = true end end
ãã®æ§æã§ã¯ãUbuntuã§ã²ã¹ããã·ã³ãäœæã§ããŸãããã¹ãåãšIPãèšå®ããæ§æã§ãã©ã®ãã©ã«ããŒãåæããããæ±ºå®ããsaltã䜿çšããŠãã·ã³ãç®çã®ç¶æ
ã«ããããšã瀺ããŸããïŒãšããã§ããããžã§ã¯ãã®ã«ãŒãã¯ããã©ã«ãã«ãªããŸãã²ã¹ããã·ã³ã®/ vagrantãã©ã«ããŒãšåæãããŸãïŒã
ããã§äœãèµ·ãã£ãŠ
ãããã«ã€ããŠè©³ããç¥ãããšãã§ããŸã
ãããã§ãç¶æ
ã説æããæºåãæŽããŸããã æ¬¡ã®å
容ã®
ãœã«ã/ãããªã³ãã¡ã€ã«ãäœæããŸãã
file_client: local
å®éããã®ãã·ã³ã¯ãã®ç¶æ
èªäœãä¿åãããšèšããŸãã ããã©ã«ãã§ã¯ãsaltã¯ãã¹ã¿ãŒãµãŒããŒããç¶æ
ãã¡ã€ã«ãååŸããããã«æ§æãããããŒã«ã«ã§ã¯/ var / cache / saltã®ã©ããã«ã®ã¿ãã£ãã·ã¥ããŸãã ãããã£ãŠãã«ã¹ã¿ã ãå¿
èŠãªãå Žåã¯ãprodãã·ã³äžã®ãã®ãã¡ã€ã«ã¯ã»ãšãã©å¿
èŠãããŸããã
次ã«ã2ã€ã®ãã©ã«ããŒãäœæããŸãã
mkdir -p salt/roots/pillar mkdir -p salt/roots/salt
æåã®å€æ°ã¯ããŸããŸãªå€æ°ãæ ŒçŽãã2çªç®ã®å€æ°ã¯ã²ã¹ããã·ã³ã®ç¶æ
ãã©ã«ããŒã§ãã
ãã¡ã€ã«
salt / roots / salt / top.slsãäœæããŸã
base: 'dev-my-app': - nginx - python - supervisor
ãæ³åã®ãšãããslsã¯yamlã«éåžžã«äŒŒãŠããŸãã ããããããã§ã®äž»ãªéãã¯ãslsã¯ãã¹ãŠã®çµæã䌎ãjinjaãã³ãã¬ãŒãã§ãããããšã§ãïŒåŸã§å®éã«ã¡ãªãããããããšãããããŸãïŒã
baseã¯ãä»®æ³ã¯ã©ã¹ã¿ãŒã®ç¶æ
æ§æã®ååã§ãã dev-my-appã¯ãã²ã¹ããã·ã³ã®ãã¹ãåã§ãã ããã§ã¯ããã¿ãŒã³ãããã³ã°ã䜿çšãããŸããã€ãŸãããdev- *ããæå®ã§ããŸãã以äžã®ãã¹ãŠã®ç¶æ
ã¯ãdev-alphaãdev-foobarãªã©ã®ãã¹ãŠã®ãã·ã³ã«é©çšãããŸãã 以äžã¯ã説æããå¿
èŠãããå·ã®ãªã¹ãã§ãã
pythonãnginxãsupervisorã®å®£èšãããç¶æ
ãäœæããŸãã
salt / roots / salt / python.sls
salt / roots / salt / nginx.sls
salt / roots / salt / Supervisor.sls supervisor: pkg: - installed service: - running - require: - pkg: supervisor
ãã®ãããã
vagrant up ãããã§ã«å®è¡ã§ããŸãã ãã®æé ã§ã¯ãUbuntuã€ã¡ãŒãžãããŠã³ããŒããïŒã€ã¡ãŒãžãã£ãã·ã¥ã«ãŸã ãªãå ŽåïŒãããã«saltãã€ã³ã¹ããŒã«ããç¶æ
ã®åæãéå§ããŸãã
ããã§ãã²ã¹ããã·ã³ã«pythonãsupervisorãnginxãã§ããŸããã
vagrant sshãä»ããŠãã·ã³ã«
ã¢ã¯ã»ã¹ãããã
3.3.3.3ã«ã¢ã¯ã»ã¹ããŠç¢ºèªã§ããŸãã
ãããŸã§ã®ãšããããã¹ãŠãã·ã³ãã«ã«æããŸãã ç¶ããïŒ
æ±å€æ°ãäœæããŸãã
å¡©/æ ¹/æ±/top.sls base: 'dev-my-app': - my-app
å¡©/æ ¹/æ±/ my-app.sls my_app: gunicorn_bind: 127.0.0.1:8000 dns_name: dev.my-app.com venv_dir: /home/vagrant/my_app_env work_dir: /vagrant
æåã®ãã¡ã€ã«ã¯ãdev-my-appãã¹ãã«my-app configãã倿°ãå²ãåœãŠãããŠããããšã瀺ããŠããŸãã 2çªç®ã®ãã¡ã€ã«ã¯ãå®éã®å€æ°ãã®ãã®ã§ãã
次ã«ãDjangoã¢ããªã±ãŒã·ã§ã³ã®æ§æç¶æ
çšã®ãã©ã«ããŒãäœæããŸãã
mkdir -p salt/roots/salt/my_app
salt / roots / salt / my_app / init.sls {% set my_app = pillar['my_app'] %} my_app.venv: virtualenv.managed: - name: {{ my_app['venv_dir'] }} - system_site_packages: False - require: - pkg: python my_app.pip: pip.installed: - bin_env: {{ my_app['venv_dir'] }} - names: - Django==1.6 - gunicorn==18.0 - require: - virtualenv: my_app.venv my_app.nginx.conf: file.managed: - name: /etc/nginx/sites-enabled/my_app.conf - source: salt://my_app/nginx.my_app.conf - context:
ãã³ã ïŒäŸåé¢ä¿ãrequireãwatchãªã©ãæ§ç¯ããå Žåãç¶æ
ã¯ã©ã³ãã ãªé åºã§ãã§ãã¯ãããããšã«æ³šæããŠãã ããã ãã®èšäºãäœæãããšããç§ã¯ãã®çš®ã®ééããç¯ããŸãããdjangoããã³gunicornããã±ãŒãžã¯ããŸã äœæãããŠããªãvirtualenvã«ã€ã³ã¹ããŒã«ããããšããŸããã
salt / roots / salt / my_app / nginx.my_app.conf server { listen 80; server_name {{ dns_name }} _; location / { proxy_pass http://{{ bind }}; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
salt / roots / salt / my_app / supervisor.my_app.conf [program:{{ app_name }}] command={{ gunicorn }} {{ app_name }}.wsgi:application -b {{ bind }} -w {{ workers }} directory={{ directory }} user=nobody autostart=true autorestart=true redirect_stderr=true
æ°ããäœæãããç¶æ
ã
salt / roots / salt / top.slsã«è¿œå ããŸã base: 'dev-my-app': - nginx - python - supervisor - my_app
ã»ãŒå®äºã§ãã ããããæãéèŠãªããšã¯ãããŸãã-æ¶ç©ºã®Djangoã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã§ãã æ¬¡ã®ããã«ç©ºã®ãã¹ãDjangoãããžã§ã¯ããäœæããŸãããã
vagrant provision
ãã®ããã»ã¹ã«ã¯æ°åããããŸãïŒã»ãšãã©ã®å Žåãdjangoãšgunicornã¯virtualenvã«ã€ã³ã¹ããŒã«ãããŸãïŒã
ããããžã§ãã³ã°ãæ©èœããããã²ã¹ããã·ã³ã«ç§»åããŸãã
vagrant ssh
å
éšã§ã¯æ¬¡ã®ããšãè¡ããŸãã
/home/vagrant/my_app_env/bin/django-admin.py startproject my_app /vagrant exit
ãŸãããã¹ããã·ã³ã§
vagrant provisionãå®è¡ããhostsãã¡ã€ã«ã§ãã¹ãŠãæ©èœããããšã確èªããããã«ãäžæçã«ã¡ã¢ããŸãã
dev.my-app.com 3.3.3.3
ãã©ãŠã¶ãŒã§
dev.my-app.comã«ã¢ã¯ã»ã¹ãããšããã¹ãŠãããŸãããã°ãããŸããã
ãŸããïŒéçºæ§æãæ§ç¯ãããŸãã ã³ãããã§ããŸãã
å人ã«ãããžã§ã¯ãã§éã³ãäžãããå Žåã圌ã¯
git cloneãš
vagrant upãè¡ãã ãã§ãã ããã«ããã®æ¶ç©ºã®å人ã¯ããããžã§ã¯ãèªäœã®ãœãŒã¹ã³ãŒããåãåãã ãã§ãªãããããã©ã®ããã«å±éããããã«ã€ããŠã®ã¢ã€ãã¢ãæã£ãŠããŸãã
ãšããããããã©ã«ãã§ã¯ããããžã§ã¯ãã¯gunicorn +ã¹ãŒããŒãã€ã¶ãŒã®å¶åŸ¡äžã§ç¬ç«ããŠã¹ãã³ããŸãã ãããããªã¢ãŒãã§ãªã¢ãŒãã«ãããå Žåãããæ°ã«å
¥ãã®ãªãŒããªããŒãã³ãŒãã®å€æŽãè¿ãããå Žåã¯ã©ãã§ããããïŒ è³ªåãªãïŒ
vagrant ssh supervisorctl stop my_app /home/vagrant/my_app_env/bin/python /vagrant/manage.py runserver
ããã§ã³ãŒããå®å
šã«ç·šéã§ãããã¹ãŠã®å€æŽãdjangoãµãŒããŒã«èªåçã«åæ ãããŸãã
ãŸãããã¹ããäžæçã«èª¿æŽãããŠããå ŽåãåãdjangoãµãŒããŒã
dev.my-app.comããã®ãªã¯ãšã¹ãã«å¿çããŸãã
è£œåæ§æ
ããã§ãæãéèŠãªããšã«å°éããŸããã prod-my-appã«ãããã€ããããšãæ³å®ããŠããŸãã
次ã«ãsalt-masterïŒä»¥äžãåã«ãã¹ã¿ãŒïŒçšã«å¥ã®ãµãŒããŒãããç¶æ³ã§ã®å±éãªãã·ã§ã³ãæ€èšããŸãã
ãã¹ã¿ãŒæ§æã«ã³ããŒãã
/ srv / salt / top.slsã«è¿œå ã
ãŸã 'prod-my-app': - nginx - python - supervisor - my_app
ãŸãã¯ãç§ãã¡ã®å Žåããããè¡ãããšãã§ããŸãïŒ
base: '*-my-app': - nginx - python - supervisor - my_app
次ã«ã
/ srv / pillar / top.slsãã¡ã€ã«ã§åãããšã
è¡ããŸã
base: '*-my-app': - my-app
/srv/pillar/my_app.slsã§ã¯ ãã¬ã€ã¢ãŠããããã«åŸã£ãŠå€æ°ã倿ŽããŸãã
prod-my-appã§salt-minionãèšå®ããŸãã ãœã«ããããªã³ããœã«ããã¹ã¿ãŒã«æ¥ç¶ã
ãŸã ïŒå®è¡æ¹æ³ã¯
ãã¡ããã芧ãã ããïŒã
ãŠã£ã¶ãŒãã§ãæ§æã®ã¢ããªã±ãŒã·ã§ã³ãéå§ã§ããŸãã
sudo salt prod-my-app state.highstate
æ®ã£ãŠãããã®ïŒ
ãã¹ã¿ãŒãžã®æ§æã®é
ä¿¡
rsyncããgitãžã®æ¹æ³ã¯ãããããããŸãã ããã¯ãã¹ãŠããªãã®åœå
æ¿çã«äŸåããŸãã
prod-my-appãžã®ãããžã§ã¯ããœãŒã¹ã®é
ä¿¡
ããã§ããå€ãã®ãªãã·ã§ã³ããããŸãã å人çã«ã¯ãç§ã¯ãããè¡ããŸãïŒsaltãprod-my-appã§ãµããŒãããããã·ã¥ããã©ãŒã«ä¿åãããŠããç¹å®ã®ã³ãããã§gitãªããžããªããµããŒãããŸãã倿Žãããå Žåãsaltã¯äœæ¥ã®æåŸã«ãããã€ã¡ã³ãã¹ã¯ãªãããå®è¡ããŸãã
æ£çŽãªãšãããããã¯æè¯ã®æ¹æ³ã§ã¯ãããŸããããæãç°¡åãªæ¹æ³ã§ãã çæ³çã«ã¯ãããšãã°ãã€ãã£ãããã±ãŒãžãäœæãããããã©ã€ããŒãpypiãäœæããŸãã
åç
§è³æ
www.saltstack.comwww.vagrantup.comhynek.me/talks/python-deploymentsã¯ãPythonãããžã§ã¯ãã®ãããã€ã¡ã³ãã«é¢ããèŠçŽã®ã»ãããå«ãéåžžã«åœ¹ç«ã€èšäºã§ãã
PSæ®å¿µãªããšã«ãå€ãã®ããšãéããªããã°ãªããŸããã§ããããããªããšãèšäºãéæ¹ããªã倧ããªãµã€ãºã«èšããã§ããŸããŸãã æãããªãã®ããŸãã¯ããã¥ã¡ã³ãã§èŠã€ãããããã®ãèŠéãããšããŸããã ãã ããã³ã¡ã³ãã§è³ªåããŠãã ããã