Ansible: Bazı dosyalar olmadığında vars_files kullanabilir miyim


17

Bu kısım:

vars_files:
  - vars/vars.default.yml
  - vars/vars.yml

Bir dosya vars/vars.ymlyoksa - işte bir hata.

ERROR: file could not read: /.../vars/vars.yml

Bu dosyadaki ek değişkenleri yalnızca varsa nasıl yükleyebilirim? (hatasız)

Yanıtlar:


27

Gerçekten çok basit. Farklı vars_files öğelerinizi tek bir grup halinde ezebilirsiniz ve Ansible, var olan bir dosyayı bulana ve yükleyene kadar her birini otomatik olarak geçirir. Ör:

vars_files:
  - [ "vars/foo.yml", "vars/bar.yml", "vars/default.yml" ]

4
Ansible geliştiricilerine göre , bu çözüm sadece bulunan ilk dosyayı değil, tüm dosyaları yükleyecektir.
tjanez

10

Ansible geliştiricilerine göre , bunu çözmenin uygun yolu aşağıdaki gibi bir şey kullanmaktır:

vars_files_locs: ['../path/to/file1', '../path/to/file2', ...]

- include_vars: "{{ item }}"
  with_first_found: vars_files_locs

Dahası, diyorlar :

Yukarıdakiler sadece bulunan ilk dosyayı düzgün bir şekilde yükleyecektir ve bunu vars_fileslanguage anahtar kelimesi ile yapmaya çalışmaktan daha esnektir .


"sadece ilk dosya bulundu" - fikir bazı değişkenleri yeniden tanımlamaktı, hepsini değil
Sergey

@Sergey, sorunuzu tekrar okuduğunuzda, istediğiniz şeyin biraz farklı olduğunu görüyorum. Bunu işaret ettiğiniz için teşekkürler. Cevabı başka birisi faydalı buluyormuş gibi bırakacağım.
tjanez

1
ancak include_varsgörevdeki değişkenlere göre yüksek bir öncelik önceliği vereceği defaultsveyavars
Alex F

2

Aynı fiziksel sunucuya (burada sanal makinelere izin verilmez) birden fazla dağıtım ortamı (canlı, demo, sanal alan) ve sonra rasgele svn depolarını dağıtmak için bir komut dosyası oluşturmam gereken bir kurulumda bu sorunla karşılaştım.

Bu, (isteğe bağlı) variable.yml dosyalarının birbirini birleştirecek ve eksik olduğu durumlarda istisna atmayacak bir dizin ağacı gerektiriyordu.

Ansibleda değişken birleştirmeyi etkinleştirerek başlayın - bunun sığ karma birleştirmesini (1 seviye derin) ve tamamen özyinelemeli derin birleştirmeyi gerçekleştirmediğini unutmayın

ansible.cfg

[defaults]
hash_behaviour=merge ;; merge rather than replace dictionaries http://docs.ansible.com/ansible/intro_configuration.html###hash-behaviour

Uygun dizin düzeni

/group_vars
└── all.yml

/playbooks
├── boostrap.yml
├── demo.yml
├── live.yml
└── sandbox.yml

/roles/deploy/
├── files
├── tasks
│   ├── includes.yml
│   ├── main.yml
└── vars
    ├── main.yml
    ├── project_1.yml
    ├── project_2.yml
    ├── demo
    │   ├── project_1.yml
    │   ├── project_2.yml   
    │   └── main.yml
    ├── live
    │   ├── project_1.yml
    │   ├── project_2.yml   
    │   └── main.yml
    └── sandbox
        ├── project_1.yml
        ├── project_2.yml   
        └── main.yml

roller / dağıtma / görevler / includes.yml

Bu, isteğe bağlı değişken dosyalarının dizin ağacının ana mantığıdır.

;; imports in this order:
;; - /roles/deploy/vars/main.yml
;; - /roles/deploy/vars/{{ project_name }}.yml
;; - /roles/deploy/vars/{{ project_name }}/main.yml
;; - /roles/deploy/vars/{{ project_name }}/{{ project_env }}.yml
- include_vars:
    dir: 'vars'
    files_matching: "{{ item }}"
    depth: 1
  with_items:
    - "main.yml"
    - "{{ project_name }}.yml"

- include_vars:
    dir: 'vars/{{ env_name }}'
    files_matching: "{{ item }}"
    depth: 1
  with_items:
    - "main.yml"
    - "{{ project_name }}.yml"

group_vars / all.yml

Proje, çeşitli kullanıcılar ve ortamlar için varsayılan değişkenleri yapılandırma

project_users:
    bootstrap:
        env:   bootstrap
        user:  ansible
        group: ansible
        mode:  755
        root:  /cs/ansible/
        home:  /cs/ansible/home/ansible/
        directories:
            - /cs/ansible/
            - /cs/ansible/home/

    live:
        env:   live
        user:  ansible-live
        group: ansible
        mode:  755
        root:  /cs/ansible/live/
        home:  /cs/ansible/home/ansible-live/

    demo:
        env:   demo
        user:  ansible-demo
        group: ansible
        mode:  755
        root:  /cs/ansible/demo/
        home:  /cs/ansible/home/ansible-demo/

    sandbox:
        env:   sandbox
        user:  ansible-sandbox
        group: ansible
        mode:  755
        root:  /cs/ansible/sandbox/
        home:  /cs/ansible/home/ansible-sandbox/    

project_env:  bootstrap
project_user: "{{ ansible_users[project_env] }}" ;; this will be retroactively updated if project_env is redefined later

roller / dağıtmak / değişkenler / main.yml

proje varsayılanları

ansible_project:
  node_env:   development
  node_port:  4200
  nginx_port: 4400

roller / dağıtmak / değişkenler / project_1.yml

proje_1 için varsayılanlar

ansible_project:
  node_port:  4201
  nginx_port: 4401

roller / dağıtma / vars / canlı / main.yml

canlı ortam için varsayılanlar, proje varsayılanlarını geçersiz kılar

ansible_project:
  node_env: production

roller / dağıtmak / vars / canlı / project_1.yml

canlı ortamda proje_1 için son geçersiz kılmalar

ansible_project:
  nginx_port: 80

playbooks / demo.yml

Her ortam için ayrı oynatma kitapları yapılandırın

- hosts: shared_server
  remote_user: ansible-demo
  vars:
    project_env: demo
  pre_tasks:
    - debug: "msg='{{ facter_gid }}@{{ facter_fqdn }} ({{ server_pseudonym }})'"
    - debug: var=project_ssh_user
  roles:
    - { role: deploy, project_name: project_1 }

UYARI: Tüm ortamlar tek bir ana bilgisayarda yaşadığından, tüm oyun kitaplarının tek tek çalıştırılması gerekir, aksi takdirde Ansible tüm komut dosyalarını ilk ssh oturum açma kullanıcısı olarak çalıştırmaya çalışır ve yalnızca ilk kullanıcı için değişkenleri kullanır. Tüm komut dosyalarını sırayla çalıştırmanız gerekiyorsa, her birini ayrı komutlar olarak çalıştırmak için xargs kullanın.

find ./playbooks/*.yml | xargs -L1 time ansible-playbook

1
- hosts: all
  vars_files: vars/vars.default.yml
  vars:
    optional_vars_file: "{{ lookup('first_found', 'vars/vars.yml', errors='ignore') }}"
  tasks:
  - when: optional_vars_file is file
    include_vars: "{{ optional_vars_file }}"

Not: ansible-playbook komutu çalıştırılırken yol testleri (dosya, var, ...) yalnızca geçerli çalışma dizinine göre mutlak yollarla veya yollarla çalışır. Aramayı bu yüzden kullanmıştık. arama, oynatma defteri dizinine göre yolları kabul eder ve dosya bulunduğunda mutlak yolu döndürür.


0

Veya daha fazla yaml yöntemiyle:

- hosts: webservers
  vars:
    paths_to_vars_files:
      - vars/{{ ansible_hostname }}.yml
      - vars/default.yml
  tasks:
    - include_vars: "{{ item }}"
      with_first_found: "{{ paths_to_vars_files }}"

Yani, bir satırda köşeli parantez içeren bir dizi yazmak yerine, örneğin:

['path/to/file1', 'path/to/file2', ...]

Dizi değerlerini birden çok satıra yazma gibi yaml yöntemini kullanın, örneğin:

- path/to/file1
- path/to/file2

Belirtildiği gibi bu adında bir vars dosyası arar {{ ansible_hostname }}.ymlve yoksadefault.yml


Gibi bu cevap aynı kodu kullanan bu onun dışında farklı bir veri kullanır. Yani {{ ansible_hostname }}.ymldosya adı yerine ../path/to/file1. Amaç ne? Sınırsız sayıda girdi dosyası adı eklenebilir.
techraf

@techraf: Tamam, neden yeni bir yanıt gönderildiğine dair bir açıklama / büyütme ekledim. Bunun nedeni, sunucu hatası yorumlarının çok satırlı kod snippet'lerini desteklememesi ve sadece dizi dizilerinin sık sık (tercihen?) Birden çok satıra yazıldığına işaret ediyordum. Daha önceki cevabın düzenlenmesi ve çok satırlı dizi formatının daha sık görüldüğü gibi gösterilmesi durumunda da iyi olur. Sonra cevabım silinebilir.
Donn Lee

Her iki gösterim de YAML Temelleri bölümündeki Ansible belgelerinde belirtilmiştir . Birini diğerinden daha sık görmeniz, bunu henüz yeni bir cevap haline getirmiyor.
techraf

0

Çeşitli parçaları bir araya getirme ... include_vars, dosya var olduğunda doğru olan bir when cümlesi ile. yani

vars:
  file_to_include: /path/to/file
tasks:
  - include_vars: "{{ file_to_include }}"
    when: file_to_include is exists

0

En yeni Ansible sürümlerine dayanan yeni yanıt - temel olarak, hiçbir dosya bulunamazsa görevi atlamak için with_first_foundbirlikte kullanmalısınız skip: true.

- name: Include vars file if one exists meeting our condition.
  include_vars: "{{ item }}"
  with_first_found:
    - files:
        - vars/{{ variable_here }}.yml
      skip: true

Bu, bu listede bir yedek vars dosyasına sahip olmanıza gerek kalmamasını sağlar.

İlgili konulara bakın: /programming//a/39544405/100134

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.