Une introduction aux scripts Cloud-Config

introduction

Le programme + cloud-init + disponible sur les distributions récentes (uniquement Ubuntu 14.04 et CentOS 7 au moment de l’écriture) est capable de consommer et d’exécuter des données depuis le champ + user-data + du https: // www.digitalocean.com/community/tutorials/an-inintroduction-to-droplet-metadata[DigitalOcean service de métadonnées]. Ce processus se comporte différemment en fonction du format des informations trouvées. L’un des formats les plus populaires pour les scripts dans + user-data + est le format de fichier * cloud-config *.

Les fichiers cloud-config sont des scripts spéciaux conçus pour être exécutés par le processus cloud-init. Celles-ci sont généralement utilisées pour la configuration initiale au tout premier démarrage d’un serveur. Dans ce guide, nous discuterons du format et de l’utilisation des fichiers cloud-config.

Informations générales sur Cloud-Config

Le format + cloud-config + implémente une syntaxe déclarative pour de nombreux éléments de configuration courants, facilitant ainsi la réalisation de nombreuses tâches. Il vous permet également de spécifier des commandes arbitraires pour tout ce qui ne relève pas des capacités déclaratives prédéfinies.

Cette approche du «meilleur des deux mondes» permet au fichier de se comporter comme un fichier de configuration pour les tâches courantes, tout en conservant la souplesse d’un script pour des fonctionnalités plus complexes.

Formatage YAML

Le fichier est écrit au format de sérialisation des données YAML. Le format YAML a été créé pour être facile à comprendre pour les humains et à analyser les programmes.

Les fichiers YAML sont généralement assez intuitifs à comprendre lors de leur lecture, mais il est bon de connaître les règles qui les régissent.

Voici quelques règles importantes pour les fichiers YAML:

  • L’indentation avec des espaces blancs indique la structure et la relation des éléments les uns aux autres. Les éléments les plus en retrait sont les sous-éléments du premier élément avec un niveau d’indentation inférieur au-dessus d’eux.

  • Les membres de la liste peuvent être identifiés par un tiret.

  • Les entrées de tableau associatif sont créées à l’aide de deux points (:) suivis d’un espace et de la valeur.

  • Les blocs de texte sont en retrait. Pour indiquer que le bloc doit être lu tel quel, avec la mise en forme conservée, utilisez le caractère de canal (|) avant le bloc.

Prenons ces règles et analysons un exemple de fichier + cloud-config +, en prêtant attention au formatage:

#cloud-config
users:
 - name: demo
   groups: sudo
   shell: /bin/bash
   sudo: ['ALL=(ALL) NOPASSWD:ALL']
   ssh-authorized-keys:
     - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDf0q4PyG0doiBQYV7OlOxbRjle026hJPBWD+eKHWuVXIpAiQlSElEBqQn0pOqNJZ3IBCvSLnrdZTUph4czNC4885AArS9NkyM7lK27Oo8RV888jWc8hsx4CD2uNfkuHL+NI5xPB/QT3Um2Zi7GRkIwIgNPN5uqUtXvjgA+i1CS0Ku4ld8vndXvr504jV9BMQoZrXEST3YlriOb8Wf7hYqphVMpF3b+8df96Pxsj0+iZqayS9wFcL8ITPApHi0yVwS8TjxEtI3FDpCbf7Y/DmTGOv49+AWBkFhS2ZwwGTX65L61PDlTSAzL+rPFmHaQBHnsli8U9N6E4XHDEOjbSMRX [email protected]
     - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcthLR0qW6y1eWtlmgUE/DveL4XCaqK6PQlWzi445v6vgh7emU4R5DmAsz+plWooJL40dDLCwBt9kEcO/vYzKY9DdHnX8dveMTJNU/OJAaoB1fV6ePvTOdQ6F3SlF2uq77xYTOqBiWjqF+KMDeB+dQ+eGyhuI/z/aROFP6pdkRyEikO9YkVMPyomHKFob+ZKPI4t7TwUi7x1rZB1GsKgRoFkkYu7gvGak3jEWazsZEeRxCgHgAV7TDm05VAWCrnX/+RzsQ/1DecwSzsP06DGFWZYjxzthhGTvH/W5+KFyMvyA+tZV4i1XM+CIv/Ma/xahwqzQkIaKUwsldPPu00jRN user@desktop
runcmd:
 - touch /test.txt

En consultant ce fichier, nous pouvons apprendre un certain nombre de choses importantes.

Tout d’abord, chaque fichier + cloud-config + doit commencer par + # cloud-config + seul sur la toute première ligne. Cela indique au programme cloud-init que cela doit être interprété comme un fichier + cloud-config +. S’il s’agissait d’un fichier de script standard, la première ligne indiquerait l’interpréteur à utiliser pour exécuter le fichier.

Le fichier ci-dessus a deux directives de niveau supérieur, + utilisateurs + et + runcmd +. Ces deux servent de clés. Les valeurs de ces clés consistent en toutes les lignes en retrait après les clés.

Dans le cas de la clé + utilisateurs +, la valeur est un élément de liste unique. Nous le savons parce que le niveau d’indentation suivant est un tiret (-) qui spécifie un élément de la liste et qu’il n’ya qu’un tiret à ce niveau d’indentation. Dans le cas de la directive + utilisateurs +, cela indique incidemment que nous ne définissons qu’un seul utilisateur.

L’élément de liste lui-même contient un tableau associatif avec plus de paires clé-valeur. Ce sont des éléments frères, car ils existent tous au même niveau d’indentation. Chacun des attributs de l’utilisateur est contenu dans l’élément de liste unique décrit ci-dessus.

Certains éléments à noter sont que les chaînes que vous voyez ne nécessitent pas de citation et qu’il n’y a pas de crochets inutiles pour définir les associations. L’interprète peut déterminer le type de données assez facilement et l’indentation indique la relation des éléments, à la fois pour les humains et les programmes.

A présent, vous devriez avoir une connaissance pratique du format YAML et vous sentir à l’aise de travailler avec des informations en utilisant les règles décrites ci-dessus.

Nous pouvons maintenant commencer à explorer certaines des directives les plus courantes pour + cloud-config +.

Gestion des utilisateurs et des groupes

Pour définir de nouveaux utilisateurs sur le système, vous pouvez utiliser la directive + utilisateurs + que nous avons vue dans le fichier exemple ci-dessus.

Le format général des définitions d’utilisateurs est:

#cloud-config
users:
 -


 -

Chaque nouvel utilisateur devrait commencer par un tiret. Chaque utilisateur définit des paramètres dans des paires clé-valeur. Les clés suivantes sont disponibles pour la définition:

  • * nom *: le nom d’utilisateur du compte.

  • * groupe-primaire *: le groupe principal de l’utilisateur. Par défaut, ce sera un groupe créé qui correspond au nom d’utilisateur. Tout groupe spécifié ici doit déjà exister ou doit être créé explicitement (nous en discuterons plus loin dans cette section).

  • * groupes *: Tous les groupes supplémentaires peuvent être listés ici, séparés par des virgules.

  • * gecos *: un champ pour des informations supplémentaires sur l’utilisateur.

  • * shell *: le shell qui devrait être défini pour l’utilisateur. Si vous ne le définissez pas, le shell très basique + sh + sera utilisé.

  • * expiredate *: La date d’expiration du compte, au format AAAA-MM-JJ.

  • * sudo *: chaîne sudo à utiliser si vous souhaitez définir des privilèges sudo, sans le champ nom d’utilisateur.

  • * lock-passwd *: Ceci est réglé sur «True» par défaut. Définissez ce paramètre sur «False» pour permettre aux utilisateurs de se connecter avec un mot de passe.

  • * passwd *: Un mot de passe haché pour le compte.

  • * ssh-allowed-keys *: liste des clés publiques SSH complètes à ajouter au fichier + registered_keys + de cet utilisateur dans leur répertoire + .ssh +.

  • * inactif *: valeur booléenne qui définira le compte sur inactif.

  • * system *: Si «True», ce compte sera un compte système sans répertoire personnel.

  • * homedir *: Utilisé pour remplacer le nom par défaut + / home / <nom d’utilisateur> +, qui est autrement créé et défini.

  • * ssh-import-id *: l’identifiant SSH à importer à partir de LaunchPad.

  • * selinux-user *: Ceci peut être utilisé pour définir l’utilisateur SELinux à utiliser pour la connexion de ce compte.

  • * no-create-home *: Réglez sur «True» pour éviter de créer un répertoire + / home / <nom d’utilisateur> + pour l’utilisateur.

  • * no-user-group *: définissez sur «True» pour éviter de créer un groupe du même nom que l’utilisateur.

  • * no-log-init *: Réglez sur «True» pour ne pas initier les bases de données de connexion utilisateur.

Outre des informations de base, telles que la clé + nom +, il vous suffit de définir les zones dans lesquelles vous déviez de la valeur par défaut ou fournissez les données nécessaires.

Les utilisateurs doivent comprendre que les champs + passwd + ne doivent * pas * être utilisés dans les systèmes de production, à moins que vous ne disposiez d’un mécanisme pour modifier immédiatement la valeur donnée. Comme pour toutes les informations soumises en tant que données utilisateur, le hachage restera accessible à * tout * utilisateur du système pendant toute la durée de vie du serveur. Sur du matériel moderne, ces hachages peuvent facilement être craqués en un laps de temps trivial. Exposer même le hasch est un énorme risque de sécurité qui ne devrait pas être pris sur des machines qui ne sont pas jetables.

Pour un exemple de définition d’utilisateur, nous pouvons utiliser une partie de l’exemple + cloud-config + ci-dessus:

#cloud-config
users:
 - name: demo
   groups: sudo
   shell: /bin/bash
   sudo: ['ALL=(ALL) NOPASSWD:ALL']
   ssh-authorized-keys:
     - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDf0q4PyG0doiBQYV7OlOxbRjle026hJPBWD+eKHWuVXIpAiQlSElEBqQn0pOqNJZ3IBCvSLnrdZTUph4czNC4885AArS9NkyM7lK27Oo8RV888jWc8hsx4CD2uNfkuHL+NI5xPB/QT3Um2Zi7GRkIwIgNPN5uqUtXvjgA+i1CS0Ku4ld8vndXvr504jV9BMQoZrXEST3YlriOb8Wf7hYqphVMpF3b+8df96Pxsj0+iZqayS9wFcL8ITPApHi0yVwS8TjxEtI3FDpCbf7Y/DmTGOv49+AWBkFhS2ZwwGTX65L61PDlTSAzL+rPFmHaQBHnsli8U9N6E4XHDEOjbSMRX [email protected]
     - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcthLR0qW6y1eWtlmgUE/DveL4XCaqK6PQlWzi445v6vgh7emU4R5DmAsz+plWooJL40dDLCwBt9kEcO/vYzKY9DdHnX8dveMTJNU/OJAaoB1fV6ePvTOdQ6F3SlF2uq77xYTOqBiWjqF+KMDeB+dQ+eGyhuI/z/aROFP6pdkRyEikO9YkVMPyomHKFob+ZKPI4t7TwUi7x1rZB1GsKgRoFkkYu7gvGak3jEWazsZEeRxCgHgAV7TDm05VAWCrnX/+RzsQ/1DecwSzsP06DGFWZYjxzthhGTvH/W5+KFyMvyA+tZV4i1XM+CIv/Ma/xahwqzQkIaKUwsldPPu00jRN user@desktop

Pour définir des groupes, vous devez utiliser la directive + groups +. Cette directive est relativement simple dans la mesure où elle nécessite simplement une liste des groupes que vous souhaitez créer.

Une extension optionnelle à ceci est de créer une sous-liste pour n’importe lequel des groupes que vous créez. Cette nouvelle liste définira les utilisateurs qui doivent être placés dans ce groupe:

#cloud-config
groups:
 -
 - : [, ]

Changer les mots de passe pour les utilisateurs existants

Pour les comptes utilisateur existants (le compte + root + est le plus pertinent), un mot de passe peut être fourni à l’aide de la directive + chpasswd +.

  • Remarque *: Cette directive devrait * uniquement * être utilisée dans les situations de débogage, car, une fois encore, la valeur sera disponible pour tous les utilisateurs du système pendant la durée de vie du serveur. Ceci est encore plus pertinent dans cette section car les mots de passe soumis avec cette directive doivent être donnés en * texte brut *.

La syntaxe de base ressemble à ceci:

#cloud-config
chpasswd:
 list: |
   :
   :
   :
 expire: False

La directive contient deux clés de tableau associatif. La clé + list + contiendra un bloc qui liste les noms de compte et les mots de passe associés que vous souhaitez attribuer. La clé + expire + est un booléen qui détermine si le mot de passe doit être changé au premier démarrage ou non. La valeur par défaut est «True».

Une chose à noter est que vous pouvez définir un mot de passe sur “RANDOM” ou “R”, ce qui générera un mot de passe aléatoire et l’écrira dans + / var / log / cloud-init-output.log +. Gardez à l’esprit que ce fichier est accessible à tout utilisateur du système, il n’est donc plus sécurisé.

Écrire des fichiers sur le disque

Afin d’écrire des fichiers sur le disque, vous devriez utiliser la directive + write_files +.

Chaque fichier devant être écrit est représenté par un élément de liste sous la directive. Ces éléments de liste seront des tableaux associatifs qui définissent les propriétés de chaque fichier.

Les seules clés requises dans ce tableau sont + path +, qui définit l’emplacement où écrire le fichier, et + content +, qui contient les données que vous souhaitez que le fichier contienne.

Les clés disponibles pour configurer un élément + write_files + sont les suivantes:

  • * chemin *: le chemin absolu vers l’emplacement sur le système de fichiers où le fichier doit être écrit.

  • * contenu *: Le contenu qui devrait être placé dans le fichier. Pour une entrée sur plusieurs lignes, vous devez commencer un bloc en utilisant un caractère de conduite (|) sur la ligne «contenu», suivi d’un bloc en retrait contenant le contenu. Les fichiers binaires doivent inclure "!! binary" et un espace avant le caractère de canal.

  • * owner *: le compte d’utilisateur et le groupe auquel le fichier doit être attribué. Ceux-ci devraient être donnés dans le format «nom d’utilisateur: groupe».

  • * permissions *: L’ensemble des permissions octales à donner pour ce fichier.

  • * encoding *: spécification facultative d’encodage du fichier. Cela peut être «b64» pour les fichiers Base64, «gzip» pour les fichiers compressés Gzip ou «gz + b64» pour une combinaison. Si vous laissez cette option, vous utiliserez le type de fichier conventionnel par défaut.

Par exemple, nous pourrions écrire un fichier sur + / test.txt + avec le contenu:

Here is a line.
Another line is here.

La partie du + cloud-config + qui accomplirait ceci ressemblerait à ceci:

#cloud-config
write_files:
 - path: /test.txt
   content: |
     Here is a line.
     Another line is here.

Mettre à jour ou installer des packages sur le serveur

Pour gérer les packages, gardez à l’esprit quelques paramètres et directives connexes.

Pour mettre à jour la base de données apt sur les distributions basées sur Debian, vous devez définir la directive + package_update + sur «true». Ceci est synonyme d’appeler + apt-get update depuis la ligne de commande.

La valeur par défaut est "true", vous n’avez donc à vous soucier de cette directive que si vous souhaitez la désactiver:

#cloud-config
package_update: false

Si vous souhaitez mettre à niveau tous les packages sur votre serveur après le démarrage initial, vous pouvez définir la directive + package_upgrade +. Cela ressemble à une + apt-get upgrade + exécutée manuellement.

Ceci est défini sur "false" par défaut, alors assurez-vous de le définir sur "true" si vous souhaitez que la fonctionnalité:

#cloud-config
package_upgrade: true

Pour installer des packages supplémentaires, vous pouvez simplement lister les noms de package à l’aide de la directive “packages”. Chaque élément de la liste doit représenter un paquet. Contrairement aux deux commandes ci-dessus, cette directive fonctionnera avec les distributions gérées ou bien gérées par apt.

Ces articles peuvent prendre l’une des deux formes suivantes. Le premier est simplement une chaîne avec le nom du paquet. La seconde forme est une liste avec deux éléments. Le premier élément de cette nouvelle liste est le nom du package et le second élément est le numéro de version:

#cloud-config
packages:
 -
 -
 - [, ]

La directive “packages” définira + apt_update + sur true, remplaçant tout paramètre précédent.

Configurer les clés SSH pour les comptes d’utilisateurs et le démon SSH

Vous pouvez gérer les clés SSH dans la directive + users +, mais vous pouvez également les spécifier dans une section + ssh_authorized_keys + dédiée. Ceux-ci seront ajoutés au fichier registered_keys du premier utilisateur défini.

Cela prend le même format général de la spécification de clé dans la directive + utilisateurs +:

#cloud-config
ssh_authorized_keys:
 -
 -

Vous pouvez également générer les clés privées du serveur SSH à l’avance et les placer sur le système de fichiers. Cela peut être utile si vous voulez donner à vos clients les informations sur ce serveur au préalable, ce qui lui permettra de faire confiance au serveur dès sa mise en ligne.

Pour ce faire, nous pouvons utiliser la directive + ssh_keys +. Cela peut prendre les paires de clés pour les clés RSA, DSA ou ECDSA en utilisant les sous-éléments + rsa_private +, + rsa_public +, '+ dsa_private + ,' + dsa_public +, et + + ecdsa_public + `.

Étant donné que le formatage et les sauts de ligne sont importants pour les clés privées, veillez à utiliser un bloc avec une touche de canal lorsque vous les spécifiez. De plus, vous * devez * inclure les lignes de clé début et fin pour que vos clés soient valides.

#cloud-config
ssh_keys:
 rsa_private: |
   -----BEGIN RSA PRIVATE KEY-----

   -----END RSA PRIVATE KEY-----

 rsa_public:

Configurer des certificats d’autorité de certification de confiance

Si votre infrastructure repose sur des clés signées par une autorité de certification interne, vous pouvez configurer vos nouvelles machines pour faire confiance à votre cert de CA en injectant les informations du certificat. Pour cela, nous utilisons la directive + ca-certs +.

Cette directive comporte deux sous-éléments. Le premier est + remove-defaults +, qui, lorsqu’il est défini sur true, supprimera toutes les informations de confiance de certificat normales incluses par défaut. Cela n’est généralement pas nécessaire et peut entraîner des problèmes si vous ne savez pas ce que vous faites, utilisez-le avec prudence.

Le deuxième élément est + Trusted +, qui est une liste, chacune contenant un certificat d’autorité de certification approuvé:

#cloud-config
ca-certs:
 remove-defaults: true
 trusted:
   - |
     -----BEGIN CERTIFICATE-----

     -----END CERTIFICATE-----

Configurez resolv.conf pour utiliser des serveurs DNS spécifiques

Si vous avez configuré vos propres serveurs DNS que vous souhaitez utiliser, vous pouvez gérer le fichier resolv.conf de votre serveur en utilisant la directive + resolv_conf +. Cela ne fonctionne actuellement que pour les distributions basées sur RHEL.

Sous la directive + resolv_conf +, vous pouvez gérer vos paramètres avec les éléments + nameservers +, + searchdomains +, + domain + et + options +.

La directive + nameservers + devrait prendre une liste des adresses IP de vos serveurs de noms. La directive + searchdomains + prend une liste de domaines et de sous-domaines dans lesquels effectuer la recherche lorsqu’un utilisateur spécifie un hôte mais pas un domaine.

+ Domain + définit le domaine devant être utilisé pour toutes les demandes non résolues, et + options + contient un ensemble d’options pouvant être définies dans le fichier resolv.conf.

Si vous utilisez la directive + resolv_conf +, vous devez vous assurer que la directive + manage-resolv-conf + est également définie sur true. Si vous ne le faites pas, vos paramètres seront ignorés:

#cloud-config
manage-resolv-conf: true
resolv_conf:
 nameservers:
   - ''
   - ''
 searchdomains:
   -
   -
 domain:
 options:
   :
   :
   :

Exécuter des commandes arbitraires pour plus de contrôle

Si aucune des actions gérées fournies par + cloud-config + ne fonctionne comme vous le souhaitez, vous pouvez également exécuter des commandes arbitraires. Vous pouvez le faire avec la directive + runcmd +.

Cette directive prend une liste d’éléments à exécuter. Ces éléments peuvent être spécifiés de deux manières différentes, ce qui affectera leur traitement.

Si l’élément de liste est une simple chaîne, l’intégralité de l’élément sera transmise au processus de shell + sh + à exécuter.

L’autre option consiste à transmettre une liste dont chaque élément sera exécuté de la même manière que les commandes + execve +. Le premier élément sera interprété comme la commande ou le script à exécuter et les éléments suivants seront transmis en tant qu’arguments pour cette commande.

La plupart des utilisateurs peuvent utiliser l’un ou l’autre de ces formats, mais la flexibilité vous permet de choisir la meilleure option si vous avez des exigences particulières. Toute sortie sera écrite dans la sortie standard et dans le fichier + / var / log / cloud-init-output.log +:

#cloud-config
runcmd:
 - [ sed, -i, -e, 's/here/there/g', some_file]
 - echo "modified some_file"
 - [cat, some_file]

Arrêter ou redémarrer le serveur

Dans certains cas, vous souhaiterez arrêter ou redémarrer votre serveur après avoir exécuté les autres éléments. Vous pouvez le faire en configurant la directive + power_state +.

Cette directive comporte quatre sous-éléments pouvant être définis. Ce sont + delay,` + timeout`, + message et` + mode + `.

Le + delay + spécifie combien de temps à l’avenir le redémarrage ou l’arrêt devrait avoir lieu. Par défaut, ce sera «maintenant», ce qui signifie que la procédure commencera immédiatement. Pour ajouter un délai, les utilisateurs doivent spécifier, en minutes, la durée devant passer à l’aide du format ++ <num_of_mins> +.

Le paramètre + timeout + prend une valeur sans unité qui représente le nombre de secondes à attendre pour que cloud-init se termine avant d’initier le compte à rebours + delay +.

Le champ + message + vous permet de spécifier un message qui sera envoyé à tous les utilisateurs du système. Le + mode + spécifie le type d’événement de puissance à initier. Cela peut être «mettre hors tension» pour éteindre le serveur, «redémarrer» pour le redémarrer, ou «arrêter» pour laisser le système décider quelle est la meilleure action à prendre (généralement un arrêt):

#cloud-config
power_state:
 timeout: 120
 delay: "+5"
 message: Rebooting in five minutes. Please save your work.
 mode: reboot

Conclusion

Les exemples ci-dessus représentent certains des éléments de configuration les plus courants disponibles lors de l’exécution d’un fichier + cloud-config +. Il existe des fonctionnalités supplémentaires que nous n’avons pas abordées dans ce guide. Celles-ci incluent la configuration de la gestion de la configuration, la configuration de référentiels supplémentaires et même l’enregistrement avec une URL externe lors de l’initialisation du serveur.

Vous pouvez en savoir plus sur certaines de ces options en consultant le répertoire + / usr / share / doc / cloud-init / examples +. Pour un guide pratique vous aidant à vous familiariser avec les fichiers + cloud-config +, vous pouvez suivre notre tutoriel à l’adresse https://www.digitalocean.com/community/tutorials/how-to-use-cloud-config-for- your-initial-server-setup [comment utiliser cloud-config pour compléter la configuration de base du serveur] ici.

Related