Existe uma maneira de configurar contêineres lxd com configuração na nuvem no momento da provisão?

10

Especificamente, com as ferramentas da CLI - não com o openstack.

Estou vendo como pode ser uma configuração de desenvolvedor local com o lxd, mas estou chegando de mãos vazias quando se trata de configurar novos contêineres.

Existem maneiras idiomáticas (ou não) de configurar contêineres lxd? Devo estar olhando para algo mais imutável, como imagens de janela de encaixe?

Obrigado. Quaisquer recursos ou indicadores serão apreciados.

ben schwartz
fonte

Respostas:

13

Portanto, existem várias maneiras de fazer isso, diretamente para um contêiner:

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

Ou ainda mais curto:

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

Ou através de um perfil:

lxc profile create dev
lxc profile set dev user.user-data - < cloud-init-config.yml
lxc launch ubuntu: CONTAINER -p default -p dev
stgraber
fonte
Como os arquivos .sh podem ser usados ​​em vez de .yml? Existe um tutorial já disponível sobre este tópico?
Greg
A descrição acima é em referência a esta pergunta: stackoverflow.com/questions/44456522
Greg
3

Um revestimento que acompanhei hoje, este o define no perfil padrão para novos contêineres:

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

Este o define em um contêiner existente, mas cuidado, ele não funcionará em contêineres que já foram inicializados, pois o material da chave SSH é feito apenas na primeira inicialização:

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

Trent Lloyd
fonte
3

Eu tinha uma pergunta um pouco mais específica do que o OP, mas levei um tempo para entender o que estava fazendo de errado. Eu pensei em publicá-lo aqui para ajudar alguém a ficar igualmente perplexo.

Eu queria configurações de rede estáticas para um contêiner LXC / LXD Ubuntu 16.04 hospedado no Ubuntu 16.04. Comecei tentando o que Stéphane escreveu, mas não estava funcionando. Acabei com o contêiner de tentativa de DHCP padrão com um link IPv6 local, pois não há DHCP sendo servido na minha configuração.

Meu YAML inicial parecia (algo) o seguinte (extraído dos documentos de inicialização em nuvem ).

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

E eu estava carregando isso user.user-datacomo descrito acima.

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

Não foi até encontrar a documentação de Stéphane na fonte LXC / LXD que percebi que precisava carregar esse valor user.network-config.

Então meu YAML final ficou assim (algo).

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

Então eu carreguei isso no user.network-configlugar.

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

Parece que vou precisar manter dois arquivos diferentes por contêiner: um para carregar as configurações de rede user.network-config; e um para outra configuração carregar, a user.user-datamenos que eu possa encontrar uma maneira de usar um único arquivo para tudo.


Outro problema que achei que não era óbvio para mim foi tentar configurar componentes não pertencentes à rede automaticamente.

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

O YAML a seguir aplicado com o comando acima (apesar de parecer correto lxc config show CONTAINER) não criou nada dentro do meu contêiner.

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

    Foo
    Bar

    path: /etc/foo.bar

A pista escondida em Formatos de entrada de dados do usuário, item 5: Dados de configuração da nuvem, lê:

começa com "#cloud-config"ou "Content-Type: text/cloud-config" Este conteúdo são dados de "configuração em nuvem". Veja os exemplos para um exemplo comentado dos formatos de configuração suportados.

Não acredito que esta documentação seja muito clara. Não consegui que nada funcionasse usando o formulário "Tipo de conteúdo: texto / configuração da nuvem", mas descobri que, se você colocar #cloud-configna primeira linha, o YAML é analisado. Só posso supor que algo não está certo, tanto no meu entendimento quanto na programação de alguém. Não faz sentido para mim que o YAML que você carregou explicitamente como o valor da chave user.user-datadeva ser usado como algo diferente de dados de configuração da nuvem. Por que outra razão que alguém faria isso se não era para ser configuração de nuvem, e, portanto, por que um comentário (que nem sequer usar a sintaxe shebang normal) ser necessário ?

Portanto, sem sentido, a sintaxe para a qual trabalhou user.user-dataé:

#cloud-config

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

      Foo
      Bar

    path: /etc/foo.bar
Samuel Harmer
fonte