Tags possíveis podem ser usadas para executar apenas um subconjunto de tarefas / funções. Isso significa que, por padrão, todas as tarefas são executadas e só podemos impedir a execução de algumas tarefas.
Podemos limitar uma tarefa a ser executada apenas quando a tag "foo" for especificada? Podemos usar tags atuais na when
seção de uma tarefa?
Respostas:
O Ansible 2.5 vem com tags especiais
never
ealways
. A tagnever
pode ser usada exatamente para esse fim. Por exemplo:Neste exemplo, a tarefa será executada apenas quando a tag
debug
(ounever
) for solicitada explicitamente. [Referência em documentos ansible]fonte
Embora seja uma solução indireta, ela funciona.
Dentro da lista de tarefas, registre uma variável quando a execução normal for executada. Em seguida, adicione uma condição when que verifique essa variável na tarefa marcada.
fonte
untagged
para fazer isso:- set_fact: untagged_run=true
tags: untagged
Não tenho reputação suficiente para votar ou comentar a resposta que sugere o uso de variáveis de linha de comando (
--extra-vars
), mas tenho isso a acrescentar:Você pode impedir a falha na reprodução na ausência de uma
--extra-vars
definição, definindo um valor padrão no próprio manual:A substituição via
--extra-vars
ainda funcionará porque as variáveis definidas na linha de comando têm precedência sobre todas as outras definições.O resultado é que a reprodução é executada sem erro quando
thorough
não é alterada paratrue
na linha de comando.fonte
thorough | default('no') | bool
.when: thorough is defined and thorough
se você preferir que a sintaxeis defined and
sintaxe. mais do que os múltiplos canos que não considero intuitivos.Você pode usar Condicionais para se proteger contra tarefas em execução acidental que, caso contrário, seriam executadas se você não especificar uma tag. A ressalva deste método é que a jogada irá falhar e falhar se você não definir essa variável extra.
Usando o argumento extra-vars, você pode ativar sua condicional para ser executada.
Do ansible-playbook --help:
Exemplo:
test.yaml:
fonte
thorough | default("false") | match("true")
. O padrão não precisa serfalse
, apenas algo que não correspondatrue
, mas melhora a legibilidade.Verificar a variável 'tags' não está funcionando no Ansible 2.1.1.0. Veja abaixo o teste. Eu tenho uma outra idéia para executar tarefas apenas quando uma tag é definida, trabalhando para o Ansible 1.9.X e 2.XY:
Com isso, ao executar o playbook sem nenhuma tag, a variável 'foo' será configurada como true e depois false, para que nada seja executado. Se você adicionar a tag 'bar', somente a primeira configuração será aplicada; portanto, a variável 'foo' será verdadeira; sua tarefa será executada. Desfrutar!
E aqui está o teste sobre a variável 'tags' no Ansible 2.1.1.0:
Aqui está o manual:
E aqui está a saída:
fonte
Sim. A execução do ansible-playbook com o
--tags foo
sinalizador garantirá que apenas as tarefas marcadasfoo
sejam executadas. Por exemplo, suponha que tenhamos um manual chamado example.yml:corrida:
Garantirá que apenas a tarefa yum seja executada.
Então, na verdade, você não precisa usar tags na seção when para executar condicionalmente uma tarefa. Observe que, dependendo da complexidade de seus playbooks / funções, pode ser necessário usar uma combinação de --tags e --skip-tags para controlar quais tarefas são executadas. Por exemplo, se uma tarefa de inclusão estiver marcada como 'foo' e alguma tarefa dentro do manual incluído estiver marcada como 'barra' e você executar
A tarefa interna (marcada apenas como 'barra') será executada. Para evitar a execução de todas as tarefas internas marcadas como 'bar', você deverá executar o seguinte comando
fonte
ansible-playbook
opções corretas , mas acho que o OP está pedindo uma maneira de anotar uma tarefa para que não seja executada, a menos que uma tag específica seja explicitamente adicionada aoansible-playbook
comando.Há uma tag especial - "never" , que impedirá a execução de uma tarefa, a menos que uma tag seja solicitada especificamente.
fonte
A cláusula when não pode avaliar a presença de tags. Como solução alternativa, uso variáveis e tags juntas para executar tarefas específicas a essa tag / variável.
Ex: imagine um manual e um inventário
Com essa abordagem, você usa a tag para selecionar apenas as tarefas em uninstall.yml, mas também precisa definir a variável 'uninstall_links' para algo que a habilite. Portanto, se você executar o manual sem nenhum parâmetro, ele executará, por padrão, a tarefa de instalação. Para desinstalar, você pode definir a tag 'uninstall' como seu playbook (ou cmdline) e DEVE definir a variável. Se você não definir a tag, ela executará tudo (instalar e desinstalar) nessa ordem, o que é bom para testar todo o processo.
Como executar tudo (ele será instalado e desinstalado):
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"
Como executar apenas a tag 'uninstall' no grupo dev
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall
Portanto, variáveis e tags também podem estar nos arquivos site.yml / inventário, permitindo que você se comprometa com seu SCM e registre sua intenção.
fonte
nootal está certo, minha abordagem não funciona - ignore-a :( Agora eu uso "when: myvar is defined" e a linha de comando "-e" myvar = X "para executar tarefas apenas quando solicitadas explicitamente.
Ainda mais fácil (pelo menos com o ansible 2.1.1.0):
-> só será executado quando as tags forem fornecidas E as tags incluem "foo"
fonte
Em
Ansible 2.3.2.0
, aqui está minha solução para o problema:Ele começa definindo
in_tag
paraTrue
, em seguida, há umaset_fact
que define-lo de volta paraFalse
quando você não especificar qualquertags
deansible-playbook
.Quando você especifica tags,
in_tag
permanece emTrue
e afail
tarefa é executada.PS: você pode adicionar a lógica a qualquer tarefa que desejar
PS2: você também pode estender a lógica e codificar todas as tags que você possui e
set_fact: in_tag_blah=True
em combinação com, étags: ["blah"]
claro.fonte