2017-10-15 3 views
1

Je veux créer ma piscine en utilisant Python. Je peux le faire en utilisant une image (Ubuntu Server 16.04) du marché, mais je veux utiliser une image personnalisée (mais aussi Ubuntu Server 16.04) - un que j'ai préparé avec les bibliothèques souhaitées et la configuration.Azure Batch Pool: comment utiliser une image VM personnalisée via Python?

Voici comment je crée ma piscine:

new_pool = batch.models.PoolAddParameter(
     id=pool_id, 
     virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
      image_reference=image_ref_to_use, # ?? 
      node_agent_sku_id=sku_to_use), 
     vm_size=_POOL_VM_SIZE, 
     target_dedicated_nodes=_POOL_NODE_COUNT, 
     start_task=start_task, 
     max_tasks_per_node=_CORES_PER_NODE 
) 

imagerie I que je dois utiliser batch.models.ImageReference() pour créer ma référence d'image ... mais je ne sais pas comment l'utiliser.

Oui, j'ai vérifié la documentation, qui dit ce qui suit:

Une référence à une Azure machines virtuelles ou l'image du marché une coutume Azure l'image de machine virtuelle.

Il énumère les paramètres comme:

  • éditeur (str)
  • offre (str)
  • sku (str)
  • Version (str)
  • virtual_machine_image_id (str)

Cependant, t Le paramètre virtual_machine_image_id n'existe pas ... En d'autres termes, batch.models.ImageReference(virtual_machine_image_id) n'est pas autorisé.

Comment puis-je utiliser une image personnalisée pour ma piscine?

MISE À JOUR

Je compris comment utiliser une image personnalisée ... il se trouve que peu importe combien de fois je désinstaller les bibliothèques python bleu azur et les re-installer, le virtual_machine_image_id est jamais disponible .

Je suis ensuite allé here téléchargé le zip. Ouvert le, vérifié la classe ImageReference et faible-et-voir, le virtual_machine_image_id était disponible dans la fonction __init__ de la classe ImageReference. J'ai ensuite téléchargé la roue python et utilisé pip pour l'installer. Boom ça a marché.

Ou alors je pensais.

Je devais ensuite me battre en essayant de comprendre ce que le node_agent_sku_id est ... seulement en créant manuellement un pool et en voyant le champ Batch Node Agent SKU ID ai-je réussi à le trouver.

Maintenant, je me bats avec l'authentification ...

L'erreur que je reçois est:

Server n'a pas pu authentifier la demande. Assurez-vous que la valeur de l'en-tête d'autorisation est correctement formée, y compris la signature.

AuthenticationErrorDetail: Le type d'authentification spécifié SharedKey n'est pas autorisé lorsque des ressources externes de type Compute sont liées .

azure.batch.models.batch_error.BatchErrorException: {'lang': 'en-US', 'valeur': 'Le serveur n'a pas réussi à authentifier la requête. Assurez- que la valeur d'en-tête d'autorisation est correctement formée, y compris la signature \ nRequestId:. F8c1a3b3-65c4-4efd-9c4f-75c5c253f992 \ NTIME: 2017-10-15T20: 36: 06.7898187Z '}

de l'erreur, je comprends que je ne suis pas autorisé à utiliser SharedKeyCredentials:

credentials = batchauth.SharedKeyCredentials(_BATCH_ACCOUNT_NAME, 
              _BATCH_ACCOUNT_KEY) 

batch_client = batch.BatchServiceClient(
    credentials, 
    base_url=_BATCH_ACCOUNT_URL) 

que dois-je faire?

MISE A JOUR 2

OK. L'utilisateur fpark m'a informé que je dois utiliser:

from azure.batch import BatchServiceClient 
from azure.common.credentials import ServicePrincipalCredentials 

credentials = ServicePrincipalCredentials(
    client_id=CLIENT_ID, 
    secret=SECRET, 
    tenant=TENANT_ID, 
    resource="https://batch.core.windows.net/" 
) 
    batch_client = BatchServiceClient(
    credentials, 
    base_url=BATCH_ACCOUNT_URL 
) 

à authentifier. Malheureusement, que le code ci-dessus est décrit here et ne fait aucune référence à ce que CLIENT_ID et. Al sont.

je puis réussi à trouver un autre morceau de documentation qui semble être la même chose: https://azure-sdk-for-python.readthedocs.io/en/v2.0.0rc3/resourcemanagementauthentication.html

cette page m'a signalé à une autre page Web: https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service-principal-portal

J'ai suivi ce tutoriel et a réussi à enfin authentifier ma demande ...

NOTE

Lors de la création de votre application, le tutoriel vous dira :

Indiquez un nom et une URL pour l'application. Sélectionnez Application Web/ API ou Natif pour le type d'application que vous souhaitez créer. Après avoir défini les valeurs , sélectionnez Créer.

NE PAS sélectionnez Native que vous n'aurez pas la possibilité d'obtenir une clé d'application ...

+0

Pouvez-vous poster une version de votre code de travail complet? – RedPanda

+0

Ceci est super utile - comment avez-vous compris que vous aviez besoin de préfixer/abonnements/avant votre nom de l'image? – RedPanda

+0

J'ai finalement trouvé le texte d'erreur détaillé qu'Azure renvoie dans l'enregistreur HTTP sous odata.metadata, dans lequel ils spécifient le format correct pour virtual_machine_image_id. Cela m'a amené à réaliser que vous devez copier le champ "ID de ressource" pour l'image sur le portail Azure qui peut être vu lors de l'affichage des détails de l'image de la machine virtuelle. – RedPanda

Répondre

0

Vous devez installer le azure-batch SDK Python v4.0.0 ou supérieur. Typiquement avec pip install --upgrade azure-batch vous devriez juste obtenir la nouvelle version. Si cela ne fonctionne pas, vous pouvez ajouter l'option --force-reinstall à pip pour le forcer (avec --upgrade).

En ce qui concerne la valeur correcte pour node_agent_sku_id, vous devez utiliser l'opération list_node_agent_skus pour voir le mappage entre les systèmes d'exploitation et le skus de l'agent de noeud pris en charge. En ce qui concerne le problème d'authentification, vous devez utiliser Azure Active Directory authentication pour utiliser cette fonctionnalité. Cela ne fonctionnera pas avec l'authentification par clé partagée. Malheureusement, la documentation entourant cette fonctionnalité fait défaut et est actuellement en cours de mise à jour.

+0

Merci, avez-vous un exemple d'utilisation de l'authentification 'Azure Active Directory'? Comment puis-je faire ceci? Que dois-je transmettre dans 'batch.BatchServiceClient ( informations d'identification, base_url = _BATCH_ACCOUNT_URL)'? – pookie

+0

J'ai ajouté un lien qui montre comment faire cela. – fpark