Pertanyaan Apakah mungkin untuk menentukan variabel global playbook-di Ansible?


Saya memiliki buku pedoman Ansible yang besar di mana gambar Docker dibuat ketika menjalankannya. Saya menggunakan nomor yang terus bertambah sebagai tag untuk meng-versinya. Saat ini, saya harus menentukan ini di setiap hosts: bagian.

Saya tahu ada variabel global tetapi dari apa yang saya temukan dengan mencari "ansible" "variabel global", mereka harus didefinisikan di luar playbook. Apakah mungkin untuk mendefinisikan variabel global yang bersifat global untuk pedoman?


32
2017-10-14 13:06


asal


Jawaban:


Jika tag / versi yang Anda gunakan berlaku untuk semua host, kemudian gunakan group_vars / all adalah opsi yang layak.

Jika angka revisi khusus untuk setiap entri host dalam file host_vars / host_name mungkin lebih baik.

Jika Anda ingin membaca dan memulai var dan kemudian meningkatkannya setelah setiap permainan yang menjadi sedikit lebih sulit untuk bertahan bahwa informasi di seluruh drama (atau setiap -hosts seperti yang Anda katakan) di playbook. Misalnya jika Anda ingin menggunakan instance N docker, Anda mungkin melakukan beberapa keajaiban inventaris dinamis seperti ini:

- hosts: localhost
  tasks:
  - add_host: name=docker_{{item}} groups="dockers,other" tag={{item}}
    with_sequence: start={{ext_def_start}} count={{ext_def_num}}


- hosts: docker_*
  tasks:
  - debug: var=tag

13
2017-10-14 17:08



Ansible memiliki default all grup itu, Lucunya, berisi semua host dalam file persediaan.

Dengan demikian Anda dapat melakukan seperti dengan kelompok tuan rumah dan menyediakan group_vars untuk grup tuan rumah.

Seperti yang ditunjukkan pada tautan sebelumnya, ini dapat didefinisikan secara langsung dalam file inventaris atau mereka dapat dimuat dalam file terpisah yang dinamai setelah grup dalam group_vars direktori pada level direktori yang sama dengan file persediaan.

Contoh struktur direktori mungkin akan terlihat seperti:

-ansible
 |--inventory
 |  |--group_vars
 |  |  |--all
 |  |  |--dev
 |  |  |--test
 |  |  |--prod
 |  |  |--webservers
 |  |  |--databases
 |  |--dev
 |  |--test
 |  |--prod
 |--roles
  ...

File inventaris dev Anda mungkin terlihat seperti ini:

[dev:children]
webservers
databases

[webservers]
web1.dev
web2.dev

[databases]
database-master.dev
database-slave.dev

Semua host ini sekarang akan mengambil konfigurasi spesifik host (yang dapat didefinisikan baik dalam jalur atau, sama seperti dengan group_vars dapat dimasukkan ke dalam folder host_vars) dan juga konfigurasi untuk kelompok tertentu mereka seperti webservers dan kemudian kelompok-kelompok yang juga mereka warisi dari seperti dev tetapi juga, secara default, all.

Ini kemudian dapat digunakan untuk mengkonfigurasi hal-hal dengan cara yang lebih kasar daripada per host.

Hal-hal seperti server NTP mungkin ingin didefinisikan di semua, sementara server DNS mungkin ingin didefinisikan pada tingkat lingkungan (jika jaringan Anda dibagi menjadi dev, pengujian dan produksi mereka mungkin memerlukan pengaturan server DNS yang berbeda di /etc/resolv.conf) sementara berbagai jenis server mungkin memiliki konfigurasi yang berbeda di sekitar hal-hal seperti daftar paket yang akan diinstal. Akhirnya, beberapa hal mungkin perlu host spesifik seperti pengaturan id server MySQL dalam grup replikasi.

Sebaliknya, jika Anda hanya ingin menentukan pengaturan global playbook daripada di seluruh inventaris (sehingga dapat diakses oleh playbook lain) maka Anda hanya memerlukan vars memblokir di Anda bermain definisi seperti ini:

- hosts: webservers
  vars:
    http_port: 80
  tasks:
    - name: Task1 to be ran against all the webservers
      ...

Seperti yang disebutkan sebelumnya, Anda selalu dapat menggunakan all kelompok di sini juga:

- hosts: all
  vars:
    ntp_pool:
      - ntp1.domain
      - ntp2.domain
  tasks:
    - name: Task1 to be ran against all the servers
      ...

Secara umum, saya akan sangat menyarankan penggunaan peran untuk menyusun hal-hal apa saja yang dijalankan terhadap host tertentu dan kemudian menggunakan inventaris untuk menjelaskan jenis server apa dan kemudian menggunakan dir group_vars pada level inventaris untuk memuat semua variabel untuk grup-grup tersebut. tuan rumah. Melakukan hal-hal dengan cara ini akan membantu Anda menjaga hal-hal di tempat yang masuk akal dan memungkinkan Anda untuk dengan mudah menggunakan kembali basis kode Anda.


11
2017-10-14 16:16



Ya, var global dimungkinkan seperti ini,

contoh playbook pengaturan splunk

splunk/
   setup_splunk_playbook.yaml
   roles/base
           /tasks/main.yaml
           /tasks/install.yaml
         search_head
           /tasks/configure.yaml
         indexer
           /tasks/configure.yaml
         some_other_role
           /tasks/some_task.yaml
   hosts
   config.yaml

Tempatkan vars Anda ke config.yaml

cat splunk / config.yaml

--- 
# global Splunk variables
splunk_version: 7.0.0

di playbook Anda, termasuk Peran

kucing setup_splunk_playbook.yaml

- hosts: "search_heads"  
  become_user: root
  become: true
  gather_facts: true

  roles:
    - base
    - search_head

dalam Peran Anda, sertakan Vars Global di dalam Tugas

peran kucing / basis / tugas / main.yaml

---
# install Splunk Base

- name: include vars
  include_vars: "{{ playbook_dir }}/config.yaml"

- include: install.yaml

vars dapat diakses dalam tugas sekarang,

peran kucing / base / tasks / install.yaml

- name: echo version
  debug: splunk version is {{ splunk_version }}

0
2017-12-27 16:39



Saya tahu ini mungkin tidak menjawab permintaan OP secara tepat, tetapi bagi orang-orang googling untuk mengatur variabel global (daftar / array) sehingga mereka tidak perlu mengaturnya di setiap tugas, ini mungkin sangat berguna.

Ini sangat sederhana, Katakanlah Anda memiliki daftar domain yang Anda harus lulus, saya beri nama variabel konyol hanya untuk menandakan bahwa itu bisa apa saja.

- hosts: [yourhostlistgoeshere]
  remote_user: root
  vars:
    domainslisto:
       - site1.com
       - website2.xyz

....



  tasks:
    - name: copy vhosts
      template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ item }}.conf
      with_items: "{{ domainslisto }}"

    - name: a2ensite {{ item }}
      command: a2ensite {{ item }}
      with_items: "{{ domainslisto }}"

0
2018-05-21 21:51