Auto Install
O Ubuntu 20.04 introduziu um novo sistema para instalação automática, antigamente a Canonical usava o mesmo sistema que ainda é usado no Debian, vale ressaltar que esse sistema tem um maior foco em sistema de Cloud, mas pode facilmente ser usado em ambientes que não sejam se Cloud.
O AutoInstall do Ubuntu acontece através de uma configuração do Cloud-Init, a configuração do Cloud-init visa responder perguntas que seriam feitas durante a instalação (tornando a resposta automática via AutoInstall).
Para que tudo isso seja possível, é necessário fornecer dois arquivos chamados user-data
e meta-data
via nocloud.
Cloud-init
O Cloud-Init é uma ferramenta criada pela Canonical que permite personalizar uma imagem de sistemas operacional Linux durante a inicialização do sistema, sendo possível instalar aplicações, configurar uma gama enorme de aplicações.
Durante a inicialização inicial de um novo sistema, cloud-init
irá ler as configurações dos arquivos de configuração YAML e aplicá-las. Esse processo só precisa ser aplicado à configuração inicial de um sistema e facilita a implantação de uma frota de novos sistemas em uma plataforma de provedor de nuvem.
NoCloud
O nocloud é uma fonte de dados que nos permite fornecer os arquivos user-data
e meta-data
sem a necessidade de ter um serviço de rede como algum tipo de automação externa. Existem algumas maneiras de fornecer esses arquivos, são elas:
ISO ou VFAT
Esses arquivos podem ser fornecido via File System ISO ou vFAT em um boot local, onde ambos os arquivos estão dentro do File System (no caso da ISO, o label da deve se chamar cidata ou CIDATA).
CLI
Esses arquivos podem ser fornecido via linha de comando do Kernel durante a inicialização da instalação, para fazer isso deve-se usar as opções abaixo:
## Na linha do Kernel deve-se colocar!
# Para arquivos locais:
autoinstall ds=nocloud;KEY=VALUE
# Para arquivos remotos:
autoinstall ds=nocloud-net;KEY=VALUE
O ds=nocloud
é usado para obter os arquivos localmente, via File System ISO ou VFAT. Já o ds=nocloud-net
é usado para obter os arquivos usando algum tipo de repositório ou FTP.
No lugar de KEY vamos usar a letra s que significa o mesmo que seedfrom, além da letra s existem mais duas opções, veja aqui. Em ds=nocloud
o valor da chave s deve começar com /
ou file://
, igual o exemplo abaixo:
# Exemplo com '/':
ds=nocloud;s=/cdrom/nocloud/
# Exemplo com 'file://':
ds=nocloud;s=file://cdrom/nocloud/
# Como nesse caso 'nocloud' é um diretório,
# ele deve ter uma barra no final!
Já com o uso de ds=nocloud-net
o valor de s deve começar com http://
ou https://
, veja abaixo um exemplo:
# Exemplo com 'http://':
ds=nocloud-net;s=http://my.tftp.example.com.br/nocloud/
# Exemplo com 'https://':
ds=nocloud-net;s=http://my.tftp.example.com.br/nocloud/
# Como nesse caso 'nocloud' é um diretório
# (apenas um exemplo nesse caso), ele deve ter uma barra no final!
Caso esteja usando o sistema no padrão UEFI, você deve escapar o ;
(ponto e vírgula) usando "
(aspas) ou '
(apóstrofo), veja um exemplo abaixo:
ds="nocloud;s=/cdrom/nocloud/"
ds="nocloud-net;s=http://my.tftp.example.com.br/nocloud/"
# ou, usando contra barra '\'
ds=nocloud\;s=/cdrom/nocloud/
ds=nocloud-net\;s=http://my.tftp.example.com.br/nocloud/
Caso isso não seja feito, irá dar erro no processo porque o UEFI não vai conseguir interpretar de maneira adequada.
Somente dois arquivos são necessários para o Auto Install acontecer, o user-data
contém informações para a automação e o meta-data
que pode e normalmente estará vazio, serve para identificar metadata de propriedades de um objeto. Caso esse arquivo (que estará vazio por nossa parte) não esteja presente irá dar erro no processo.
O
user-data
segue a estrutura do YAML.
Opções do User-Data
Eu sei que é chato toda essa teoria, mas é importante entender alguma opções usadas no user-data para um melhor entendimento quando quiser criar um arquivo customizado, vamos ver algumas opções, lembrando que pode conferir todas disponíveis para o Auto Install aqui.
Storage
A opção Storage é usada para criar um layout de disco no sistema que será instalado. Em sistema com mais de um disco de armazenamento será usado o maior disco dentre todos do sistema com o padrão abaixo:
Partição | Descrição |
---|---|
Bios Boot | Partição de 1MB de espaço no início do disco (disco formatado com GPT) |
/boot | Mais ou menos com 1.5GB |
/ | Com o restante do disco (usando LVM) |
No final do tutorial existem alguns exemplos variados de layout de disco que podem ser usados, analise caso a caso e customize caso necessário.
A opção Storage trabalha com 2 métodos para configurar o disco (pelo menos até a criação desse conteúdo).
Layout
Uma dos métodos mais simples e rápidos de configurar o disco, dentro desse métodos temos duas grandes opções de uso:
LVM
Formata o layout do disco da seguinte maneira:
Partição Descrição Bios Boot Partição de 1MB de espaço no início do disco (disco formatado com GPT) /boot Mais ou menos com 1.5GB / Com o restante do disco (usando LVM) A declaração ficaria assim:
storage:
layout:
name: lvmDIRECT
Formata o disco sem LVM da seguinte forma:
Partição Descrição Bios Boot Partição de 1MB de espaço no início do disco (disco formatado com GPT) / Com o restante do disco (Sem LVM) A declaração ficaria assim:
storage:
layout:
name: direct
Além dessas duas opções, temos algumas mais que são bastante interessantes de se ver.
Layout
MATCH
Usado para selecionar qual disco vamos usar. Exemplo:
storage:
layout:
name: lvm
match:
serial: CT*
Outro exemplo:storage:
layout:
name: lvm
match:
ssd: yes
Config
Além do Layout temos o método denominado config. Este é uma forma mais complexa de criar o layout do disco, tendo mais possibilidade de criar partições e métodos de configurações.
Logo abaixo da opção Storage temos a declaração de swap, que por muitas vezes ficam oculta, ela declara a quantidade de swap file que será criada no sistema.
storage:
swap:
size: 0Para desativar o swap file declare
size: 0
, ou para obter, declare um valor, exemplosize: 5GB
.Caso a opção não seja declarada, o padrão é o Curtin fazer uma investigação para determinar um valor para o tamanho do swap file.
Num sistema com 25GB de armazenamento, o swap file ficou com mais ou menos 4.5GB.
Abaixo de config vamos trabalhar com sessões e ID para facilitar a configuração.
- Vamos especificar o disco que será usado;
- Vamos especificar as partições;
- Vamos formatar as partições criadas;
- Vamos montar as partições que foram formatadas;
Exemplo do passo i
Vamos ver como criar a sessão onde vamos declarar qual disco será usado.
config:
- id: disck0
type: disk
ptable: msdos
name: main_disk
wipe: superblock
grub_device: true
## id = Denomina o nome do ID para essa sessão;
## type = Especifica que essa sessão tem relação com o Disco;
## ptable = Cria uma tabela do tipo MSDOS;
## name = Cria um link no 'udev' com esse nome;
## wipe = Formata o disco (opção comum);
## grub_device = Instala o grub nesse disco.Ainda nessa sessão onde declaramos o disco, podemos usar uma opção chamada
path: /dev/sda
que é usada para indicar qual disco vamos usar nessa declaração de disco, ou podemos usar a opçãoserial: CT*
(onde CT é o início do serial do disco) também para especificar qual disco será usado nessa sessão.Uma outra configuração que pode ser usada é via SCSI, no qual só citarei que pode ser usado.
Exemplo de passo ii
Vamos ver um exemplo de como criar a sessão de partições. Os pontos abaixo indicam ausência da sessão onde declaramos o disco.
config:
.
.
- id: disck0-root
type: partition
number: 1
size: -1
device: disk0
## id = Denomina o nome do ID para essa sessão;
## type = Especifica que essa sessão tem relação com a partição;
## number = Especifica o número da partição (pode ser omitido);
## size = Informa o tamanho da partição (nesse caso '-1',
# informa que será usado todo o restante do disco);
## device = Devemos informar o 'ID' da sessão de Disco, isso informa ao sistema que essa
# partição pertence ao disco onde o ID é igual ao que informarmos aqui.Aqui ainda podemos usar algumas opções:
FLAG
Usado para setar uma flag na partição, as opções diponíveis são: logical, extended, boot, bios_grub, swap, lvm, raid, home e prep.
BOOT
Usado para adicionara flag de boot numa partição. Para tabelas de partição do tipo MSDOS é adicionado a flag correspondente, em tabelas de partição do tipo GPT é adicionado a flag ESP.
Deve ser usado apenas na partição do Boot.
BIOS_GRUB
Usado para aquela partição de 1MB no início do disco, apenas em tabela de partição do tipo GPT em sistemas que ainda tenham suporte para MBR (BIOS).
Caso o disco esteja com GPT você obrigatóriamente deve usar essa flag.
Exemplo de passo iii
Vamos ver um exemplo da sessão onde formataremos a partição. Os pontos abaixo indicam ausência da sessão onde declaramos o disco.
config:
.
.
- id: disck0-root-format
type: format
fstype: ext4
volume: disk0-root
## id = Denomina o nome do ID para essa sessão;
## type = Especifica que essa sessão tem relação com a formatação da partição;
## fstype = Indica qual File System será usado;
## volume = Devemos informar o 'ID' da sessão onde a partição foi criada,
# isso informa ao sistema qual a partição estamos formatando.Exemplo de passo iv
Vamos ver um exemplo da sessão onde os discos serão montados. Os pontos abaixo indicam ausência da sessão onde declaramos o disco.
config:
.
.
- id: disck0-root-mount
type: mount
path: /
device: disk0-root-format
## id = Denomina o nome do ID para essa sessão;
## type = Especifica que essa sessão tem relação com a montagem da partição;
## path = Indica onde a partição será montada;
## device = Devemos informar o 'ID' da sessão onde a partição foi formatada,
# isso informa ao sistema qual a partição estamos montando.Para partição do tipo swap, o path deve ser assim:
path: none
.Isso tudo é para que possam entender que uma sessão depende da outra para que tudo funcione, tudo deve ser feito de maneira correta, qualquer erro aqui a instalação não vai funcionar.
Locale
Configura o locale do sistema, define também a variável $LANG
para o especificado. Exemplo:
locale: en_US.UTF-8
Keyboard
Configura o layout do teclado. Exemplo:
Já tive problema do Gnome ignorar isso e o que foi definido aqui passou a funcionar apenas em modo texto (tive que alterar no próprio Gnome).
keyboard:
layout: br
## layout = Define a variável $XKBLAYOUT.
# O valor 'br' é o mesmo que ter um teclado 'abnt2'.
Processo para o Auto Install
Para que o processo de instalação automática do sistema não demore tanto é recomendado que seja utilizado a imagem Daily Build do Ubuntu, essa imagem contém os paths de atualizações que foram lançados até o prezados momento do upload da imagem.
Caso não seja usada esse tipo de imagem, durante a instalação o sistema vai baixar e instalar os paths de atualização (paths esses que tem mais relação com a segurança do sistema) e isso vai tornar o processo um pouco mais demorado.
Processo para Criação de uma ISO (sem uso de PXE)
- Descompacte a ISO;
- Cria uma pasta chamada
nocloud
dentro da ISO; - Aplique a permissão de escrita para a pasta
nocloud
, copie/cole ou crie os arquivosuser-data
emeta-data
dentro denocloud
; - Aplique a permissão de escrita para o arquivo
txt.cfg
; - Crie um novo Label dentro de
txt.cfg
com as opções do Auto Install; - Remova a permissão de escrita para
nocloud
(e arquivos dentro dele) etxt.cfg
; - Adicione a permissão de escrita para
md5sum.txt
; - Refaça o mapeamento dos Hashs dentro da ISO;
- Remova a permissão de escrita do arquivo
md5sum.txt
; - Refaça a imagem.
Agora vamos criar uma imagem customizada usando o processo descrito acima, essa imagem será usada para fazer a instalação do Ubuntu de forma automática.
Essa imagem pode ser usada em conjunto com o PXE (mesmo que seja um processo mais trabalhoso para uso com PXE), adianto que outro método é mais simples e preferível, este outro método será demonstrado mais para frente. O passo a passo abaixo é mais indicado em uso de Virtualização local.
Vale ressaltar que essa imagem que vamos criar não serve para ser "queimada" em nenhum tipo de média (inserida em CD/DVD ou até mesmo em Flash Driver. Seu uso se dá somente para uso em ambiente virtual e instalações via PXE.
# Baixa a imagem mais recente do ubuntu:
$› wget https://cdimage.ubuntu.com/ubuntu-server/focal/daily-live/current/focal-live-server-amd64.iso
# Crie uma pasta onde vamos colocar o conteúdo da ISO:
$› mkdir isofiles
# Extraia a ISO para a pasta que acabamos de criar:
$› bsdtar -C isofiles -xf focal-live-server-amd64.iso
# Crie uma pasta onde vamos deixar os arquivos necessários para a instalação automática:
$› mkdir isofiles/nocloud
# Dê permissão de escrita para a pasta 'nocloud', onde vamos colocar os arquivos
# necessários para a instalação e de permissão também para o arquivo 'txt.cfg' onde
# vamos criar um novo Label para iniciar o sistema informando parâmetros adicionais:
$› chmod +w -R isofiles/isolinux/txt.cfg
$› chmod +w -R isofiles/nocloud/
# Crie os arquivos 'meta-data' e 'user-data' dentro de 'nocloud',
# Para o 'user-data', use o exemplo na sessão 'USER-DATA':
$› vim isofiles/nocloud/user-data
$› touch isofiles/nocloud/meta-data
# Edite o arquivo 'txt.cfg' (Para padrão MBR):
$› vim isofiles/isolinux/txt.cfg
### Adicione a saída abaixo dentro desse arquivo ###
default autoinstall
label autoinstall
menu label ^Auto Install Ubuntu Server
kernel /casper/vmlinuz
append initrd=/casper/initrd autoinstall ds=nocloud;s=/cdrom/nocloud/ quiet ---
####################################################
# Edite o arquivo 'txt.cfg' (Para padrão UEFI):
$› vim isofiles/isolinux/txt.cfg
### Adicione a saída abaixo dentro desse arquivo ###
default autoinstall
label autoinstall
menu label ^Auto Install Ubuntu Server
kernel /casper/vmlinuz
append initrd=/casper/initrd autoinstall ds="nocloud;s=/cdrom/nocloud/" quiet ---
####################################################
# Remova as permissões de escrita que demos:
$› chmod -w -R isofiles/isolinux/txt.cfg
$› chmod -w -R isofiles/nocloud/
# Entre na pasta isofiles:
$› cd isofiles/
# Dê permissão de escrita no arquivo 'md5sum.txt':
$› chmod +w md5sum.txt
# Agora adicione nesse arquivo o novo hash dos arquivos que editamos, o comando abaixo simplifica tudo:
$› find -follow -type f ! -name md5sum.txt -print0 | xargs -0 md5sum > md5sum.txt
# Remova a permissão de escrita do arquivo acima:
$› chmod -w md5sum.txt
# Volte para a pasta anterior:
$› cd -
# Recrie uma imagem ISO com o conteúdo customizado:
$› sudo genisoimage -r -J -b isolinux/isolinux.bin \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-o ubuntu-server-custom_autoinstall.iso isofiles
Ao iniciar o sistema via ISO, pressione ESC e escolha o menu que foi criado (vai ver o Label que foi adicionado).
Lembrando que essa ISO não serve para ser "queimada" numa mídia física.
Configurando AutoInstall com PXE
Vamos fazer todo o procedimento para fazer o Auto Install usando o PXE. O PXELINUX é derivado do SysLinux, usado para inicializar o Linux através de um servidor de rede. O arquivo do pxelinux em sí é um bootloader para Linux que usa o protocolo de inicialização de rede PXE.
O processo de criação de um PXE para UEFI é totalmente diferente do mostrado nesse tutorial.
Você pode conferir como subir um PXE para sistemas UEFI aqui.
Vamos começar instalando os pacotes necessários para o funcionamento do pxelinux:
# Instalar as aplicações para o pxe server:
$› sudo apt install isc-dhcp-server nfs-kernel-server tftpd-hpa pxelinux -y
# isc-dhcp-server = Servidor DHCP;
# nfs-kernel-server = Servidor NFS;
# tftpd-hpa = Servidor TFTP-HPA;
# pxelinux = Pacote que contém os arquivos do PXE.
# Apenas para testar o TFTP, podemos instalar o pacote tftp-hpa.
Agora vamos configurar o TFTPD:
# Edite o arquivo de configuração do tftpd:
$› sudo vim /etc/default/tftpd-hpa
###### Deixe como abaixo, mudando o necessário ######
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="192.168.100.2:69"
TFTP_OPTIONS="--secure"
# Você logo pode ver a diferença entre o meu arquivo e o seu,
# no meu foi modificado a pasta raiz do tftp e ao invés de deixar ele
# escutando em todas as interfaces, eu pedi para que ele escute apenas
# na interface 'enp0s8' que tem o IP '192.168.100.2'.
# Veja abaixo o ip na interface:
$› sudo ip addr show enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:54:a2:67 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.2/24 brd 192.168.100.255 scope global enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe54:a267/64 scope link
valid_lft forever preferred_lft forever
# Agora vamos criar a pasta do tftp:
$› sudo mkdir -p /srv/tftp
# Agora reinicie o serviço do tftpd e verifique o status:
$› sudo systemctl restart tftpd-hpa.service
$› sudo systemctl status tftpd-hpa.service
Agora vamos configurar o servidor DHCP, para uma configuração básica do dhcp, podemos usar o exemplo que está no arquivo /usr/share/doc/pxelinux/README.txt.gz
caso você tenha o pacote pxelinux
instalado, nosso exemplo foi baseado nesse arquivo, mudando apenas algumas coisas.
default-lease-time 600;
max-lease-time 7200;
allow booting;
allow bootp;
authoritative;
ignore client-updates;
log-facility local7;
subnet 192.168.100.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.100.20 192.168.100.253;
option broadcast-address 192.168.100.255;
option routers 192.168.100.2;
option domain-name-servers 8.8.8.8;
option subnet-mask 255.255.255.0;
default-lease-time 21600;
max-lease-time 43200;
}
group {
next-server 192.168.100.2;
host teste {
# Coloque o MAC da máquina cliente aqui em baixo!
hardware ethernet 52:54:00:20:35:ac;
fixed-address 192.168.100.177;
# Graças ao CHROOT usado pelo tftp-hpa, não precisamos colocar o caminho
# completo para o arquivo PXELINUX, pois o mesmo está no diretório raiz
# do tftp, caso contrário precisa colocar.
filename "pxe5254";
}
}
## Agora vamos configurar a interface do dhcp que ele vai ficar escutando
# Edite o arquivo abaixo:
$› sudo vim /etc/default/isc-dhcp-server
# Em INTERFACES, coloque o nome da interface que o daemon vai escutar, no meu caso
# a interface é 'enp0s8', segue meu exemplo:
INTERFACES="enp0s8"
# Agora reinicie o DHCP e veja o status do serviço:
$› sudo systemctl restart isc-dhcp-server
$› sudo systemctl status isc-dhcp-server
Agora vamos baixar a imagem do sistema que será instalada pela rede e vamos criar uma pasta onde vamos deixar os arquivos da ISO para que possam ser disponibilizados via NFS:
# Crie a pasta onde vamos colocar a ISO (descompactada):
$› sudo mkdir -p /distros/ubuntu2004
# Baixe a ISO, no nosso caso será uma uma imagem do Ubuntu 20.04
$› wget https://cdimage.ubuntu.com/ubuntu-server/focal/daily-live/current/focal-live-server-amd64.iso
# Agora vamos montar a imagem em /mnt:
$› sudo mount focal-live-server-amd64.iso /mnt/
# Agora copie tudo da pasta /mnt para a pasta /distros/ubuntu2004
$› sudo find /mnt -maxdepth 1 -not -wholename "/mnt" -exec cp -Rv {} /distros/ubuntu2004/ \;
Agora vamos compartilhar a pasta onde está nossa imagem do Ubuntu para que ela seja disponibilizada durante o boot:
# Edite o arquivo:
$› sudo vim /etc/exports
# Deixe como abaixo:
/distros/ubuntu2004 *(rw,sync,no_subtree_check)
# Exporte a configuração do NFS
$› sudo exportfs -a
Toda a configuração do pxe (arquivos e binários) é colocada dentro do tftp, para que assim o tftp possa fornecer os arquivos como pxelinux.0
, initrd
, vmlinuz
entre outros.
## Crie a pasta para colocarmos o pxelinux.0:
$› sudo mkdir /srv/tftp/pxe/
## Vamos pegar o pxelinux.0:
$› sudo cp -v /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/pxe/
## Crie a pasta onde colocaremos o arquivo de configuração padrão:
$› sudo mkdir /srv/tftp/pxelinux.cfg
## Crie o arquivo de configuração padrão:
$› sudo touch /srv/tftp/pxelinux.cfg/default
## Edite o arquivo:
$› sudo vim /srv/tftp/pxelinux.cfg/default
#### Coloque a informação abaixo: ####
default install
prompt 0
timeout 1
label install
menu label Install
kernel vmlinuz
append initrd=initrd ip=dhcp nfsroot=192.168.100.2:/distros/ubuntu2004/ netboot=nfs ro autoinstall ds=nocloud;s=/cdrom/nocloud/ ---
## Vamos colar a imagem do kernel e o initrd:
$› sudo cp /mnt/casper/{vmlinuz,initrd} /srv/tftp/
# Agora vamos copiar para o tftp o arquivo de bios simples:
$› sudo cp -v /usr/lib/syslinux/modules/bios/ldlinux.c32 /srv/tftp/
## Crie o link para o pxelinux.0 na raiz do tftp:
$› sudo ln -sf pxe/pxelinux.0 /srv/tftp/pxe5254
Agora vamos colocar na pasta da ISO que copiamos os arquivos necessários para fazer a instalação automática:
# Entre na pasta da ISO:
$› cd /distros/ubuntu2004
# Crie a pasta para colocar os arquivos:
$› mkdir nocloud
# Crie um arquivo para o meta-data:
$› touch nocloud/meta-data
# Crie o user-data, use o exemplo na sessão 'USER-DATA':
$› vim nocloud/user-data
# Mude a permissão da pasta abaixo:
$› chmod -w -R nocloud/
# Mude a permissão do arquivo de hash:
$› chmod +w md5sum.txt
# Altere o hash de tudo que alteramos dentro dessta pasta:
$› find -follow -type f ! -name md5sum.txt -print0 | xargs -0 md5sum > md5sum.txt
# Deixe a permissão do arquivo de hash como estava:
$› chmod -w md5sum.txt
USER-DATA
Segue abaixo um modelo do arquivo user-data
básico para uso.
#cloud-config
autoinstall:
version: 1
locale: en_US.UTF-8
keyboard:
layout: br
apt:
preserve_sources_list: false
sources_list: |
deb http://archive.ubuntu.com/ubuntu/ focal main universe
deb http://archive.ubuntu.com/ubuntu/ focal-updates main universe
deb http://archive.ubuntu.com/ubuntu/ focal-security main universe
deb http://archive.ubuntu.com/ubuntu/ focal-backports main universe
identity:
hostname: ubuntu
username: admin
password: $6$dzXL3m9SSOvAXlSX$vjYirzZijfB/Drse4Pgl79emtwrtSFhDoZDC.9j3h7bZcacyIsuX.KRN9BmZ7EApnmfv9ssjzP8WkBf7adxX4.
# Senha: 123
packages:
- vim
user-data:
disable_root: yes
final_message: "The system is finally up, after $UPTIME seconds"
Segue um exemplo adicionando uma chave GPG para um repositório.
#cloud-config
autoinstall:
version: 1
locale: en_US.UTF-8
keyboard:
layout: br
apt:
preserve_sources_list: false
sources_list: |
deb http://archive.ubuntu.com/ubuntu/ focal main universe
deb http://archive.ubuntu.com/ubuntu/ focal-updates main universe
deb http://archive.ubuntu.com/ubuntu/ focal-security main universe
deb http://archive.ubuntu.com/ubuntu/ focal-backports main universe
sources:
saltstack.list:
source: "deb http://archive.ubuntu.com/py3/ubuntu/20.04/amd64/latest focal main"
key: |
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2
mQENBFOpvpgBCADkP656H41i8fpplEEB8IeLhugyC2rTEwwSclb8tQNYtUiGdna9
m38kb0OS2DDrEdtdQb2hWCnswxaAkUunb2qq18vd3dBvlnI+C4/xu5ksZZkRj+fW
tArNR18V+2jkwcG26m8AxIrT+m4M6/bgnSfHTBtT5adNfVcTHqiT1JtCbQcXmwVw
WbqS6v/LhcsBE//SHne4uBCK/GHxZHhQ5jz5h+3vWeV4gvxS3Xu6v1IlIpLDwUts
kT1DumfynYnnZmWTGc6SYyIFXTPJLtnoWDb9OBdWgZxXfHEcBsKGha+bXO+m2tHA
gNneN9i5f8oNxo5njrL8jkCckOpNpng18BKXABEBAAG0MlNhbHRTdGFjayBQYWNr
YWdpbmcgVGVhbSA8cGFja2FnaW5nQHNhbHRzdGFjay5jb20+iQE4BBMBAgAiBQJT
qb6YAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRAOCKFJ3le/vhkqB/0Q
WzELZf4d87WApzolLG+zpsJKtt/ueXL1W1KA7JILhXB1uyvVORt8uA9FjmE083o1
yE66wCya7V8hjNn2lkLXboOUd1UTErlRg1GYbIt++VPscTxHxwpjDGxDB1/fiX2o
nK5SEpuj4IeIPJVE/uLNAwZyfX8DArLVJ5h8lknwiHlQLGlnOu9ulEAejwAKt9CU
4oYTszYM4xrbtjB/fR+mPnYh2fBoQO4d/NQiejIEyd9IEEMd/03AJQBuMux62tjA
/NwvQ9eqNgLw9NisFNHRWtP4jhAOsshv1WW+zPzu3ozoO+lLHixUIz7fqRk38q8Q
9oNR31KvrkSNrFbA3D89uQENBFOpvpgBCADJ79iH10AfAfpTBEQwa6vzUI3Eltqb
9aZ0xbZV8V/8pnuU7rqM7Z+nJgldibFk4gFG2bHCG1C5aEH/FmcOMvTKDhJSFQUx
uhgxttMArXm2c22OSy1hpsnVG68G32Nag/QFEJ++3hNnbyGZpHnPiYgej3FrerQJ
zv456wIsxRDMvJ1NZQB3twoCqwapC6FJE2hukSdWB5yCYpWlZJXBKzlYz/gwD/Fr
GL578WrLhKw3UvnJmlpqQaDKwmV2s7MsoZogC6wkHE92kGPG2GmoRD3ALjmCvN1E
PsIsQGnwpcXsRpYVCoW7e2nW4wUf7IkFZ94yOCmUq6WreWI4NggRcFC5ABEBAAGJ
AR8EGAECAAkFAlOpvpgCGwwACgkQDgihSd5Xv74/NggA08kEdBkiWWwJZUZEy7cK
WWcgjnRuOHd4rPeT+vQbOWGu6x4bxuVf9aTiYkf7ZjVF2lPn97EXOEGFWPZeZbH4
vdRFH9jMtP+rrLt6+3c9j0M8SIJYwBL1+CNpEC/BuHj/Ra/cmnG5ZNhYebm76h5f
T9iPW9fFww36FzFka4VPlvA4oB7ebBtquFg3sdQNU/MmTVV4jPFWXxh4oRDDR+8N
1bcPnbB11b5ary99F/mqr7RgQ+YFF0uKRE3SKa7a+6cIuHEZ7Za+zhPaQlzAOZlx
fuBmScum8uQTrEF5+Um5zkwC7EXTdH1co/+/V/fpOtxIg4XO4kcugZefVm5ERfVS
MA==
=dtMN
-----END PGP PUBLIC KEY BLOCK-----
identity:
hostname: ubuntu
username: admin
password: $6$PCEVa65wtyINGHXY$2pCsKii5D7M7UZRhtDMUlYrvhocgu/6AQf8dCNvuhezj8SWBsmc5INShr..KVSxcU3bBhmxgPPMAc5MOSkSbN.
ssh:
install-server: yes
packages:
- ubuntu-desktop
user-data:
disable_root: yes
final_message: "The system is finally up, after $UPTIME seconds"
Exemplo contendo uma partição uma partição swap
de 5GB e uma partição raiz /
com o restante do disco (sem usar lvm).
#cloud-config
autoinstall:
version: 1
locale: en_US.UTF-8
keyboard:
layout: br
apt:
preserve_sources_list: false
sources_list: |
deb http://archive.ubuntu.com/ubuntu/ focal main universe
deb http://archive.ubuntu.com/ubuntu/ focal-updates main universe
deb http://archive.ubuntu.com/ubuntu/ focal-security main universe
deb http://archive.ubuntu.com/ubuntu/ focal-backports main universe
storage:
config:
# Configurando o disco que vamos usar:
- id: disk0
type: disk
ptable: msdos
name: main_disk
wipe: superblock
grub_device: true
#
# Criando uma partição para esse disco, sendo a primeira (1) para swap:
- id: disk0-swap
type: partition
number: 1
size: 5GB
device: disk0
flag: swap
#
# Criando uma partição para esse disco, sendo a segunda (2) para raoz '/':
- id: disk0-root
type: partition
number: 2
size: -1
device: disk0
#
# Formatando a partição swap:
- id: disk0-swap-format
type: format
fstype: swap
volume: disk0-swap
#
# Formatando a partição raiz:
- id: disk0-root-format
type: format
fstype: ext4
volume: disk0-root
#
# Montando a partição swap (path: none)
- id: disk0-swap-mount
type: mount
path: none
device: disk0-swap-format
#
# Montando a partição raiz em '/':
- id: disk0-root-mount
type: mount
path: /
device: disk0-root-format
identity:
hostname: ubuntu
username: admin
password: $6$dzXL3m9SSOvAXlSX$vjYirzZijfB/Drse4Pgl79emtwrtSFhDoZDC.9j3h7bZcacyIsuX.KRN9BmZ7EApnmfv9ssjzP8WkBf7adxX4.
packages:
- vim
user-data:
disable_root: yes
final_message: "The system is finally up, after $UPTIME seconds"
Configurando disco com GPT em sistema apenas MBR.
#cloud-config
autoinstall:
version: 1
locale: en_US.UTF-8
keyboard:
layout: br
apt:
preserve_sources_list: false
sources_list: |
deb http://archive.ubuntu.com/ubuntu/ focal main universe
deb http://archive.ubuntu.com/ubuntu/ focal-updates main universe
deb http://archive.ubuntu.com/ubuntu/ focal-security main universe
deb http://archive.ubuntu.com/ubuntu/ focal-backports main universe
storage:
config:
# Configurando o disco que vamos usar:
- id: disk0
type: disk
ptable: gpt
name: main_disk
wipe: superblock
grub_device: true
#
# Resolvendo problema do gpt na MBR:
- id: disk0-mbr-partition
type: partition
number: 1
size: 1MB
device: disk0
flag: bios_grub
#
# Criando uma partição para esse disco, sendo a primeira (1) para swap:
- id: disk0-swap
type: partition
number: 2
size: 5GB
device: disk0
flag: swap
#
# Criando uma partição para esse disco, sendo a segunda (2) para raoz '/':
- id: disk0-root
type: partition
number: 3
size: -1
device: disk0
#
# Formatando a partição swap:
- id: disk0-swap-format
type: format
fstype: swap
volume: disk0-swap
#
# Formatando a partição raiz:
- id: disk0-root-format
type: format
fstype: ext4
volume: disk0-root
#
# Montando a partição swap (path: none)
- id: disk0-swap-mount
type: mount
path: none
device: disk0-swap-format
#
# Montando a partição raiz em '/':
- id: disk0-root-mount
type: mount
path: /
device: disk0-root-format
identity:
hostname: ubuntu
username: admin
password: $6$dzXL3m9SSOvAXlSX$vjYirzZijfB/Drse4Pgl79emtwrtSFhDoZDC.9j3h7bZcacyIsuX.KRN9BmZ7EApnmfv9ssjzP8WkBf7adxX4.
packages:
- vim
user-data:
disable_root: yes
final_message: "The system is finally up, after $UPTIME seconds"
A execução do user-data
no formato abaixo, notei uma melhora no desempenho em sistemas UEFI. Aqui temos um disco em gpt
, uma partição swap
, uma /boot/efi
e a raiz /
.
#cloud-config
autoinstall:
version: 1
locale: en_US.UTF-8
keyboard:
layout: br
storage:
grub:
reorder_uefi: False
config:
# Declara o disco:
- {id: disk0, type: disk, ptable: gpt, name: main_disk, wipe: superblock}
# Declara o /boot/efi e formata:
- {id: disk0-boot-efi, type: partition, size: 3GB, device: disk0, number: 1, flag: boot, grub_device: true}
- {id: disk0-boot-efi-format, type: format, fstype: fat32, volume: disk0-boot-efi, preserve: false, flag: boot}
# Declara o swap e formata:
- {id: disk0-swap, type: partition, size: 5GB, device: disk0, number: 2, preserve: false}
- {id: disk0-swap-format, type: format, fstype: swap, volume: disk0-swap, preserve: false}
# Declara a raiz '/' e formata:
- {id: disk0-root, type: partition, size: -1, number: 3, device: disk0}
- {id: disk0-root-format, type: format, fstype: ext4, volume: disk0-root}
# Monta as particoes:
- {id: disk0-swap-mount, type: mount, path: none, device: disk0-swap-format}
- {id: disk0-boot-efi-mount, type: mount, path: /boot/efi, device: disk0-boot-efi-format}
- {id: disk0-root-mount, type: mount, path: /, device: disk0-root-format}
identity: {hostname: ubuntu, password: $6$hF3dRy6uWwNZ4QfW$kmWQ/K4DE3yeDa9zZo0XKZHJI6lU0GPRx9UOZDYuegjdncJjzFC40wbPmyP1CGtDWDx6/1GpixHqvrvxB.kwx0, username: admin}
apt:
preserve_sources_list: false
sources_list: |
deb http://IP/ubuntu/ focal main universe
deb http://IP/ubuntu/ focal-updates main universe
deb http://IP/ubuntu/ focal-security main universe
deb http://IP/ubuntu/ focal-backports main universe
sources:
saltstack.list:
source: "deb http://IP/py3/ubuntu/20.04/amd64/latest focal main"
key: |
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2
mQENBFOpvpgBCADkP656H41i8fpplEEB8IeLhugyC2rTEwwSclb8tQNYtUiGdna9
m38kb0OS2DDrEdtdQb2hWCnswxaAkUunb2qq18vd3dBvlnI+C4/xu5ksZZkRj+fW
tArNR18V+2jkwcG26m8AxIrT+m4M6/bgnSfHTBtT5adNfVcTHqiT1JtCbQcXmwVw
WbqS6v/LhcsBE//SHne4uBCK/GHxZHhQ5jz5h+3vWeV4gvxS3Xu6v1IlIpLDwUts
kT1DumfynYnnZmWTGc6SYyIFXTPJLtnoWDb9OBdWgZxXfHEcBsKGha+bXO+m2tHA
gNneN9i5f8oNxo5njrL8jkCckOpNpng18BKXABEBAAG0MlNhbHRTdGFjayBQYWNr
YWdpbmcgVGVhbSA8cGFja2FnaW5nQHNhbHRzdGFjay5jb20+iQE4BBMBAgAiBQJT
qb6YAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRAOCKFJ3le/vhkqB/0Q
WzELZf4d87WApzolLG+zpsJKtt/ueXL1W1KA7JILhXB1uyvVORt8uA9FjmE083o1
yE66wCya7V8hjNn2lkLXboOUd1UTErlRg1GYbIt++VPscTxHxwpjDGxDB1/fiX2o
nK5SEpuj4IeIPJVE/uLNAwZyfX8DArLVJ5h8lknwiHlQLGlnOu9ulEAejwAKt9CU
4oYTszYM4xrbtjB/fR+mPnYh2fBoQO4d/NQiejIEyd9IEEMd/03AJQBuMux62tjA
/NwvQ9eqNgLw9NisFNHRWtP4jhAOsshv1WW+zPzu3ozoO+lLHixUIz7fqRk38q8Q
9oNR31KvrkSNrFbA3D89uQENBFOpvpgBCADJ79iH10AfAfpTBEQwa6vzUI3Eltqb
9aZ0xbZV8V/8pnuU7rqM7Z+nJgldibFk4gFG2bHCG1C5aEH/FmcOMvTKDhJSFQUx
uhgxttMArXm2c22OSy1hpsnVG68G32Nag/QFEJ++3hNnbyGZpHnPiYgej3FrerQJ
zv456wIsxRDMvJ1NZQB3twoCqwapC6FJE2hukSdWB5yCYpWlZJXBKzlYz/gwD/Fr
GL578WrLhKw3UvnJmlpqQaDKwmV2s7MsoZogC6wkHE92kGPG2GmoRD3ALjmCvN1E
PsIsQGnwpcXsRpYVCoW7e2nW4wUf7IkFZ94yOCmUq6WreWI4NggRcFC5ABEBAAGJ
AR8EGAECAAkFAlOpvpgCGwwACgkQDgihSd5Xv74/NggA08kEdBkiWWwJZUZEy7cK
WWcgjnRuOHd4rPeT+vQbOWGu6x4bxuVf9aTiYkf7ZjVF2lPn97EXOEGFWPZeZbH4
vdRFH9jMtP+rrLt6+3c9j0M8SIJYwBL1+CNpEC/BuHj/Ra/cmnG5ZNhYebm76h5f
T9iPW9fFww36FzFka4VPlvA4oB7ebBtquFg3sdQNU/MmTVV4jPFWXxh4oRDDR+8N
1bcPnbB11b5ary99F/mqr7RgQ+YFF0uKRE3SKa7a+6cIuHEZ7Za+zhPaQlzAOZlx
fuBmScum8uQTrEF5+Um5zkwC7EXTdH1co/+/V/fpOtxIg4XO4kcugZefVm5ERfVS
MA==
=dtMN
-----END PGP PUBLIC KEY BLOCK-----
ssh:
install-server: true
packages:
- ubuntu-desktop
version: 1
Usando o Cloud Init sem AutoInstall
Primeiro devemos instalar o pacote cloud-init
. O arquivo de configuação principal é o /etc/cloud/cloud.cfg
, mas podemos colocar em /etc/cloud/cloud.cfg.d/
.
O Cloud Init vem com alguns módulos que podemos usar, mas nem todos estão disponíveis no Auto Install do Ubuntu.
O Cloud Init deve terminar se o boot atual é o primeiro boot ou não, isso acontece porque caso seja o primeiro boot, o Cloud Init irá executar uma configuação chamada por instancia
e caso não seja, será executado uma configuração chamada por inicialização
.
Alguns comandos:
# Verificar quanto tempo cada módulo demorou:
cloud-init analyze
# Verificar configuração do Cloud Init:
cloud-init init --local
# Remover para que o cloud-init não rode após uma atualização:
rm -rf /var/lib/cloud
Fontes
https://askubuntu.com/questions/1296787/curtin-error-on-autoinstall-ubuntu-20-04-1
https://ubuntu.com/server/docs/install/autoinstall-reference
https://askubuntu.com/questions/1233454/how-to-preseed-ubuntu-20-04-desktop
https://tlhakhan.medium.com/ubuntu-server-20-04-autoinstall-2e5f772b655a
https://ubuntu.com/server/docs/install/autoinstall-quickstart
https://ubuntu.com/server/docs/install/autoinstall
https://cloudinit.readthedocs.io/en/latest/topics/datasources/nocloud.html
https://www.lucd.info/2019/12/07/cloud-init-part-2-advanced-ubuntu/
https://cloudinit.readthedocs.io/en/0.7.7/topics/examples.html#add-apt-repositories
https://wiki.archlinux.org/title/Cloud-init
https://nickcharlton.net/posts/automating-ubuntu-2004-installs-with-packer.html
https://cloudinit.readthedocs.io/en/latest/topics/debugging.html
http://cdimage.ubuntu.com/ubuntu-server/focal/daily-live/current/
https://ubuntu.com/server/docs/install/autoinstall-schema
https://cloudinit.readthedocs.io/en/latest/topics/examples.html
https://curtin.readthedocs.io/en/latest/topics/storage.html
https://www.golinuxcloud.com/generate-user-data-file-ubuntu-20-04/
Boa fonte para UEFI:
https://www.golinuxcloud.com/uefi-pxe-boot-server-ubuntu-20-04-cloud-init/