Variável que tem o caminho para o cartilha do ansible atual que está sendo executado?

109

Existe uma variável ansible que tem o caminho absoluto para o atual ansible-playbook que está sendo executado?

algum contexto: Estou executando / criando um script ansible localhostpara configurar um docker mysql e querendo montar o volume de dados relativo ao script ansible.

Por exemplo, digamos que fiz check-out de um repositório ~/branch1/e, em seguida, executei e ansible-playbook dev.ymlpensei que deveria salvar o volume ~/branch1/.docker_volume/. Se eu o executei a partir de ~/branch2então, ele deve configurar o volume para ~/branch2/.docker_volume/.

Josh Unger
fonte
2
Uma pergunta interessante, que nunca pensei. No entanto, o fato de você estar perguntando é um indicador de que você pode estar fazendo algo de uma maneira muito errada.
Antonis Christofides
Eu concordo, vou elaborar @AntonisChristofides
Josh Unger

Respostas:

192

Você pode usar playbook_dirvariável.

Seva Poliakov
fonte
2
Eu estava enfrentando um problema semelhante e sua resposta o resolveu. Obrigado. No entanto, não consegui encontrar nenhum lugar onde a playbook_dirvariável está documentada. Você poderia me indicar a documentação, por favor. OU, você poderia explicar como conheceu essa variável?
slayedbylucifer
3
Eu encontro no código ansible: github.com/ansible/ansible/blob/…
Seva Poliakov
2
TAMBÉM, há um repositório interessante github.com/lorin/ansible-quickref com todas as variáveis.
Seva Poliakov
46

Não parece haver uma variável que contém exatamente o que você deseja.

No entanto, citando os documentos :

Também disponível, inventory_direstá o nome do caminho do diretório que contém o arquivo de host de inventário do Ansible, inventory_fileé o nome do caminho e o nome do arquivo apontando para o arquivo de host de inventário do Ansible.

playbook_dir contém o diretório base do playbook.

E, finalmente, role_pathretornará o nome do caminho da função atual (desde 1.8). Isso só funcionará dentro de uma função.

Dependendo da sua configuração, esses ou a $ pwdsolução com base podem ser suficientes.

Cray
fonte
2

Infelizmente não existe. Na verdade, o caminho absoluto é um pouco sem sentido (e potencialmente confuso) no contexto de como o Ansible é executado. Em suma, quando você invoca um manual, para cada tarefa, o Ansible copia fisicamente o módulo associado à tarefa para um diretório temporário na máquina de destino e, em seguida, invoca o módulo com os parâmetros necessários. Portanto, o caminho absoluto na máquina de destino é apenas um diretório temporário que contém apenas alguns arquivos temporários dentro dele e nem mesmo inclui o manual completo. Além disso, saber o caminho completo de um arquivo no servidor Ansible é praticamente inútil em uma máquina de destino, a menos que você esteja replicando toda a árvore de diretórios do Ansible nos destinos.

Para ver todas as variáveis ​​definidas pelo Ansible, você pode simplesmente executar o seguinte comando :

$ ansible -m setup hostname

Por que você acha que precisa saber o caminho absoluto para o manual?

Bruce P
fonte
Obrigado Bruce, modifiquei minha pergunta para elaborar o que estava tentando fazer.
Josh Unger
6
O caminho local absoluto não é sem sentido de forma alguma. Por exemplo, pode ser usado para executar quaisquer comandos locais e / ou consultar outros arquivos ou serviços locais que não puderam ser incluídos diretamente na configuração do ansible. O simples fato de o ansible ter o local_actionmódulo significa que existem casos de uso legítimos para isso.
Cray de
1

Eu estava usando um manual como este para testar minhas funções localmente:

---
- hosts: localhost
  roles:
     - role: .

mas isso parou de funcionar com o Ansible v2.2.

Eu depurei a solução mencionada de

---
- hosts: all
  tasks:
    - name: Find out playbooks path
      shell: pwd
      register: playbook_path_output
    - debug: var=playbook_path_output.stdout

e produziu meu diretório inicial e não o "diretório de trabalho atual"

Me acomodei com

---
- hosts: all
  roles:
    - role: '{{playbook_dir}}'

de acordo com a solução acima.

Andrew Rothstein
fonte
1

Não existe uma variável incorporada para este propósito, mas você sempre pode descobrir o caminho absoluto do manual com o comando "pwd" e registrar sua saída em uma variável.

- name: Find out playbook's path
  shell: pwd
  register: playbook_path_output
- debug: var=playbook_path_output.stdout

Agora o caminho está disponível na variável playbook_path_output.stdout

hyt
fonte
7
Nesse caso pwd, não retorna o caminho do script do manual. Ele retorna o diretório atual do processo (normalmente ansible-playbook). Os dois não precisam ser iguais e dependem da maneira exata como o ansible foi chamado.
Cray de
5
@Cray está correto. Independentemente disso, eu só queria mencionar que o Ansible já prepara essa variável para você: debug: var=ansible_env.PWD(isso me dá o diretório a partir do qual eu executei ansible-playbookna minha máquina local e o diretório inicial em servidores remotos)
NS du Toit
4
Alternativamente, o diretório atual pode ser encontrado com:{{ lookup('env','PWD') }}
isedwards