-
Notifications
You must be signed in to change notification settings - Fork 3
/
fabfile.py
75 lines (68 loc) · 3.61 KB
/
fabfile.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from fabric2 import task, Connection
from fabric2.transfer import Transfer
import time
import getpass
HOST = 'ec2-13-53-129-145.eu-north-1.compute.amazonaws.com'
KEY_FILE = '../aws-sk.pem'
DEFAULT_LOGIN = 'demo@demo.com'
DEFAULT_PASS = 'demo'
DEFAULT_USER = 'demo'
host = Connection(host=HOST,
user='ubuntu',
port=22,
connect_kwargs={"key_filename":[KEY_FILE]})
@task
def install_instance(c):
if True or host.sudo('service docker status', hide='out', warn=True).failed:
print('Docker not found. Installing it.')
host.sudo('apt-get update')
host.sudo('apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common')
host.sudo('curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -')
host.sudo('apt-key fingerprint 0EBFCD88')
host.sudo('add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"')
host.sudo('apt-get update')
host.sudo('apt-get install -y docker-ce docker-ce-cli containerd.io')
host.sudo('usermod -a -G docker $USER')
host.sudo('docker swarm init')
print('### KEY ######################################################################')
host.run('ssh-keygen -t rsa -C "demo@demo.com" -f ~/.ssh/id_rsa -q -N ""')
host.run('cat ~/.ssh/id_rsa.pub')
print('### KEY ######################################################################')
res = 't'
while res.lower():
res = getpass.getpass('Update you github account and hit enter.')
host.run('ssh-keyscan github.com >> ~/.ssh/known_hosts')
host.run('mkdir awsdemo')
with host.cd('awsdemo'):
host.run('git clone https://github.com/creotiv/aws-docker-example.git .')
host.run('git checkout master')
host.run('docker build -t awsdemo-app app')
host.run('docker build -t awsdemo-nginx nginx')
host.run('docker stack deploy -c docker-compose.yml awsdemo')
while True:
res = host.run('docker service ls | grep awsdemo_web.*0/')
if not res.stdout.strip():
time.sleep(4)
break
time.sleep(2)
host.run('''docker exec $(docker ps -q -f name=awsdemo_web) /usr/src/app/manage.py shell -c "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser(username='%s', email='%s', password='%s')"''' % (DEFAULT_USER, DEFAULT_LOGIN, DEFAULT_PASS))
else:
print('Docker already installed.')
@task
def set_pass(c):
host.run('''docker exec $(docker ps -q -f name=awsdemo_web) /usr/src/app/manage.py shell -c "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser(username='%s', email='%s', password='%s')"''' % (DEFAULT_USER, DEFAULT_LOGIN, DEFAULT_PASS))
@task
def deploy(c):
with host.cd('awsdemo'):
host.run('git pull')
host.run('git checkout master')
host.run('docker build -t awsdemo-app app')
host.run('docker build -t awsdemo-nginx nginx')
host.run('docker service update awsdemo_web')
@task
def pgdump(c):
cid = host.run('docker container ls | grep awsdemo_db | head -c 12').stdout.strip()
host.run('''docker container exec %s sh -c "pg_dump -U awsdemo awsdemo | gzip > '/var/lib/postgresql/backups/awsdemo.gz'"''' % cid)
host.run('docker cp %s:/var/lib/postgresql/backups/awsdemo.gz /tmp/awsdemo.gz' % cid)
t = Transfer(host)
t.get('/tmp/awsdemo.gz')