Estou usando o Ansible para algumas tarefas simples de gerenciamento de usuários com um pequeno grupo de computadores. Atualmente, tenho meus playbooks definidos hosts: all
e meu arquivo de hosts é apenas um único grupo com todas as máquinas listadas:
# file: hosts
[office]
imac-1.local
imac-2.local
imac-3.local
Eu me vejo frequentemente tendo que segmentar uma única máquina. O ansible-playbook
comando pode limitar jogadas como esta:
ansible-playbook --limit imac-2.local user.yml
Mas isso parece meio frágil, especialmente para um manual potencialmente destrutivo. Deixar de fora a limit
bandeira significa que o manual seria executado em qualquer lugar. Como essas ferramentas são usadas apenas ocasionalmente, parece que vale a pena tomar medidas para uma reprodução infalível, para que não danifiquemos acidentalmente algo daqui a alguns meses.
Existe uma prática recomendada para limitar a execução de playbooks em uma única máquina? Idealmente, os manuais devem ser inofensivos se algum detalhe importante for deixado de fora.
fonte
--limit office[0]
'{{ target }}'
- de acordo com docs.ansible.com/…run_once
ainda pode ser destrutivo, portanto não é uma boa ideia.-e
é o equivalente a #--extra-vars
hosts: "{{ target | default('no_hosts')}}"
Há também um pequeno truque que permite especificar um único host na linha de comando (ou vários hosts, eu acho), sem um inventário intermediário:
Observe a vírgula ( , ) no final; isso sinaliza que é uma lista, não um arquivo.
Agora, isso não o protegerá se você passar acidentalmente um arquivo de inventário real, por isso pode não ser uma boa solução para esse problema específico. Mas é um truque útil para saber!
fonte
skipping: no hosts matched
. Talvez esse truque não funcione mais desde que--limit
funciona?$ ansible-playbook -kK --limit=myhost1 myplaybook.yml
. Veja a resposta de Marwan.all
na peça (s) - este Levei um tempo para descobrir ...Essa abordagem será encerrada se mais de um host for fornecido, verificando a variável play_hosts . O módulo de falha é usado para sair se a condição de host único não for atendida. Os exemplos abaixo usam um arquivo de hosts com dois hosts alice e bob.
user.yml (manual)
Executar playbook sem filtros de host
Executar playbook em host único
fonte
--limit
é o caminho a percorrerplay_hosts
foi descontinuado no Ansible 2.2 e substituído poransible_play_hosts
. Para executar em um host sem exigir--limit
, você pode usarwhen: inventory_hostname == ansible_play_hosts[0]
.[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ play_hosts|length }} == ''
no Ansible 2.8.4.Há IMHO uma maneira mais conveniente. Você pode solicitar interativamente ao usuário as máquinas às quais ele deseja aplicar o manual, graças a
vars_prompt
:fonte
--extra-vars
e uma var normal no seu manual…{{ hosts }}
é avaliado antes que o valor seja inserido - ou existe um truque especial?Para expandir a resposta do joemailer, se você deseja ter a capacidade de correspondência de padrões para corresponder a qualquer subconjunto de máquinas remotas (assim como o
ansible
comando), mas ainda deseja dificultar a execução acidental do manual em todas as máquinas, é o que eu criei:O mesmo manual da outra resposta:
Vamos ter os seguintes hosts:
Agora, para executar o comando em todos os dispositivos, é necessário definir explicitamente a variável de destino como "todos"
E para limitá-lo a um padrão específico, você pode definir
target=pattern_here
ou, como alternativa, você pode deixar
target=all
e anexar o--limit
argumento, por exemplo:ie
ansible-playbook user.yml --extra-vars "target=all" --limit imac-1* --list-hosts
o que resulta em:
fonte
Eu realmente não entendo como todas as respostas são tão complicadas, a maneira de fazer isso é simplesmente:
O
check
modo permite executar no modo de funcionamento a seco, sem fazer nenhuma alteração.fonte
--check
, então acho que isso ainda é útil em termos de documentação, como esta pergunta pode ser muito googlableOs usuários da AWS que usam o Script de inventário externo do EC2 podem simplesmente filtrar por ID da instância:
Isso funciona porque o script de inventário cria grupos padrão .
fonte
Temos alguns manuais genéricos que podem ser usados por um grande número de equipes. Também temos arquivos de inventário específicos do ambiente, que contêm várias declarações de grupo.
Para forçar alguém que chama um manual a especificar um grupo para o qual concorrer, propomos uma entrada fictícia na parte superior do manual:
Em seguida, incluímos a seguinte verificação como primeira etapa no manual compartilhado:
Se o servidor fictício aparecer na lista de hosts com os quais este manual está programado para executar (ansible_play_batch), o chamador não especificou um grupo e a execução do manual falhará.
fonte
ansible_play_batch
lista apenas o lote atual; portanto, ao usar o lote, isso ainda não é seguro. É melhor usar em seuansible_play_hosts
lugar.Desde a versão 1.7 ansible tem a opção run_once . A seção também contém algumas discussões de várias outras técnicas.
fonte
Isso mostra como executar os playbooks no próprio servidor de destino.
Isso é um pouco mais complicado se você quiser usar uma conexão local. Mas isso deve ser bom se você usar uma variável para a configuração de hosts e no arquivo hosts criar uma entrada especial para o host local.
Em (todos) os playbooks têm a linha hosts: definida como:
No arquivo hosts do inventário, adicione uma entrada para o host local, que define a conexão como local:
Em seguida, na linha de comando, execute comandos definindo explicitamente o destino - por exemplo:
Isso também funcionará ao usar o ansible-pull:
Se você esquecer de definir a variável na linha de comando, o comando irá com erro (desde que você não tenha criado um grupo de hosts chamado 'no_hosts'!) Com um aviso de:
E, como mencionado acima, você pode direcionar uma única máquina (desde que esteja no arquivo hosts) com:
ou um grupo com algo como:
fonte
Eu tenho um script de invólucro chamado provisionamento obriga a escolher o destino, então não preciso lidar com isso em nenhum outro lugar.
Para quem é curioso, eu uso vars ENV para opções que meu arquivo de vagrant usa (adicionando o arg ansible correspondente para sistemas em nuvem) e deixo o resto dos args ansible passar. Onde estou criando e provisionando mais de 10 servidores por vez, incluo uma nova tentativa automática em servidores com falha (desde que haja progresso - descobri que ao criar mais de 100 servidores por vez, muitas vezes alguns falhavam na primeira vez )
fonte
Uma solução ligeiramente diferente é usar a variável especial,
ansible_limit
que é o conteúdo da--limit
opção CLI para a execução atual do Ansible.Não há necessidade de definir uma variável extra aqui, basta executar o manual com a
--limit
bandeira.fonte