Eu tenho uma stansa muito simples no meu cloud-init,
write_files:
- path: /home/ecarroll/.zshrc
content: |
source ~/powerlevel10k/powerlevel10k.zsh-theme
owner: ecarroll:ecarroll
permissions: '0644'
defer: true
A defer
sinalização está documentada no documento Cloud Init: Write Flags ,
defer: (boolean) Adiar a gravação do arquivo até o estágio 'final', depois que os usuários foram criados e os pacotes foram instalados. Padrão:
False
.
Mas quando eu uso como acima, eu recebo
schema.py[WARNING]: Invalid config: write_files.0: Additional properties are not allowed ('defer' was unexpected)
util.py[DEBUG]: Writing to /home/ecarroll/.zshrc - wb: [644] 47 bytes
handlers.py[DEBUG]: finish: init-network/config-write-files: FAIL: running config-write-files with frequency once-per-instance
util.py[WARNING]: Running module write-files (<module 'cloudinit.config.cc_write_files' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_write_files.py'>) failed
util.py[DEBUG]: Running module write-files (<module 'cloudinit.config.cc_write_files' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_write_files.py'>) failed
A razão real pela qual eu preciso defer
é encontrada no rastreamento. É porque eu preciso que o arquivo seja chown'd para o usuário ( ecarroll
) que o cloud-init ainda não criou,
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1380, in chownbyname
uid = pwd.getpwnam(user).pw_uid
KeyError: "getpwnam(): name not found: 'ecarroll'"
Estou no Ubuntu 20.04.4 LTS.
Você precisa atualizar para cloud-init v21.4, que é a versão que adicionou a propriedade defer a write_files.
Verifique a versão com a qual você está executando
cloud-init -v
, e comhead -n 1 /var/log/cloud-init.log
veja a resposta de Brett acimaSe esses dois discordarem, você pode querer verificar Por que a versão do cloud-init no arquivo de log entra em conflito com a versão no binário?
O que mostra a seguir?
Sem a instrução defer, vejo uma exceção semelhante no Ubuntu 20.04 cloud-init 22.1:
Se eu adicionar adiar, funciona como esperado:
Observe que o aviso "Propriedades adicionais" não existe no meu log. Este aviso indica que você usou uma chave em sua configuração de nuvem que o validador jsonschema não conhece. Nesse caso, isso indica que a versão em execução é anterior à palavra-
defer
chave.Observe que no traceback que você relatou,
getpwname
está na linha 1380.A versão mais recente do cloud-init em 20.04 para a qual isso é verdade é a versão 21.2 .
Na versão 21.3 , essa chamada para
getpwname
foi empurrada de volta para a linha 1429.Com base nas informações acima, eu diria que o cloud-init foi executado em uma versão que não era compatível
defer
e foi atualizado posteriormente para 21.4.Se você quiser tentar executar novamente todos os estágios de inicialização na nuvem, sempre poderá tentar
cloud-init clean --logs
uma reinicialização seguida de uma reinicialização. Isso deve remover artefatos de inicialização de nuvem. Você pode achar que oslxc
comandos acima são úteis para experimentar módulos localmente antes de executá-los em uma nuvem.