Professional Documents
Culture Documents
Opens Stack ResourceGroup
Opens Stack ResourceGroup
TEHNIKI FAKULTET
Diplomski sveuilini studij raunarstva
Rikardo Jakus
0069058561
Rijeka, oujak 2016.
Enzo Licul
0069058647
Sadraj
1.
2.
3.
ResourceChain .................................................................................................................... 1
1.1.
1.2.
ResourceGroup .................................................................................................................... 3
2.1.
2.2.
2.3.
Skaliranje ..................................................................................................................... 5
2.4.
2.5.
Literatura ........................................................................................................................... 13
1. ResourceChain
ResourceChain stvara resurse koji mogu biti meusobno ovisni jedni o drugom. Npr.
moe se koristiti pri odreivanju koji e resursi biti napravljeni u odreenoj fazi razvoja neke
aplikacije.
1.1. Opis sintakse, parametara i mogunosti
Primjer sintakse:
resources:
MyChainResource:
type: OS::Heat::ResourceChain
properties:
resources: <list>
#vrsta resursa koju dodajemo unutar ugnijeenog stoga
concurrent: <boolean>
#opcijonalno; zadana vrijednost je false
resource_properties:
#svojstva koja proslijeujemo svakom predloku u lancu
heat_template_version: 2015-04-30
parameters:
string-length:
type: number
resources:
my-chain:
type: OS::Heat::ResourceChain
properties:
resources: ['OS::Heat::RandomString',
'OS::Heat::RandomString']
# Za RandomString resource ID je podeen da poprima
# nasumian string, one duljine koju korisnik odabere
# putem get_parm kao vrijednost
resource_properties: length: { get_param: stringlength }
# svakom predloku u lancu prosljeujemo duinu
stringa
outputs:
resource-ids:
value: { get_attr: [my-chain, refs] }
resource-0-value:
value: { get_attr: [my-chain, resource.0, value] }
# definira kojem e se ugnijeenom atributu
# resursa pristupiti, u ovom sluaju pristupamo 'value'
all-resource-attrs:
value: { get_attr: [my-chain, attributes, value] }
# isto tako moemo pristupiti listi svih vrijednosti u grupi
Kod 1.2: Osnovna skripta koja omoguava povezivanje dva RandomString Heat resursa
2. ResourceGroup
Stvara jedan ili vie ugnijeenih resursa koji su identino konfigurirani. Njegova svrha
je da korisnicima utedi vrijeme prilikom stvaranja vie jednakih resursa te samim time
poveava produktivnost korisnika, npr. stvaranje 100 identini servera.
Kljuna stvar prilikom koritenja ResourceGroup je ta da ovaj resurs omoguava
razmnoavanje bilo kojeg broja resursa izraenog kao heat stack. Povratna vrijednost prilikom
dohvaanja atributa ovog resursa je popis svih vrijednosti atributa unutar grupe resursa.
Dok e svaki resurs unutar grupe biti identino konfiguriran, ovaj resurs nam doputa
neke bazne prilagodbe za pojedine resurse unutar grupe. U daljnjem primjeru (Primjer 2.1)
slijedi prikaz dodjeljivanja razliitog imena svakom pojedinom serveru unutar jedne
ResourceGroupe.
Primjer sintakse:
resources:
my_indexed_group:
type: OS::Heat::ResourceGroup
properties:
#count-broj koliko resursa treba napravit
#oekivana integer vrijednost
#default vrijednost 1
count: 3
resource_def:
type: OS::Nova::Server
properties:
# stvara jedinstveno ime za svaki server
# koristei vlastiti index u grupi
name: my_server_%index%
image: CentOS 6.5
flavor: 4GB Performance
Kod 2.1: Skripta stvara tri servera koji imaju isti image i flavor, dok su ima imena razliita (my_server_0,
my_server_1, and my_server_2) [2]
index}.{attribute
2.3. Skaliranje
neku datoteku na disku, svi ostali posluitelji osim navedenoga e postati 'zastarjeli'. Kako bi
stvar funkcionirala, podatkovne datoteke koje trebamo promijeniti na jednoj aplikaciji treba
promijeniti i na svim ostalima.
heat_template_version: 2013-05-23
description: Template that installs a cluster of servers with a load
balancer.
parameters:
image:
type: string
label: Image name or ID
description: Image to be used for compute instance
default: ubuntu_cloud14
flavor:
type: string
label: Flavor
description: Type of instance to be used on the compute instance.
default: m1.small
key:
type: string
label: Key name
description: Name of key-pair to be installed on instance.
default: UPI
private_network:
type: string
label: Private network name or ID
description: Network to attach instance to.
default: my_net1
cluster_size:
type: number
label: Cluster size
description: Number of instances in cluster.
default: 2
servers:
type: comma_delimited_list
label: Servers
description: Comma separated list of servers in the cluster.
port_number:
type: number
label: Port number
description: Port number to proxy.
default: 80
resources:
wait_condition:
type: OS::Heat::WaitCondition
properties:
handle: { get_resource: wh }
count: 1
timeout: 600
wh:
type: OS::Heat::WaitConditionHandle
security_group:
type: OS::Neutron::SecurityGroup
properties:
name: web_server_security_group
rules:
- protocol: tcp
port_range_min: 80
port_range_max: 80
port:
type: OS::Neutron::Port
properties:
networks:
- network: { get_param: private_network }
security_groups:
- { get_resource: security_group }
replacement_policy: AUTO
tiny_cluster:
type: OS::Heat::ResourceGroup
properties:
count: { get_param: cluster_size }
resource_def:
type: OS::Nova::Server
properties:
name: server_%index%
image: { get_param: image }
flavor: { get_param: flavor }
key: { get_param: key }
networks:
- network: { get_param: private_network }
- port: { get_resource: port }
user_data_format: RAW
user_data:
str_replace:
params:
wc_notify: { get_attr: ['wh', 'curl_cli'] }
template: |
#!/bin/bash -ex
# instaliramo potrebne alate
apt-get update
apt-get -y install build-essential python python-dev
python-virtualenv nginx supervisor git
# stvaramo tiny korisnika kako bi pokrenuo proces servera
adduser --disabled-password --gecos "" tiny
# instaliramo
tiny aplikaciju
cd /home/tiny
cat >app.py <<EOF
#!/usr/bin/env python
import socket
from flask import Flask
hostname = socket.gethostname()
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello from {0}!'.format(hostname)
if __name__ == '__main__':
app.run(debug=True)
EOF
# stvaramo virtualenv i instaliramo potrebne alate
virtualenv venv
venv/bin/pip install flask gunicorn==18.0
# stvaramo tiny korisnika vlasnikom aplikacije
chown -R tiny:tiny app.py
# konfiguriramo supervisor da pokrene privatan gunicorn
# web server, i da se automatski pokrene pri bootanju i
# kad se srui (eng. crash)
# stdout i stderr logs from the server will go to
# /var/log/tiny
mkdir /var/log/tiny
cat >/etc/supervisor/conf.d/tiny.conf <<EOF
[program:tiny]
command=/home/tiny/venv/bin/gunicorn -b 127.0.0.1:8000 -w
4 --chdir /home/tiny --log-file - app:app
user=tiny
autostart=true
autorestart=true
stderr_logfile=/var/log/tiny/stderr.log
stdout_logfile=/var/log/tiny/stdout.log
EOF
supervisorctl reread
supervisorctl update
# konfiguriramo nginx kao front-end web server sa
# suprotnim proxy pravilima prema gunicorn serveru
10
#!/bin/bash -ex
# instaliramo potrebne alate
apt-get update
apt-get -y install build-essential python python-dev pythonvirtualenv supervisor haproxy
sed -i 's/ENABLED=0/ENABLED=1/' /etc/default/haproxy
# spremamo orginalnu haproxy konfiguraciju
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy_base.cfg
# stvaramo praznu listu radnih servera
>>/etc/haproxy/servers.json <<EOF
[]
EOF
# stvaramo update skriptu
cat >>/etc/haproxy/update.py <<EOF
import sys
import json
import subprocess
# napunimo servers skriptu sa metadata
metadata = json.loads(sys.stdin.read())
new_servers = json.loads(metadata.get('meta',
{}).get('servers', '[]'))
if not new_servers:
sys.exit(1)
# bad metadata
# no changes
11
cat
server, __port__))
f.close()
# ponovno uitavamo haproxy konfiguraciju
print('Reloading haproxy with servers: ' + ',
'.join(new_servers))
subprocess.call(['service', 'haproxy', 'reload'])
EOF
# stvaranje procesa koji prati haproxy
crontab -l >_crontab || true
echo "* * * * * curl -s
http://169.254.169.254/openstack/latest/meta_data.json | python
/etc/haproxy/update.py | /usr/bin/logger -t haproxy_update" >>_crontab
crontab <_crontab
rm _crontab
# notifikacija Heatu da smo gotovi
wc_notify --data-binary '{"status": "SUCCESS"}
'floating_ip:
type: OS::Nova::FloatingIP
properties:
port: { get_attr: [load_balancer, port] }
pool: net04_ext
association:
type: OS::Nova::FloatingIPAssociation
properties:
floating_ip: { get_resource: floating_ip }
server_id: { get_resources: tiny_cluster }
12
3. Literatura
[1] https://specs.openstack.org/openstack/heat-specs/specs/mitaka/resource-chains.html
[2] http://docs.openstack.org/developer/heat/template_guide/openstack.html
[3] https://developer.rackspace.com/blog/openstack-orchestration-in-depth-part-4-scaling/
13