Existe-t-il un moyen de configurer les conteneurs lxd avec la configuration du cloud au moment de l'approvisionnement?

10

Plus précisément, avec les outils CLI - pas openstack.

Je regarde à quoi pourrait ressembler une configuration de développement local avec lxd, mais je me retrouve les mains vides quand il s'agit de configurer de nouveaux conteneurs.

Existe-t-il des moyens idiomatiques (ou autres) de configurer les conteneurs lxd? Dois-je regarder quelque chose de plus immuable comme les images de docker?

Merci. Toutes les ressources ou pointeurs seraient appréciés.

ben schwartz
la source

Réponses:

13

Il y a donc plusieurs façons de le faire, soit directement pour un conteneur:

lxc init ubuntu: CONTAINER
lxc config set CONTAINER user.user-data - < cloud-init-config.yml
lxc start CONTAINER

Ou encore plus court:

lxc launch ubuntu: CONTAINER --config=user.user-data="$(cat cloud-init-config.yml)"

Ou via un profil:

lxc profile create dev
lxc profile set dev user.user-data - < cloud-init-config.yml
lxc launch ubuntu: CONTAINER -p default -p dev
stgraber
la source
Comment utiliser les fichiers .sh au lieu de .yml? Existe-t-il déjà un tutoriel sur ce sujet?
Greg
Ce qui précède fait référence à cette question: stackoverflow.com/questions/44456522
Greg
3

Un liner avec lequel je suis allé aujourd'hui, celui-ci le place dans le profil par défaut pour les nouveaux conteneurs:

echo -e "#cloud-config\nssh_authorized_keys:\n - $(cat ~/.ssh/id_rsa.pub)" | lxc profile set default user.user-data -

Celui-ci le place dans un conteneur existant, mais attention, il ne fonctionnera pas sur les conteneurs qui ont déjà démarré car le truc de clé SSH ne se fait qu'au premier démarrage:

echo -e "#cloud-config\nssh_authorized_keys:\n - $(cat ~/.ssh/id_rsa.pub)" | lxc config set CONTAINER_NAME user.user-data -

Trent Lloyd
la source
3

J'avais une question un peu plus précise que l'OP, mais il m'a fallu un certain temps pour comprendre ce que je faisais mal. Je pensais que je le posterais ici pour aider quelqu'un d'autre à être pareillement perplexe.

Je voulais des paramètres de mise en réseau statique pour un conteneur LXC / LXD Ubuntu 16.04 hébergé sur Ubuntu 16.04. J'ai commencé par essayer ce que Stéphane a écrit mais ça n'a pas marché. Tout ce que je me suis retrouvé était le conteneur par défaut de tentative de DHCP avec une liaison IPv6 locale, car aucun DHCP n'est servi dans ma configuration.

Mon YAML initial ressemblait (quelque chose) au suivant (tiré des documents cloud-init ).

network:
  version: 1
  config:
    - type: physical
      name: eth0
      subnets:
        - type: static
          address: 192.168.23.14/27
          gateway: 192.168.23.1
          dns_nameservers:
            - 192.168.23.2
            - 8.8.8.8
          dns_search:
            - exemplary.maas

Et je chargeais cela user.user-datacomme décrit ci-dessus.

lxc config set CONTAINER user.user-data - < CONTAINER.cloud-init-config.yml

Ce n'est que lorsque j'ai trouvé la documentation de Stéphane dans la source LXC / LXD que j'ai réalisé que je devais charger cette valeur user.network-config.

Donc mon YAML final ressemblait à quelque chose comme ça.

version: 1
config:
  - type: physical
    name: eth0
    subnets:
      - type: static
        address: 192.168.23.14/27
        gateway: 192.168.23.1
        dns_nameservers:
          - 192.168.23.2
          - 8.8.8.8
        dns_search:
          - exemplary.maas

Ensuite, je l'ai chargé à la user.network-configplace.

lxc config set CONTAINER user.network-config - < CONTAINER.network-config.yaml

Il semble que j'aurai besoin de conserver deux fichiers différents par conteneur: un pour les paramètres réseau à charger user.network-config; et un pour d'autres config à charger, user.user-datasauf si je peux trouver un moyen d'utiliser un seul fichier pour tout.


Un autre problème que j'ai trouvé et qui n'était pas du tout évident pour moi était d'essayer de configurer automatiquement les composants non réseau.

lxc config set CONTAINER user.user-data - < CONTAINER.user-data.yaml

Le YAML suivant appliqué avec la commande ci-dessus (malgré son apparence correcte lxc config show CONTAINER) n'a rien créé à l'intérieur de mon conteneur.

write_files:
  - content: |
    # My new /etc/foo.bar file

    Foo
    Bar

    path: /etc/foo.bar

L'indice enfoui dans les formats de saisie de données utilisateur, élément 5: Cloud Config Data se lit comme suit:

commence par "#cloud-config"ou "Content-Type: text/cloud-config" Ce contenu est des données "cloud-config". Voir les exemples pour un exemple commenté de formats de configuration pris en charge.

Je ne pense pas que cette documentation soit très claire. Je n'ai rien pu faire fonctionner en utilisant le formulaire "Content-Type: text / cloud-config" mais j'ai trouvé que si vous mettez #cloud-configsur la première ligne, le YAML est analysé. Je peux seulement supposer que quelque chose ne va pas, que ce soit ma compréhension ou la programmation de quelqu'un. Cela n'a aucun sens pour moi que YAML que vous avez explicitement chargé car la valeur de la clé user.user-datadoit être utilisée comme autre chose que les données de configuration du cloud. Sinon, pourquoi quelqu'un ferait-il cela si ce n'était pas censé être une configuration cloud, et pourquoi un commentaire (qui n'utilise même pas la syntaxe shebang normale) serait-il nécessaire ?

Donc, non-sens, la syntaxe qui a fonctionné user.user-dataest:

#cloud-config

write_files:
  - content: |
      # My new /etc/foo.bar file

      Foo
      Bar

    path: /etc/foo.bar
Samuel Harmer
la source