Como posso definir diretivas compartilhadas entre todas as tarefas no arquivo, em um arquivo de fragmento de playbook Ansible que contém apenas tarefas ?
# ansible/inventory/roles/os_packages/tasks/main.yaml
- name: "APT: Update available packages from Debian repositories"
gather_facts: false
become: true
become_user: root
apt:
update_cache: true
- name: "APT: Install required packages"
gather_facts: false
become: true
become_user: root
apt:
name:
- foo
- bar
Essas diretivas repetidas — gather_facts
, become
, etc. — devem ser declaradas uma vez nesse arquivo. Mas onde, já que não existe (atualmente?) nenhum arquivo representando o papel ou peça?
# ansible/inventory/roles/os_packages/tasks/main.yaml
# This doesn't work because Ansible is expecting only tasks.
gather_facts: false
become: true
become_user: root
- name: "APT: Update available packages from Debian repositories"
apt:
update_cache: true
- name: "APT: Install required packages"
apt:
name:
- foo
- bar
O arquivo precisa consistir apenas em uma sequência de tarefas; o nível "role" ou "play" não parece ter um lugar apropriado nesta estrutura de diretórios recomendada .
Se o playbook inteiro estivesse em um arquivo, cada play teria seu próprio nome separado e eu definiria as diretivas no play. Mas esses arquivos de tarefas estão sendo reunidos e compilados, e não há lugar onde o jogo exista para eu escrever essas diretivas.
Onde as diretivas que se aplicam a todas as tarefas em uma função devem ser definidas?
Minha estrutura de diretórios típica:
Neste caso, eu coloco tais diretivas no jogo de nível superior
deploy-something.yml
:gather_facts
não é significativo (ou possível) definir para outra coisa que não seja uma peça, porque afeta apenas a decisão no nível da peça de coletar fatos.become
ebecome_user
são palavras-chave válidas em nível de bloco ou tarefa, portanto, você pode usar um bloco para aplicá-las a uma lista de tarefas (dentro de uma função ou não):Muitas palavras-chave também podem ser aplicadas ao chamar funções:
P: " Onde as diretivas que se aplicam a todas as tarefas em uma função devem ser definidas? "
R: A resposta curta é: Fora de uma função.
Onde exatamente você deve colocar as palavras-chave depende de como você usa a função. Existem mais opções
Está fora do escopo explicar todos os detalhes aqui. Geralmente, coloque essas palavras-chave no nível (recuo) de uma função. No caso de include_role , você também pode aplicar palavras- chave. Esteja ciente de que nem todas as palavras-chave podem ser aplicadas em todos os lugares. Consulte Palavras-chave do manual que se aplicam a funções. Por exemplo, a palavra-chave
gather_facts
pode ser aplicada apenas a um manual. Uma das opções de como resolver seu problema pode ser a estrutura da peça abaixoP: " Como fazer isso (aplicar essas palavras-chave no nível de uma função), quando não há arquivo de configuração (apenas um diretório de função) representando a função? "
R: Se houver apenas o diretório de funções, representando a função, você poderá aplicar palavras-chave apenas aos blocos e tarefas dentro da função. Você não pode aplicar palavras-chave a uma função dentro dessa função. Não existe um arquivo de configuração para uma função.
Na resposta anterior, por nível, quero dizer o nível de recuo, por exemplo, no código acima,
gather_facts
aplicado à peça enquanto ambosbecome
ebecome_user
aplicado à função.