Variabel yang memiliki jalur ke playbook yang mungkin saat ini sedang dieksekusi?

109

Apakah ada variabel yang memungkinkan yang memiliki jalur absolut ke pedoman yang mungkin saat ini dijalankan?

beberapa konteks: Saya menjalankan / membuat skrip yang memungkinkan localhostuntuk mengonfigurasi buruh pelabuhan mysql dan ingin memasang volume data relatif ke skrip yang memungkinkan.

Sebagai contoh, katakanlah saya telah memeriksa repositori ke ~/branch1/dan kemudian saya menjalankannya, ansible-playbook dev.ymlsaya pikir itu harus menghemat volume ~/branch1/.docker_volume/. Jika saya menjalankannya sejak ~/branch2saat itu, volume harus dikonfigurasi ~/branch2/.docker_volume/.

Josh Unger
sumber
2
Sebuah pertanyaan menarik, yang tidak pernah saya pikirkan. Namun fakta bahwa Anda menanyakannya merupakan indikator bahwa Anda mungkin melakukan sesuatu dengan cara yang sangat salah.
Antonis Christofides
Saya setuju, saya akan menjelaskan lebih lanjut @AntonisChristofides
Josh Unger

Jawaban:

192

Anda dapat menggunakan playbook_dirvariabel.

Seva Poliakov
sumber
2
Saya menghadapi masalah serupa dan jawaban Anda menyelesaikannya. Terima kasih. Namun, saya tidak dapat menemukan tempat di mana playbook_dirvariabel didokumentasikan. Bisakah Anda menunjukkan saya ke dokumentasinya? ATAU, dapatkah Anda menjelaskan bagaimana Anda bisa mengetahui tentang variabel ini?
slayedbylucifer
3
Saya menemukannya di kode yang memungkinkan
Seva Poliakov
2
JUGA, ada repo github.com/lorin/ansible-quickref yang menarik dengan semua variabel.
Seva Poliakov
46

Sepertinya tidak ada variabel yang sesuai dengan keinginan Anda.

Namun, mengutip dokumen :

Juga tersedia, inventory_diradalah nama jalur direktori yang menyimpan file host inventaris Ansible, inventory_fileadalah nama jalur dan nama file yang menunjuk ke file host inventaris Ansible.

playbook_dir berisi direktori dasar playbook.

Dan akhirnya, role_pathakan mengembalikan nama jalur peran saat ini (sejak 1.8). Ini hanya akan bekerja di dalam sebuah peran.

Bergantung pada penyiapan Anda, itu atau $ pwdsolusi berbasis mungkin cukup.

Cray
sumber
2

Sayangnya tidak ada. Faktanya jalur absolut agak tidak berarti (dan berpotensi membingungkan) dalam konteks bagaimana Ansible berjalan. Singkatnya, ketika Anda menjalankan playbook maka untuk setiap tugas Ansible secara fisik menyalin modul yang terkait dengan tugas tersebut ke direktori sementara pada mesin target dan kemudian memanggil modul dengan parameter yang diperlukan. Jadi jalur absolut pada mesin target hanyalah direktori sementara yang hanya berisi beberapa file sementara di dalamnya, dan bahkan tidak menyertakan pedoman lengkap. Selain itu, mengetahui jalur lengkap file di server Ansible sangat tidak berguna di mesin target kecuali jika Anda mereplikasi seluruh pohon direktori Ansible Anda pada target.

Untuk melihat semua variabel yang ditentukan oleh Ansible Anda cukup menjalankan perintah berikut :

$ ansible -m setup hostname

Apa alasan Anda merasa perlu mengetahui jalur absolut menuju pedoman?

Bruce P.
sumber
Terima kasih Bruce, saya mengubah pertanyaan saya untuk menjelaskan apa yang saya coba lakukan.
Josh Unger
6
Jalan lokal absolut bukannya tidak berarti sama sekali. Misalnya dapat digunakan untuk menjalankan perintah lokal dan / atau meminta file atau layanan lokal lainnya yang tidak dapat disertakan dalam konfigurasi yang memungkinkan secara langsung. Fakta bahwa ansible memiliki local_actionmodul berarti ada kasus penggunaan yang sah untuk ini.
Cray
1

Saya menggunakan pedoman seperti ini untuk menguji peran saya secara lokal:

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

tapi ini berhenti bekerja dengan Ansible v2.2.

Saya men-debug solusi yang disebutkan di atas

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

dan itu menghasilkan direktori home saya dan bukan "direktori kerja saat ini"

Saya menetap dengan

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

sesuai solusi di atas.

Andrew Rothstein
sumber
1

Tidak ada variabel build-in untuk tujuan ini, tetapi Anda selalu dapat menemukan path absolut playbook dengan perintah "pwd", dan mendaftarkan outputnya ke variabel.

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

Sekarang jalur tersebut tersedia dalam variabel playbook_path_output.stdout

hyt
sumber
7
Dalam hal pwdini tidak mengembalikan jalur skrip pedoman. Ini mengembalikan direktori proses saat ini (biasanya ansible-playbook). Keduanya tidak harus sama dan bergantung pada cara yang tepat di mana ansible dipanggil.
Cray
5
@Ray benar. Terlepas dari itu, saya hanya ingin menyebutkan bahwa Ansible sudah menyiapkan variabel ini untuk Anda: debug: var=ansible_env.PWD(ini memberi saya direktori tempat saya mengeksekusi ansible-playbookdi mesin lokal saya dan direktori home di server jarak jauh)
NS du Toit
4
Sebagai alternatif, direktori saat ini dapat ditemukan dengan:{{ lookup('env','PWD') }}
diterbitkan