É comum que uma role Ansible instale pacotes que utilizem unidades systemd para rodar. Como utilizamos o driver docker do molecule para testar as nossas roles, é preciso que o container utilizado como alvo seja capaz de rodar systemd, o que não é possível por padrão.
Até então, a forma como isso vinha sendo feito é utilizar uma imagem base pré-configurada com systemd e montar o caminho /sys/fs/cgroup do host dentro do container usando a seguite configuração do molecule:
platforms:
# ...
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
Esse caminho é a raiz da hierarquia dos processos que estão rodando dentro dos cgroups, e isso funcionava anteriormente porque a maioria das ferramentas e distribuições Linux usavam a versão v1 do cgroups.
Mas, recentemente, essas ferramentas e distros passaram a migrar para utilizar a versão v2 de cgroups por padrão. Nessa nova versão, a hierarquia dos arquivos que descrevem os processos foi alterada para uma hierarquia unificada, de forma que apenas montar esse volume não é mais suportado.
O systemd passou a utilizar a hierarquia unificada como padrão a partir da versão 243. O Docker suporta cgroup v2 desde a versão 20.10.0 e o Docker Desktop começou a usar cgroup v2 como padrão na versão 4.3.0. Debian 11, Ubuntu 21.10, Fedora 31 e Arch Linux também já utilizam cgroup v2 por padrão.
Essas mudanças resultam em diversos problemas na hora de testar roles localmente, uma vez que cada máquina poderá utilizar versões diferentes dessas ferramentas.
Alternativas
Por enquanto não existe uma solução definitiva para o problema. A opção mais promissora para ser usar a flag --cgroupns host na criação do container, mas isso ainda não é suportado pelo molecule.
A melhor alternativa, por enquanto, é reverter configurações locais para utilizar a versão v1 do cgroups.
Linux
Adicionar a opção systemd.unified_cgroup_hierarchy=0 na configuração de boot do kernel.
Para sistemas Fedore/Centos/RHEL, é possível utilizar a ferramenta grubby:
$ sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
Para sistemas Ubuntu/Debian esse valor pode ser definido na variável GRUB_CMDLINE_LINUX no arquivo /etc/default/grub e depois executando o comando sudo update-grub.
Reinicie o seu computador para aplicar a mudança.
Docker Desktop for Mac
Edite o arquivo ~/Library/Group\ Containers/group.com.docker/settings.json para habilitar a opção deprecatedCgroupv1:
{
...
"deprecatedCgroupv1": true,
...
}
Reinicie o Docker Desktop.
É comum que uma role Ansible instale pacotes que utilizem unidades
systemdpara rodar. Como utilizamos o driverdockerdomoleculepara testar as nossas roles, é preciso que o container utilizado como alvo seja capaz de rodarsystemd, o que não é possível por padrão.Até então, a forma como isso vinha sendo feito é utilizar uma imagem base pré-configurada com
systemde montar o caminho/sys/fs/cgroupdo host dentro do container usando a seguite configuração do molecule:Esse caminho é a raiz da hierarquia dos processos que estão rodando dentro dos cgroups, e isso funcionava anteriormente porque a maioria das ferramentas e distribuições Linux usavam a versão v1 do cgroups.
Mas, recentemente, essas ferramentas e distros passaram a migrar para utilizar a versão v2 de cgroups por padrão. Nessa nova versão, a hierarquia dos arquivos que descrevem os processos foi alterada para uma hierarquia unificada, de forma que apenas montar esse volume não é mais suportado.
O systemd passou a utilizar a hierarquia unificada como padrão a partir da versão 243. O Docker suporta cgroup v2 desde a versão 20.10.0 e o Docker Desktop começou a usar cgroup v2 como padrão na versão 4.3.0. Debian 11, Ubuntu 21.10, Fedora 31 e Arch Linux também já utilizam cgroup v2 por padrão.
Essas mudanças resultam em diversos problemas na hora de testar roles localmente, uma vez que cada máquina poderá utilizar versões diferentes dessas ferramentas.
Alternativas
Por enquanto não existe uma solução definitiva para o problema. A opção mais promissora para ser usar a flag
--cgroupns hostna criação do container, mas isso ainda não é suportado pelomolecule.A melhor alternativa, por enquanto, é reverter configurações locais para utilizar a versão v1 do cgroups.
Linux
Adicionar a opção
systemd.unified_cgroup_hierarchy=0na configuração de boot do kernel.Para sistemas Fedore/Centos/RHEL, é possível utilizar a ferramenta
grubby:$ sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"Para sistemas Ubuntu/Debian esse valor pode ser definido na variável
GRUB_CMDLINE_LINUXno arquivo/etc/default/grube depois executando o comandosudo update-grub.Reinicie o seu computador para aplicar a mudança.
Docker Desktop for Mac
Edite o arquivo
~/Library/Group\ Containers/group.com.docker/settings.jsonpara habilitar a opçãodeprecatedCgroupv1:{ ... "deprecatedCgroupv1": true, ... }Reinicie o Docker Desktop.