Estou tentando criar um arquivo sudoers com modelo ansible. O arquivo sudoers deve se parecer com abaixo:
Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /usr/bin/less
Cmnd_Alias DU = /usr/bin/du
%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU
O que eu consegui até agora está abaixo:
Cmnd_Alias LS = ls
Cmnd_Alias LESS = less
Cmnd_Alias DU = du
%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU
O modelo se parece abaixo:
{% for item in commands %}
Cmnd_Alias {{ item|upper }} = {{ item }}
{% endfor %}
%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}
{% endfor %}
vars
commands:
- ls
- less
- du
Até onde eu sei, o módulo de modelo ansible não tem nada que execute o comando no servidor remoto e imprima a saída, caso contrário, eu estava pensando em alterar o arquivo de modelo para se parecer com abaixo:
{% for item in commands %}
Cmnd_Alias {{ item|upper }} = `which {{ item }}`
{% endfor %}
%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}
{% endfor %}
e a saída será como o que eu queria.
Existe algum outro método que possa torná-lo simples?
BTW eu já verifiquei este post
Respostas:
TL; DR: KISS. Não use menos.
As pessoas geralmente cometem um erro de ansiedade, tentando fazer coisas variáveis que não precisam ser. A menos que haja vários locais onde você define a lista de comandos que o suporte pode acessar, é perfeitamente aceitável colocá-los no arquivo de criação de modelo:
templates / etc / sudoers.d / support1
ou mesmo explicitamente, pois você não reutiliza o Cmnd_Alias em nenhum lugar
E adicione algumas tarefas como:
Você usaria apenas modelos em vez de arquivos, porque mais tarde pode haver alguma variável a ser adicionada a todos ou o nome do grupo pode vir da variável se você receber outra função que crie os grupos.
Se você precisar usar variável, o que você pode fazer é usar uma lista de hashes como esta:
Então no modelo:
Não é seguro usar / usr / bin / less
Em tudo isso, você não percebeu muita coisa importante e esse é o uso de menos como visualizador. Infelizmente, isso é uma brecha na segurança. Você pode digitar '! Bash' para chamar o bash. E pressionando 'v', você entra no editor com base nas variáveis VISUAL, EDITOR ou LESSEDIT. Então você pode dar a eles '/ bin / cat' e eles sempre podem canalizar o conteúdo para menos eles mesmos. Observe que isso ainda é um problema de segurança, pois alguns arquivos no unix são muito intencionalmente restritos, por exemplo:
fonte
primeiramente
você deve consultar o manuseio de espaços / novas linhas do Jinja. seu modelo atual criaria novas linhas, e acho que isso confundirá
sudo
e falhará na validação da sintaxe (IIRC, a sintaxe correta é adicionar-
como:-%}
no loop for, mas você deve "tocar" e ver o que acontece). Para renderizar um modelo, você pode fazê-lo em sua estação de trabalho, sem executá-lo na máquina de destino real.Além disso, acho que a criação do modelo com 1 comando na linha de instruções é mais legível:
Em segundo lugar
Eu não recomendo editar arquivos globais existentes com ansible. Em vez disso, crie seu modelo personalizado em
/etc/sudoers.d/
(como você mencionou que viu).Esta é a maneira correta de fazer isso, porque:
Em terceiro lugar
Acho que executar
which
dentrosudoers
é uma ideia original, mas não deve funcionar.fonte