Yanıtlar:
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" ]
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_files
language anahtar kelimesi ile yapmaya çalışmaktan daha esnektir .
include_vars
görevdeki değişkenlere göre yüksek bir öncelik önceliği vereceği defaults
veyavars
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
[defaults]
hash_behaviour=merge ;; merge rather than replace dictionaries http://docs.ansible.com/ansible/intro_configuration.html###hash-behaviour
/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
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"
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
proje varsayılanları
ansible_project:
node_env: development
node_port: 4200
nginx_port: 4400
proje_1 için varsayılanlar
ansible_project:
node_port: 4201
nginx_port: 4401
canlı ortam için varsayılanlar, proje varsayılanlarını geçersiz kılar
ansible_project:
node_env: production
canlı ortamda proje_1 için son geçersiz kılmalar
ansible_project:
nginx_port: 80
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
- 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.
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 }}.yml
ve yoksadefault.yml
En yeni Ansible sürümlerine dayanan yeni yanıt - temel olarak, hiçbir dosya bulunamazsa görevi atlamak için with_first_found
birlikte 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