Este é um fragmento de um manual que estou usando ( server.yml
):
- name: Determine Remote User
hosts: web
gather_facts: false
roles:
- { role: remote-user, tags: [remote-user, always] }
Meu arquivo hosts tem diferentes grupos de servidores, por exemplo
[web]
x.x.x.x
[droplets]
x.x.x.x
Agora desejo executar ansible-playbook -i hosts/<env> server.yml
e substituir hosts: web
de server.yml
para executar este manual [droplets]
.
Posso apenas substituir como uma coisa única, sem editar server.yml
diretamente?
Obrigado.
ansible
ansible-playbook
luqo33
fonte
fonte
hosts: "{{ variable_host | default('web')}}"
ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"
group_vars/all
parecem ser analisadas após ahosts:
linha do manual. No entanto, as variáveis emvars:
e as variáveis emvars_files:
são analisadas antes dahosts:
linha? NOTA estou não perguntando sobre precedência.-e
vez de--extra-vars
.Para quem vier à procura da solução.
Livro de cantadas
Inventário
Comando:
ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets"
Assim, você pode especificar o nome do grupo no extra-varsfonte
play_hosts
e não obtive os resultados esperados porque esqueci queplay_hosts
é uma var interna do Ansible para todos os hosts no jogo atual.É um pouco tarde, mas acho que você poderia usar o
--limit or -l
comando para limitar o padrão a hosts mais específicos. (versão 2.3.2.0)Você pode ter
- hosts: all (or group) tasks: - some_task
e então
ansible-playbook playbook.yml -l some_more_strict_host_or_pattern
use o--list-hosts
sinalizador para ver em quais hosts essa configuração seria aplicada.fonte
limit
da lista de hosts afetados, o manual pode causar muitos danos.--extra-vars "variable_host=newtarget(s)"
exatamente como a solução aceita é tão perigoso e uma solução mais complicada. Ele usa um host padrãoweb
que pode ser aplicado aqui também em vez deall
. Você pode usar um grupo de hosts restrito como padrão para evitar cometer erros e usar o--list-hosts
sinalizador para ter uma compreensão clara de quais hosts você está afetando.--limit
(caso contrário, afetará todos os hosts possíveis, que podem não ser o comportamento que você deseja)Usamos uma tarefa de falha simples para forçar o usuário a especificar a opção de limite Ansible , de modo que não executemos em todos os hosts por padrão / acidente.
A maneira mais fácil que encontrei é esta:
Agora devemos usar a opção
-l
(=--limit
) quando executamos o manual, por exemploDocumentos de opção de limite :
fonte
Estou usando outra abordagem que não precisa de nenhum inventário e funciona com este comando simples:
Para fazer isso, você precisa de um manual com duas jogadas:
Um exemplo de trabalho (copie-o e execute-o com o comando anterior):
fonte
Eu mudei o meu para o padrão sem host e tenho uma verificação para detectá-lo. Dessa forma, o usuário ou cron é forçado a fornecer um único host ou grupo etc. Gosto da lógica do comentário de @wallydrag. O
empty_group
não contém hosts no inventário.Em seguida, adicione as tarefas de check-in:
fonte
Acabei de encontrar esta busca no Google por uma solução. Na verdade, existe um no Ansible 2.5. Você pode especificar seu arquivo de inventário com
--inventory
, desta forma:ansible --inventory configs/hosts --list-hosts all
fonte
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY specify inventory host path or comma separated host list. --inventory-file is deprecated
Se você deseja executar uma tarefa que está associada a um host, mas em um host diferente, você deve tentar delegate_to .
No seu caso, você deve delegar ao seu host local (ansible master) e chamar o
ansible-playbook
comandofonte
Estou usando o ansible 2.5 (exatamente 2.5.3) e parece que o arquivo vars é carregado antes que o parâmetro hosts seja executado. Assim, você pode definir o host em um arquivo vars.yml e apenas escrever
hosts: {{ host_var }}
em seu manualPor exemplo, em meu playbook.yml:
E dentro de vars / project.yml:
fonte
Aqui está uma solução legal que vim para especificar hosts com segurança por meio da
--limit
opção. Neste exemplo, a reprodução terminará se o manual for executado sem nenhum host especificado por meio da--limit
opção.Isso foi testado em Ansible versão 2.7.10
fonte
Uma outra solução é usar a variável especial
ansible_limit
que é o conteúdo da--limit
opção CLI para a execução atual de Ansible.Se a
--limit
opção for omitida, o Ansible emitirá um aviso, mas não fará nada, já que nenhum host correspondeu.fonte