Fabricでお手軽サーバ管理
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Fabricでお手軽サーバ管理

on

  • 107 views

#ssmjp 2014年10月 LT資料

#ssmjp 2014年10月 LT資料

Statistics

Views

Total Views
107
Views on SlideShare
76
Embed Views
31

Actions

Likes
1
Downloads
2
Comments
0

1 Embed 31

https://twitter.com 31

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Fabricでお手軽サーバ管理 Presentation Transcript

  • 1. 'BCSJDsV7´–Ï v TTNKQñK
  • 2. ߅Ãu _|c]ŸPm !/JSBUBNB ¼–¶â걖ß5 1FSMXÝžžz{f ?ß{£òÔètWiomzfÆX*[r| Xop–Öì¯è߄PrvP÷d
  • 3. 'BCSJDt{ IUUQXXXGBCGJMFPSH ¶òÖêvÆÖ죀¶¸Åß vÖê t–NTf¥—zw³T—_tX vP 1ZUIPOksÔ £êŽ1ZUIPOz¸®éÖÇ Pbtv˜|1ZUIPOs„]—_t{vŸsŽsY— 44)-,s)z´–ÏwٖŸsfÆe— ٖŸl–zݶòwP™P™£ò¸Ç–êe— «P{vP .Z42-'BCSJDt{vPse
  • 4. ”Ÿq] $IFG1VQQFUsXop– ve—zt|¶¦ê¸®é ÖÇs
  • 5. zwop]—zz¯Nk– 1ZUIPOz¸®éÖÇvzs|Öì¯èÝz€ÝW•f —tPeP X¶¦ê¸®éÖÇ vv•¤ícePWŽ
  • 6. Ô £ê fabfile.pytPRؼsÔ £ê 1ZUIPOz¸®éÖÇ Ô £ê žJe— ¾¸® 1ZUIPOzD w{vž„[ DÔ £êw Çcrá·ä–êBsY—zs|Lé XN— _RY[vorŽŠ
  • 7. from fabric.api import * @task def hostname(): run('hostname') @task def upload_module(): put('~/works/webapp/lib', '/home/user/webapp/') @task def download_logs(): get('/home/user/webapp/log/access.log') @task def reboot_httpd(): sudo('/sbin/service httpd restart')
  • 8. $PSF"1* éá–Çz²ÝòȞöí|éá–ÇtzÔ £êD ²òŬ¸ÇÝ̖·âžžok§p—sz/Ò Æ²ë–¾žžok¾¸®z[/Ò ì¯àº–·z¼Ü|ªè–¼Ü iz)å–Å¢éÅ¢
  • 9. $POUSJC"1* éá–ÇzÔ £êìf Ŭ¸ÇzðH€Ÿú|Ô  £êz#WÀ¦Â® Öì·¦®ÇŠ—`tz¡ÂÖì–È %KBOHPtz×%
  • 10. 'BCSJD
  • 11. $VJTJOF IUUQTHJUIVCDPNTFCBTUJFODVJTJOF ˜[XXcPtYwžRðH"1* šòvX•ȬäàòÇXNŠ–^˜a˜rvPzs| žRw{cuisine.pyž­Œ«PXN—
  • 12. from fabric.api import * from fabric.contrib.files import * import cuisine from pit import Pit cuisine.select_package('yum') @task def create_user(): with settings(user='root'): cuisine.user_ensure('ssmjp') append('/etc/sudoers', 'ssmjp ALL=(ALL) ALL') cuisine.ssh_authorize('ssmjp', cuisine.file_local_read('~/.ssh/ssmjp.pub')) conf = Pit.get('ssmjp-user', { 'require': { 'password': 'Your password' } }) cuisine.user_passwd('ssmjp', conf['password']) @task def install_packages(): with settings(user='root'): cuisine.package_ensure('nginx')
  • 13. 5JQT
  • 14. 44)zDPOGJHÔ £êžˆ¹e— óà{44)zDPOGJHÔ £ê{ˆ¹cvPX|’Az žcrV[tˆ¹cr[˜— *EFOUJUZGJMF1SPYZ$PNNBOEŽfr[˜—zs6q env.use_ssh_config = True
  • 15. éá–ÇwÅòÜè鯢ë®Çé éá–Çsmktemp -džöícr|try›finallys? w  ¥²e— run()zöíHQwfokÆ¢ë®ÇéØXû— def diff_hosts(): tempdir = run('mktemp -d') try: tempfile = '%s/hosts' % tempdir put('/etc/hosts', tempfile) run('diff -u /etc/hosts %s' % tempfile, warn_only=True) finally: run('rm -r %s' % tempdir)
  • 16. á·ä–êB fabfiletPRÆ¢ë®Çéw__init__.pytPRÔ £êž for|iz¯s¾¸®ž„PkÔ £êžJNQPSUe —tá·ä–êBsY— ¾¸®zcc{fab module.task‹kPvscg —
  • 17. Ô £êÖ . └── fabfile/ ├── __init__.py ├── foo.py └── math.py __init__.py import foo import math
  • 18. ȬäàòŖ¶æòÐÊ ¾¸®wȬäàòŖ¶æòÐʞÔ]rV[ t|fab -lžöícktYw¾¸®zÚtcr¼Üa˜ — @task def calc_add(x, y): ''' add two integer ''' print '%d + %d = %d' % (int(x), int(y), int(x) + int(y))
  • 19. Ú¸ÇØz v ²ÝòÈè£ò©Ö¶æòsUckÚ¸ÇØ{ FOWIPTUTs¡®º¸sY—zs|GBCGJMFQZw  Œ_tŽIÿ env.hosts = ['server1', 'server2']
  • 20. FOWSPMFEFGžcrV[t|ڸǞ3PMFsŠt rT— env.roledefs = { 'web': ['web01','web02'], 'db': ['db01'] }
  • 21. 1ZUIPO¸®éÖÇvzs|“óW•ڸǴpž­‹ Œ_tŽIÿ 1Z:".-X
  • 22. z import yaml def load_servers(filename): config_yaml = open(filename).read() config = yaml.load(config_yaml) roledefs = config['roles'] all_hosts = [] for role in roledefs: all_hosts.extend(roledefs[role]) roledefs['all'] = all_hosts return roledefs env.roledefs.update(load_servers('./servers.yaml'))
  • 23. servers.yaml roles: even: - conoha01.poi.jp - conoha03.poi.jp odd: - conoha02.poi.jp
  • 24. Ú¸Çé¸Çz„YúTtWŽIÿ host[00-03]âhost00 host01 host02 host03 import re def expand_hosts(hosts): new_hosts = [] for host in hosts: m = re.search('[(d+)-(d+)]', host) if m: pre = host[:m.start()] post = host[m.end():] prec = len(m.group(1)) for n in range(int(m.group(1)), int(m.group(2)) + 1): new_hosts.append(pre + ('%%0%dd' % prec % n) + post) else: new_hosts.append(host) return new_hosts env.hosts = expand_hosts(env.hosts)