Upload
michal-smereczynski
View
121
Download
1
Embed Size (px)
Citation preview
Michał Smereczyński | Cloudeon ASCloud Solution Architect
Aplikacje Python na platformie Microsoft Azurei platforma Microsoft Azure w aplikacjach Python
@smereczynskihttps://lnx.azurewebites.net
Michał Smereczyński
Linux GuyDevOps(czasami) DevArchitektKonsultant
Opcje:IaaS VM Linux WindowsPaaS WebApp Windows Linux Service Fabric Guest exec Container Container Services DC/OS Swarm Kubernetes
Projekt
app.pyrequirements.txtruntime.txtweb.configptvs_virtualenv_proxy.py
WSGI HandlerPackage ManagementVirtual Env + Python versionApp + Server configVirtual Environment Proxy
App.py
def wsgi_app(environ, start_response): status = '200 OK’ response_headers = [('Content-type', 'text/plain')] start_response(status, response_headers) response_body = 'Hello World’ yield response_body.encode()
if __name__ == '__main__': from wsgiref.simple_server import make_server httpd = make_server('localhost', 5555, wsgi_app) httpd.serve_forever()
web.config <?xml version="1.0"?><configuration> <appSettings> <add key="WSGI_ALT_VIRTUALENV_HANDLER" value="app.wsgi_app" /> <add key="WSGI_ALT_VIRTUALENV_ACTIVATE_THIS" value="D:\home\site\wwwroot\env\Scripts\python.exe" /> <add key="WSGI_HANDLER" value="ptvs_virtualenv_proxy.get_venv_handler()" /> <add key="PYTHONPATH" value="D:\home\site\wwwroot" /> </appSettings> <system.webServer> <modules runAllManagedModulesForAllRequests="true" /> <handlers> <remove name="Python27_via_FastCGI" /> <remove name="Python34_via_FastCGI" /> <add name="Python FastCGI" path="handler.fcgi" verb="*" modules="FastCgiModule" scriptProcessor="D:\Python34\python.exe|D:\Python34\Scripts\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" /> </handlers> </system.webServer></configuration>
ptvs_virtualenv_proxy.py
„The following script is used to retrieve the WSGI handler, activate the virtual environment and log errors. It is designed to be generic and used without modifications.”
Wdrożenie
push
1. KuduSync 2. Select Python version 3. Create virtual environment
4. Install packages5. Copy web.config6. Django collectstatic
from azure.mgmt.common import SubscriptionCloudCredentialsimport azure.mgmt.computeimport azure.mgmt.networkimport azure.mgmt.resourceimport azure.mgmt.storage
import requests
def get_token_from_client_credentials(endpoint, client_id, client_secret): payload = { 'grant_type': 'client_credentials', 'client_id': client_id, 'client_secret': client_secret, 'resource': 'https://management.core.windows.net/' } response = requests.post(endpoint, data=payload).json() return response['access_token']
auth_token = get_token_from_client_credentials( endpoint='https://login.microsoftonline.com/160012ea-8f27-427f-9d00-030d66b90d0f/oauth2/token', client_id='47bb44d3-c6da-4974-9df8-88598a10eb55', client_secret='ijoijoufo2')
subscription_id = '420288c3-b6f0-45e4-a3f6-e70fe2c18f50'creds = SubscriptionCloudCredentials(subscription_id, auth_token)
result = compute_client.virtual_machines.create_or_update( GROUP_NAME, azure.mgmt.compute.VirtualMachine( location=REGION, name=VM_NAME, os_profile=azure.mgmt.compute.OSProfile( admin_username=ADMIN_USERNAME, admin_password=ADMIN_PASSWORD, computer_name=COMPUTER_NAME, ), hardware_profile=azure.mgmt.compute.HardwareProfile( virtual_machine_size=azure.mgmt.compute.VirtualMachineSizeTypes.standard_a0 ), network_profile=azure.mgmt.compute.NetworkProfile( network_interfaces=[ azure.mgmt.compute.NetworkInterfaceReference( reference_uri=nic_id, ), ], ), storage_profile=azure.mgmt.compute.StorageProfile( os_disk=azure.mgmt.compute.OSDisk( caching=azure.mgmt.compute.CachingTypes.none, create_option=azure.mgmt.compute.DiskCreateOptionTypes.from_image, name=OS_DISK_NAME, virtual_hard_disk=azure.mgmt.compute.VirtualHardDisk( uri='https://{0}.blob.core.windows.net/vhds/{1}.vhd'.format( STORAGE_NAME, OS_DISK_NAME, ), ), ), image_reference = azure.mgmt.compute.ImageReference( publisher=IMAGE_PUBLISHER, offer=IMAGE_OFFER, sku=IMAGE_SKU, version=IMAGE_VERSION, ), ), ),)
TWO
RZENIE VM
result = network_client.public_ip_addresses.get(GROUP_NAME, PUBLIC_IP_NAME)print('VM available at {}'.format(result.public_ip_address.ip_address))
Zasoby jako obiekty