উত্তর:
এটা সত্যিই বেশ সহজ। আপনি আপনার বিভিন্ন vars_files আইটেমগুলিকে একটি একক টুপলে স্কোয়াশ করতে পারেন এবং উত্তরযোগ্য প্রতিটির মধ্যে স্বয়ংক্রিয়ভাবে চলে যাবে যতক্ষণ না এটি উপস্থিত একটি ফাইল সন্ধান করে এবং লোড না করে। উদা:
vars_files:
- [ "vars/foo.yml", "vars/bar.yml", "vars/default.yml" ]
উত্তরীয় বিকাশকারীদের মতে , এর সমাধানের যথাযথ উপায় হ'ল কিছু ব্যবহার করা:
vars_files_locs: ['../path/to/file1', '../path/to/file2', ...]
- include_vars: "{{ item }}"
with_first_found: vars_files_locs
তদতিরিক্ত, তারা বলে :
উপরেরগুলি কেবলমাত্র পাওয়া প্রথম ফাইলটি সঠিকভাবে লোড করবে এবং
vars_files
ভাষা কীওয়ার্ডের মাধ্যমে এটি করার চেষ্টা করার চেয়ে আরও নমনীয় ।
include_vars
কাজের মধ্যে ভেরিয়েবল একটি উচ্চ প্রাধান্য দেব ভূমিকা তুলনায় defaults
বাvars
আমি এই সেটআপটিতে এই সমস্যার মুখোমুখি হয়েছি যেখানে একই শারীরিক সার্ভারে (একাধিক ভার্চুয়াল মেশিনের অনুমতি নেই) একাধিক স্থাপনার পরিবেশ (লাইভ, ডেমো, স্যান্ডবক্স) তৈরি করতে হবে এবং তারপরে নির্বিচারে এসএনএন রেপো স্থাপন করার জন্য একটি স্ক্রিপ্ট
এটির জন্য (alচ্ছিক) ভেরিয়েবল.আইএমএল ফাইলগুলির একটি ডিরেক্টরি ট্রি থাকা দরকার যা একে অপরের উপরের দিকে একত্রীভূত হবে এবং অনুপস্থিত থাকলে যদি কোনও ব্যতিক্রম ছুঁড়ে না ফেলে
জবাবদিহিতে ভেরিয়েবল মার্জিং সক্ষম করে শুরু করুন - নোট করুন যে এটি অগভীর হ্যাশ মার্জ করে (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
এটি alচ্ছিক ভেরিয়েবল ফাইলগুলির ডিরেক্টরি ট্রি জন্য প্রধান যুক্তি।
;; 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
প্রকল্পের জন্য ডিফল্ট
ansible_project:
node_port: 4201
nginx_port: 4401
লাইভ পরিবেশের জন্য ডিফল্ট, প্রকল্পের ডিফল্টকে ওভাররাইড করে
ansible_project:
node_env: production
লাইভ পরিবেশে প্রকল্প_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 }}"
দ্রষ্টব্য: পাথ পরীক্ষাগুলি (ফাইলটি উপস্থিত রয়েছে, বিদ্যমান রয়েছে ...) উত্তরীয়-প্লেবুক কমান্ড চলাকালীন কেবলমাত্র চলমান ডিরেক্টরি ডিরেক্টরি সম্পর্কিত নিখুঁত পাথ বা পাথ দিয়ে কাজ করে। এই কারণেই আমরা অনুসন্ধানটি ব্যবহার করেছি। অনুসন্ধান প্লেবুক ডিরেক্টরি সম্পর্কিত পাথ গ্রহণ করে এবং ফাইল উপস্থিত থাকলে পরম পাথ ফেরত দেয়।
বা আরও ইয়ামাল পদ্ধতিতে:
- 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', ...]
একাধিক লাইনে অ্যারে মানগুলি লেখার ইয়ামল পদ্ধতি ব্যবহার করুন, যেমন:
- path/to/file1
- path/to/file2
যেমনটি উল্লিখিত হয়েছে এটি নামের একটি ভার্স ফাইলের সন্ধান করে {{ 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