Bagaimana cara menginstal peran Galaxy yang memungkinkan secara otomatis?

129

Semua buku pedoman / peran saya yang mungkin diperiksa di git repo saya.

Namun, untuk peran Ansible Galaxy saya selalu harus mengunduhnya secara eksplisit satu per satu di setiap mesin tempat saya ingin menjalankan Ansible.

Bahkan sulit untuk mengetahui sebelumnya peran Ansible Galaxy mana yang dibutuhkan sampai Ansible mengeluh tentang peran yang hilang saat runtime.

Bagaimana cara mengelola dependensi peran Galaksi yang Mungkin? Saya ingin mereka memeriksanya ke repo git saya bersama dengan kode lain yang memungkinkan atau meminta mereka secara otomatis diidentifikasi dan diunduh saat saya menjalankan Ansible di mesin baru.

pdeva
sumber
galaxy.ansible.com/docs/using/index.html Inilah semua yang Anda butuhkan untuk menggunakan ansible-galaxy. Ini dokumen yang dilakukan dengan baik! Bahkan jika Anda pemula :)
Ayra
@pdeva Bisakah Anda menerima salah satu jawaban yang valid di bawah ini?
GG.

Jawaban:

149

Anda harus menggunakan requirements.ymlfile untuk kasus penggunaan ini. Jelaskan peran yang Anda perlukan, menggunakan salah satu dari berbagai metode pemasangan:

# Install a role from the Ansible Galaxy
- src: dfarrell07.opendaylight

# Install a role from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight

# Install a role from a specific git branch
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: origin/master

# Install a role at a specific tag from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: 1.0.0

# Install a role at a specific commit from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: <commit hash>

Kemudian instal mereka:

ansible-galaxy install -r requirements.yml

Berikut adalah contoh yang berfungsi (menginstal OpenDaylight menggunakan Ansible sebagai penyedia Vagrant). Lihat dokumen Ansible yang relevan untuk info lebih lanjut.

dfarrell07
sumber
Lihat juga jawaban @Kier Andrews di bawah ini. Ini memperluas yang satu ini.
Marco Ferrari
1
Ini tidak benar-benar menginstal dependensi peran dari buku pedoman, ini secara eksplisit menginstal daftar dependensi yang telah dicantumkan secara manual oleh manusia yang membuat buku pedoman.
Neil
53

Seperti yang disarankan, Anda dapat menggunakan galaksi yang memungkinkan untuk kebutuhan ini.

Ansible memiliki fitur di mana Anda dapat membuat requirements.ymlfile yang mencantumkan semua peran Anda. Anda dapat mengetahuinya di sini: http://docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file

Misalnya (requirement.yml):

- src: yatesr.timezone

Anda kemudian menjalankan ansible-galaxy install -r requirements.ymlfile ini untuk mengunduh semua peran yang terdaftar di sana.

Jika Anda ingin mengotomatiskannya lebih lanjut, Anda dapat membuat skrip shell sederhana yang akan menjalankan dua perintah.

Misalnya (ansible.sh):

./ansible.sh

ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory 
Kieran Andrews
sumber
1
Baru saja diuji, Ini menampilkan pesan bahwa peran sudah diunduh, tidak ada kesalahan. Versi2.2.1
Igonato
Jika pedoman tersebut menggunakan peran galaksi yang Anda pasang, maka peran tersebut tidak akan berjalan saat pertama kali pedoman tersebut dipanggil karena keberadaannya diperiksa sebelum diunduh. Memanggil pedoman untuk kedua kalinya akan mengambil peran yang baru dipasang.
Ben
Saya telah memperbarui cara saya sekarang melakukannya, dengan skrip pembungkus untuk mengurangi perintah.
Kieran Andrews
19

Saya sering menemukan diri saya menginstal Java JDK. Menggunakan peran membuat sentuhan itu lebih mudah. Saya telah mencoba beberapa cara berbeda (termasuk banyak .gitmodules dan submodule ... Saya harus menggunakan beberapa sistem git untuk bekerja dan semuanya menjadi jelek). Persyaratan terbesar saya adalah saya tidak memeriksa kode peran ke dalam proyek pedoman saya, terutama agar saya dapat menyimpan semuanya di satu tempat.

Isi file 'Requirement.yml' saya:

- src: https://github.com/staylorx/ansible-role-wls-prep.git
  version: master
  name: staylorx.wls-prep

- src: https://my-work-git-extravaganza.com
  version: 2.x
  name: coolplace.niftyrole

#From Ansible Galaxy
- src: staylorx.oracle-jdk

Saya menjalankan buku pedoman terpisah, install-role.yml:

---

- hosts: localhost

  tasks:
    - file:
        path:  roles
        state: absent

    - local_action:
        command ansible-galaxy install -r requirements.yml --roles-path roles

    - lineinfile:
        dest:   .gitignore
        regexp: '^\/roles$'
        line:   '/roles'
        state:  present

Saya menjalankan pedoman pertama ini, lalu saya menjalankan peran saya di pedoman mana pun secara normal. Bagi saya rahasianya adalah memastikan itu diabaikan oleh git jadi saya tidak memeriksa peran secara salah. Juga karena saya menghapus folder setiap kali, saya memastikan saya tidak perlu memaksa atau mengabaikan kesalahan.

staylorx.dll
sumber
Ini akan gagal dengan 'peran tidak ditemukan' bahkan sebelum Anda menjalankan perintah lokal.
Daniel Andrei Mincă
1
@ Mincă Daniel Andrei Anda perlu menggunakan cara yang dinamis, misalnya include_role. periksa ini
user1686407
4

Solusi lain adalah dengan menggunakan submodul git. Bagaimanapun, Ansible Galaxy hanya adalah direktori repositori github ...

Saya menggunakan perintah ini untuk secara otomatis menambahkan peran Galaxy apa pun sebagai submodule:

ansible-galaxy info <package> | grep -A 1 github_repo | tr '\n' ' ' | sed -e "s/.*github_repo: \([^[:space:]]*\)[^\w]*github_user: \([^[:space:]]*\)[[:space:]]*/git submodule add git:\/\/github.com\/\2\/\1.git roles\/\2.\1/g" | sh

Komit perubahannya ke repo git Anda. Saat Anda mengkloning repo Anda di masa mendatang, pastikan untuk mengkloningnya dengan submodul, misgit clone ... --recursive

Keuntungannya adalah, submodul git selalu merujuk ke versi tertentu (git commit-hash). Ini akan mencegah Anda menjalankan pembaruan yang belum teruji di lingkungan produktif Anda. Versi baru dari peran Galaxy mungkin memiliki bug atau bekerja sama sekali berbeda dari sebelumnya. Dengan submodul git Anda memutuskan apakah dan kapan Anda memperbarui peran ke versi baru.

Selain itu, Anda tidak perlu juga mengurus peran galaksi daftar hitam di Anda .gitignoreuntuk mencegah memasukkan kode mereka ke repositori Anda.

udondan
sumber
5
Ini praktik yang buruk menurut saya. Biasanya lebih mudah menggunakan alat manajemen ketergantungan lalu merekatkan repo SCM bersama-sama, terutama ketika kita berbicara tentang git submodule untuk SCM.
David Resnick
1
Sepakat. Sebenarnya saya tidak menggunakan ini lagi. Tetap saja itu adalah pendekatan yang valid karena galaksi-mungkin masih jauh dari sempurna. Galaxy tidak akan memeriksa pembaruan, bahkan jika sebuah versi ditabrak di file persyaratan Anda, jika Anda memaksanya untuk mengunduh ulang semua peran dengan --forcebendera tidak berdokumen, itu tidak akan menunjukkan kepada Anda apakah atau apa yang sebenarnya berubah. Ini adalah kotak hitam yang hanya dapat Anda kendalikan jika Anda menyimpan peran galaksi yang diunduh di SCM. Untuk alasan lain, itu ide yang bagus. Saat menarik submodul, Anda setidaknya melihat peran mana yang berubah.
udondan
BTW, semua submodul bermasalah, AFAIK dapat diabaikan dalam situasi ini karena terkait dengan modifikasi kontennya. Menarik baik-baik saja menurut pengalaman saya ..
udondan
4

Anda dapat menggunakan peran yang memungkinkan untuk menginstal peran yang diperlukan menggunakan modul perintah .

Berikut adalah contoh yang sangat mendasar yang berjalan ansible-galaxy install:

- name: Install roles from Ansible Galaxy
  command: ansible-galaxy install {{ item.item }}
  with_items:
    - "{{ ansible_roles_list }}"

The ansible_roles_listmungkin diberikan sebagai variabel atau sebagai parameter peran.

Jika Anda melakukan ini dalam sebuah peran, itu harus diterapkan sebelum peran lain apa pun yang ingin Anda instal menggunakannya, di buku pedoman terpisah. Ini karena Ansible memeriksa apakah semua peran tersedia sebelum menjalankan playbook tempat Anda mereferensikannya.

Marco Ferrari
sumber
telur dan ayam :)
bazeusz
2

Pada titik ini, sejauh yang saya tahu tidak ada cara otomatis untuk mengunduh peran saat runtime. Taruhan terbaik Anda adalah memasukkannya ke dalam repo Anda sendiri atau memiliki dokumentasi yang tepat yang mencantumkan semua persyaratan. Anda bahkan dapat membuat buku pedoman pra-penerbangan yang menginstal peran Anda. :)

Mxx
sumber
3
Anda dapat menggunakan file requirement.txt untuk ini. Lihat: docs.ansible.com/…
toast38coza
0

Di sini, persyaratan saya adalah tentang peran dan digunakan di install.yml

main.yml

 # tasks file for MY_ROLE
- name: Install requirements
  local_action: command ansible-galaxy install -r {{ role_path }}/requirements.yml -p /etc/ansible/roles

- include_tasks: install.yml 
.  
├── playbook.yml  
├── inventory  
├── roles  
│    └── My_Role   
│        ├── tasks  
│        │   └── main.yml  
│        │   └── install.yml  
│        └── requirements.yml
TJVerne
sumber
0

Jika requirement.yml berada di direktori peran proyek Anda, Tower / AWX menginstal peran tersebut secara otomatis.

bbaassssiiee
sumber