Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.79 KB | None | 0 0
  1. import datetime
  2.  
  3. import yaml
  4. from ansible_vault.api import Vault
  5. from fabric.api import env, execute, get, local, put, run, task
  6.  
  7. env.user = 'root'
  8. env.now = datetime.datetime.now().strftime('%Y-%m-%dT%H-%M-%S')
  9.  
  10. env.roledefs = {
  11. 'staging': {
  12. 'hosts': ['staging.example.com']
  13. },
  14. 'production': {
  15. 'hosts': ['production.example.com']
  16. }
  17. }
  18.  
  19. env.sites = [
  20. 'example.com',
  21. 'example.org',
  22. 'example.ca',
  23. 'example.net'
  24. ]
  25.  
  26. with open('./.vault_pass') as fobj:
  27. vault = Vault(password=fobj.read().strip())
  28.  
  29. with open('./group_vars/production/vault.yml') as fobj:
  30. env.roledefs['production']['vault'] = vault.load(fobj.read())
  31.  
  32. with open('./group_vars/production/wordpress_sites.yml') as fobj:
  33. env.roledefs['production']['wp_sites'] = \
  34. yaml.load(fobj.read())['wordpress_sites']
  35.  
  36. with open('./group_vars/staging/vault.yml') as fobj:
  37. env.roledefs['staging']['vault'] = vault.load(fobj.read())
  38.  
  39. with open('./group_vars/staging/wordpress_sites.yml') as fobj:
  40. env.roledefs['staging']['wp_sites'] = \
  41. yaml.load(fobj.read())['wordpress_sites']
  42.  
  43.  
  44. def mysql_dump(db_name, export_name):
  45. run(('mysqldump {db_name} '
  46. '| gzip > /tmp/{export_name}.sql.gz').format(
  47. db_name=db_name,
  48. export_name=export_name))
  49.  
  50. get('/tmp/{0}.sql.gz'.format(export_name),
  51. '/tmp/{0}.sql.gz'.format(export_name))
  52.  
  53.  
  54. def mysql_load(db_name, export_name):
  55. put('/tmp/{0}.sql.gz'.format(export_name),
  56. '/tmp/{0}.sql.gz'.format(export_name))
  57.  
  58. run(('gunzip < /tmp/{export_name}.sql.gz | mysql -u root '
  59. '-D {db_name}').format(
  60. db_name=db_name,
  61. export_name=export_name,
  62. now=env.now))
  63.  
  64.  
  65. def get_database():
  66. role = env.effective_roles[0]
  67.  
  68. for site in env.sites:
  69. db_name = '{site}_{role}'.format(site=site.replace('.', '_'),
  70. role=role)
  71. export_name = '{site}-{now}'.format(site=site.replace('.', '_'),
  72. now=env.now)
  73.  
  74. mysql_dump(db_name, export_name)
  75.  
  76.  
  77. def put_database():
  78. role = env.effective_roles[0]
  79.  
  80. for site in env.sites:
  81. db_name = '{site}_{role}'.format(site=site.replace('.', '_'),
  82. role=role)
  83. export_name = '{site}-{now}'.format(site=site.replace('.', '_'),
  84. now=env.now)
  85.  
  86. mysql_load(db_name, export_name)
  87.  
  88.  
  89. def get_uploads():
  90. for site in env.sites:
  91. export_name = '{site}-{now}'.format(site=site.replace('.', '_'),
  92. now=env.now)
  93.  
  94. run(('tar -czvf /tmp/uploads-{export_name}.tgz '
  95. '/srv/www/{site}/shared/uploads').format(site=site,
  96. export_name=export_name))
  97.  
  98. get('/tmp/uploads-{0}.tgz'.format(export_name),
  99. '/tmp/uploads-{0}.tgz'.format(export_name))
  100.  
  101.  
  102. def put_uploads():
  103. for site in env.sites:
  104. export_name = '{site}-{now}'.format(site=site.replace('.', '_'),
  105. now=env.now)
  106.  
  107. put('/tmp/uploads-{0}.tgz'.format(export_name),
  108. '/tmp/uploads-{0}.tgz'.format(export_name))
  109.  
  110. run(('tar -xzvf /tmp/uploads-{export_name}.tgz -C /').format(
  111. export_name=export_name))
  112.  
  113.  
  114. @task
  115. def transfer(source='production', target='staging'):
  116. """Transfer database and uploads between stages."""
  117. get_database.roles = (source,)
  118. get_uploads.roles = (source,)
  119. execute(get_database)
  120. execute(get_uploads)
  121.  
  122. put_database.roles = (target,)
  123. put_uploads.roles = (target,)
  124. execute(put_database)
  125. execute(put_uploads)
  126.  
  127.  
  128. @task
  129. def deploy(stage='staging'):
  130. """Deploy changes to a stage."""
  131. for site in env.sites:
  132. local('./bin/deploy.sh {0} {1}'.format(stage, site))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement