जवाबों:
यह वास्तव में काफी सरल है। आप अपने अलग-अलग vars_files आइटम्स को एक ही ट्यूपल में स्क्वैश कर सकते हैं और जब तक यह मौजूद है और इसे लोड नहीं करता है तब तक Ansible स्वचालित रूप से हर एक के माध्यम से जाएगा। उदाहरण के लिए:
vars_files:
- [ "vars/foo.yml", "vars/bar.yml", "vars/default.yml" ]
Ansible डेवलपर्स के अनुसार , इसे हल करने का उचित तरीका कुछ का उपयोग करना है:
vars_files_locs: ['../path/to/file1', '../path/to/file2', ...]
- include_vars: "{{ item }}"
with_first_found: vars_files_locs
इसके अलावा, वे कहते हैं :
उपरोक्त ठीक से मिली पहली फ़ाइल को लोड करेगा, और
vars_files
भाषा कीवर्ड के माध्यम से ऐसा करने की तुलना में अधिक लचीला है ।
include_vars
टास्क में भूमिका की तुलना में वेरिएबल्स की एक उच्च मिसाल दी जाएगी defaults
याvars
मुझे एक सेटअप में इस समस्या का सामना करना पड़ा जहाँ मुझे एक ही भौतिक सर्वर (यहाँ वर्चुअल मशीन की अनुमति नहीं है) के लिए कई परिनियोजन वातावरण (लाइव, डेमो, सैंडबॉक्स) बनाने की आवश्यकता थी, और फिर मनमाना svn repos तैनात करने के लिए एक स्क्रिप्ट
इसके लिए (वैकल्पिक) वैरिएबल .yml फ़ाइलों की निर्देशिका ट्री की आवश्यकता होती है, जो एक-दूसरे के बीच में विलय करते हैं और किसी भी लापता होने पर एक अपवाद नहीं फेंकते हैं
आरंभिक मर्जिंग को सक्षम करने से शुरू करें - ध्यान दें कि यह उथले हैश मर्जिंग (1 स्तर गहरा) और पूरी तरह से पुनरावर्ती गहरे मर्ज नहीं करता है
[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
यह वैकल्पिक चर फ़ाइलों की निर्देशिका ट्री के लिए मुख्य तर्क है।
;; 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"
प्रोजेक्ट और विभिन्न उपयोगकर्ताओं और वातावरण के लिए डिफ़ॉल्ट चर कॉन्फ़िगर करें
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
परियोजना की चूक
ansible_project:
node_env: development
node_port: 4200
nginx_port: 4400
प्रोजेक्ट 1 के लिए चूक
ansible_project:
node_port: 4201
nginx_port: 4401
लाइव पर्यावरण के लिए चूक, परियोजना की चूक को ओवरराइड करता है
ansible_project:
node_env: production
लाइव वातावरण में Project_1 के लिए अंतिम ओवरराइड्स
ansible_project:
nginx_port: 80
प्रत्येक वातावरण के लिए अलग-अलग प्लेबुक कॉन्फ़िगर करें
- 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 }
चेतावनी: क्योंकि सभी वातावरण एक ही होस्ट पर रहते हैं, इसलिए सभी प्लेबुक को व्यक्तिगत रूप से चलाना चाहिए, अन्यथा अन्सिबल सभी स्क्रिप्ट को पहले ssh लॉगिन उपयोगकर्ता के रूप में चलाने का प्रयास करेगा और केवल पहले उपयोगकर्ता के लिए चर का उपयोग करेगा। यदि आपको सभी लिपियों को क्रमिक रूप से चलाने की आवश्यकता है, तो उन्हें अलग-अलग कमांड के रूप में चलाने के लिए xargs का उपयोग करें।
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 }}"
नोट: पथ परीक्षण (फ़ाइल मौजूद है, मौजूद है, ...) ansible-playbook कमांड चलाने के दौरान केवल वर्तमान पथ निर्देशिका के सापेक्ष पूर्ण पथ या पथ के साथ काम करते हैं। यही कारण है कि हमने लुकअप का उपयोग किया है। लुकअप प्लेबुक निर्देशिका के सापेक्ष पथ स्वीकार करता है और फ़ाइल मौजूद होने पर निरपेक्ष पथ लौटाता है।
या अधिक याम्ल तरीके से:
- 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 }}"
इसके बजाय, वर्ग कोष्ठक के साथ एक पंक्ति पर एक सरणी लिखने के बजाय, जैसे:
['path/to/file1', 'path/to/file2', ...]
कई प्रकारों पर सरणी मान लिखने के yaml तरीके का उपयोग करें, जैसे:
- path/to/file1
- path/to/file2
जैसा कि यह उल्लेख एक vars फ़ाइल नाम के लिए लग रहा है {{ ansible_hostname }}.yml
, और अगर यह मौजूद नहीं है का उपयोग करता हैdefault.yml
नवीनतम Ansible के आधार पर न्यू जवाब संस्करणों-मूल रूप से, आप का उपयोग करना चाहिए with_first_found
, के साथ 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
इससे ऐसा होता है कि आपके पास उस सूची में फ़ॉलबैक संस्करण फ़ाइल नहीं है।
संबंधित देखें: /programming//a/39544405/100134