Flatcar Linux no VMware Player — Deploy em 5 minutos no terminal

Em um certo momento eu precisei criar um novo lab de Kubernetes. De volta ao passado, eu criei um shell script para criar uma porrada de servidores CoreOS no meu VMWare Player, mas não voltei a esse script desde então.

Com a depreciação do CoreOS e o glorioso surgimento do Flatcar Linux para nos salvar, e enquanto eu precisava testar algumas coisas no Calico, me veio na cabeça “porque não escrever como fazer um deploy rápido de uma VM Flatcar Linux no VMware Player sem script?”. E aqui vamos nós!

Você precisará:

  • OVA do Flatcar Linux
  • CoreOS Configuration Transpiler (ou você pode escrever seu próprio arquivo Ignition, o que não é recomendado). Por sinal, você vai precisar compilar o Configuration Transpiler (foi mal!), mas eu ACHO que num futuro próximo eles devem prover os binários. De qualquer forma, é simples como a compilação de um programa em Go.
  • VMware player / ovftool, ambos inclusos na instalação do VMware Player

Escrevendo o arquivo de configuração

Aqui temos os primeiros passos para gerar uma Configuração para o Container Linux contendo ao menos um usuário com uma chave SSH autorizada e o hostname da VM. Você pode configurar a VM com qualquer configuração suportada no link acima.

Vamos criar um arquivo chamado config.yaml

 1passwd:
 2  users:
 3    - name: core
 4      ssh_authorized_keys:
 5        - ssh-rsa AAAAB3NzaC1y...... user@springfield
 6storage:
 7  files:
 8    - path: /etc/hostname
 9      filesystem: root
10      mode: 0644
11      contents: 
12        inline: homer
13      user:
14        id: 0
15      group:
16        id: 0

O código acima será usado para, quando a VM do Flatcar estiver bootando pela primeira vez, fazer a criação/alteração do usuário core permitindo a autenticação SSH com as chaves SSH publicas acima, e também escrever um arquivo /etc/hostname contendo o hostname da máquina. Esse arquivo será usado pelo Flatcar CL para configurar seu hostname.

Por favor tenha em mente que isso é um YAML, logo você nunca deve copiar e colar para não ser punido ferozmente por algum espaço/tab sobrando ou faltando.

Você pode agora ’transplantar’ essa configuração e transformá-la em um JSON que será usado pelo Ignition quando a VM estiver iniciando pela primeira vez.

Executando o comando ct --in-file config.yaml --pretty será exibida uma saída com uma versão ‘botininha’ do arquivo ignition:

 1{ 
 2  "ignition": { 
 3    "config": {}, 
 4    "security": { 
 5      "tls": {} 
 6    }, 
 7    "timeouts": {}, 
 8    "version": "2.2.0" 
 9  }, 
10  "networkd": {}, 
11  "passwd": { 
12    "users": [ 
13      { 
14        "name": "core", 
15        "sshAuthorizedKeys": [ 
16          "ssh-rsa AAAAB3NzaC1y...... user@springfield"
17        ] 
18      } 
19    ] 
20  }, 
21  "storage": { 
22    "files": [ 
23      { 
24        "filesystem": "root",
25        "group": { 
26          "id": 0 
27        }, 
28        "user": { 
29          "id": 0 
30        }, 
31        "path": "/etc/hostname", 
32        "contents": { 
33          "source": "data:,homer", 
34          "verification": {} 
35        }, 
36        "mode": 420 
37      } 
38    ] 
39  }, 
40  "systemd": {} 
41}

Agora você pode pegar esse JSON e converter para base64, que será lido pelo Flatcar quando estiver iniciando. Essa configuração não precisa necessariamente ser convertida para base64, mas reduz a chance de existir algum caracter errado no meio da configuração quando você fizer o copiar/colar ela.

O comando completo é ct --in-file config.yaml --pretty |base64 -w0 mas por favor TENHA EM MENTE que no MacOS/Darwin o comando base64 pode não conter um -w0, dependendo da versão que você usa, então será necessário fazer sed/replace em todas as quebras de linha. A linha do Base64 ficará mais ou menos assim:

1ewogICJpZ25pdGlvbiI6IHsKICAgICJjb25maWciOiB7fSwKICAgICJzZWN1cml0eSI6IHsKICAgICAgInRscyI6IHt9CiAgICB9LAogICAgInRpbWVvdXRzIjoge30sCiAgICAidmVyc2lvbiI6ICIyLjIuMCIKICB9LAogICJuZXR3b3JrZCI6IHt9LAogICJwYXNzd2QiOiB7CiAgICAidXNlcnMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJjb3JlIiwKICAgICAgICAic3NoQXV0aG9yaXplZEtleXMiOiBbCiAgICAgICAgICAic3NoLXJzYSBBQUFBQjNOemF[........]

Fazendo deploy no VMware Player

Bom, se você chegou até aqui com o conteúdo base64 criado corretamente, e contendo a configuração do Flatcar Container Linux, agora será apenas necessário criar a Máquina Virtual usando o utilitário ovftool e sua VM estará pronta para uso:

1ovftool --allowExtraConfig --X:enableHiddenProperties \
2--X:injectOvfEnv --name=flatcar --memorySize:'*'=3072 \
3--extraConfig:guestinfo.coreos.config.data.encoding=base64 \
4--extraConfig:guestinfo.coreos.config.data=BASE64_GERADO_ACIMA \
5--net:"VM Network"="NAT" flatcar.ova novodiretorio

Alguns pontos importantes sobre esse comando:

  • Como eu disse anteriormente, você não precisa usar um formato de configuração base64, mas para isso a flag --extraConfig:guestinfo.coreos.config.data.encoding deve ser removida.
  • Você precisa substituir o conteúdo da flag guestinfo.coreos.config.data para o base64 gerado no passo anterior.
  • Você pode usar qualquer rede que desejar no VMware Player, se você quiser usar a rede de Bridge ao invés do Nat basta substituir a flag –net para --net:"VM Network"="Bridge"
  • Se o diretório novodiretorio que está no fim do exemplo acima já existir ele irá colocar o vmx da máquina virtual dentro desse diretório.
  • As flags guestinfo.coreos.config.data and guestinfo.coreos.config.data.encoding estão depreciadas em favor das flags com prefixo guestinfo.ignition.config.* mas no momento que esse artigo foi escrito essas novas chaves eram suportadas apenas na release Alpha do Flatcar
  • O ovftool não consegue alterar o tamanho de memória, então mesmo que você tenha criado a sua VM com o parâmetro --memorySize: você precisará alterar manualmente a quantidade de memória diretamente no arquivo vmx criado.

Após isso, a VM pode ser iniciada com:

vmplayer newdir/flatcar/flatcar.vmx

E voilà, você tem uma VM Flatcar Linux funcionando.

Claro que você pode pegar o OVA e fazer o mesmo deploy com a configuração gerada acima diretamente na interface gráfica do VMPlayer, mas uma vez automatizado esse processo via linha de comando é muito mais rápido para criar um ambiente de laboratório :)

Traduções: