উত্তর: কিছু ফাইলের অস্তিত্ব না থাকলে আমি কি vars_files ব্যবহার করতে পারি?


17

এই অংশ:

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

যদি কোনও ফাইল vars/vars.ymlউপস্থিত না থাকে - এখানে একটি ত্রুটি রয়েছে।

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

কেবলমাত্র এই ফাইলটি উপস্থিত থাকলে আমি কীভাবে অতিরিক্ত ভেরিয়েবলগুলি লোড করতে পারি? (কোনও ত্রুটি ছাড়াই)

উত্তর:


27

এটা সত্যিই বেশ সহজ। আপনি আপনার বিভিন্ন vars_files আইটেমগুলিকে একটি একক টুপলে স্কোয়াশ করতে পারেন এবং উত্তরযোগ্য প্রতিটির মধ্যে স্বয়ংক্রিয়ভাবে চলে যাবে যতক্ষণ না এটি উপস্থিত একটি ফাইল সন্ধান করে এবং লোড না করে। উদা:

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

4
উত্তরীয় বিকাশকারীদের মতে , এই সমাধানটি কেবল প্রথমটি পাওয়া যায়নি, সমস্ত ফাইলই লোড করবে।
tjanez

10

উত্তরীয় বিকাশকারীদের মতে , এর সমাধানের যথাযথ উপায় হ'ল কিছু ব্যবহার করা:

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

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

তদতিরিক্ত, তারা বলে :

উপরেরগুলি কেবলমাত্র পাওয়া প্রথম ফাইলটি সঠিকভাবে লোড করবে এবং vars_filesভাষা কীওয়ার্ডের মাধ্যমে এটি করার চেষ্টা করার চেয়ে আরও নমনীয় ।


"কেবল প্রথম ফাইলটি পাওয়া গেছে" - ধারণাটি ছিল কিছু ভেরিয়েবলের নতুন সংজ্ঞা দেওয়া, সেগুলি সব নয়
সের্গেই

@ সেরজে, আপনার প্রশ্নটি আবার পড়ে, আমি দেখতে পাচ্ছি আপনি যা চেয়েছিলেন তা কিছুটা আলাদা। এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ. আমি উত্তরটি এমনভাবে রেখে দেব যা অন্য কারও কাছে এটি দরকারী মনে হয়।
tjanez

1
ছাড়া include_varsকাজের মধ্যে ভেরিয়েবল একটি উচ্চ প্রাধান্য দেব ভূমিকা তুলনায় defaultsবাvars
অ্যালেক্স এফ

2

আমি এই সেটআপটিতে এই সমস্যার মুখোমুখি হয়েছি যেখানে একই শারীরিক সার্ভারে (একাধিক ভার্চুয়াল মেশিনের অনুমতি নেই) একাধিক স্থাপনার পরিবেশ (লাইভ, ডেমো, স্যান্ডবক্স) তৈরি করতে হবে এবং তারপরে নির্বিচারে এসএনএন রেপো স্থাপন করার জন্য একটি স্ক্রিপ্ট

এটির জন্য (alচ্ছিক) ভেরিয়েবল.আইএমএল ফাইলগুলির একটি ডিরেক্টরি ট্রি থাকা দরকার যা একে অপরের উপরের দিকে একত্রীভূত হবে এবং অনুপস্থিত থাকলে যদি কোনও ব্যতিক্রম ছুঁড়ে না ফেলে

জবাবদিহিতে ভেরিয়েবল মার্জিং সক্ষম করে শুরু করুন - নোট করুন যে এটি অগভীর হ্যাশ মার্জ করে (1 স্তর গভীর) এবং সম্পূর্ণ পুনরাবৃত্তির গভীর সংশ্লেষ নয়

ansible.cfg

[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

ভূমিকা / প্রয়োগের / কর্ম / includes.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"

group_vars / all.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

ভূমিকা / প্রয়োগের / Vars / main.yml

প্রকল্পের খেলাপি

ansible_project:
  node_env:   development
  node_port:  4200
  nginx_port: 4400

ভূমিকা / প্রয়োগের / Vars / project_1.yml

প্রকল্পের জন্য ডিফল্ট

ansible_project:
  node_port:  4201
  nginx_port: 4401

ভূমিকা / প্রয়োগের / Vars / লাইভ / main.yml

লাইভ পরিবেশের জন্য ডিফল্ট, প্রকল্পের ডিফল্টকে ওভাররাইড করে

ansible_project:
  node_env: production

ভূমিকা / প্রয়োগের / Vars / লাইভ / project_1.yml

লাইভ পরিবেশে প্রকল্প_1 এর জন্য চূড়ান্ত ওভাররাইডগুলি

ansible_project:
  nginx_port: 80

playbooks / demo.yml

প্রতিটি পরিবেশের জন্য পৃথক প্লেবুক কনফিগার করুন

- 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

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 }}"

দ্রষ্টব্য: পাথ পরীক্ষাগুলি (ফাইলটি উপস্থিত রয়েছে, বিদ্যমান রয়েছে ...) উত্তরীয়-প্লেবুক কমান্ড চলাকালীন কেবলমাত্র চলমান ডিরেক্টরি ডিরেক্টরি সম্পর্কিত নিখুঁত পাথ বা পাথ দিয়ে কাজ করে। এই কারণেই আমরা অনুসন্ধানটি ব্যবহার করেছি। অনুসন্ধান প্লেবুক ডিরেক্টরি সম্পর্কিত পাথ গ্রহণ করে এবং ফাইল উপস্থিত থাকলে পরম পাথ ফেরত দেয়।


0

বা আরও ইয়ামাল পদ্ধতিতে:

- 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_hostname }}.ymlপরিবর্তে ফাইলের নাম ../path/to/file1। আলোচ্য বিষয়টি কি? কেউ সীমাহীন সংখ্যক ইনপুট ফাইলের নাম যুক্ত করতে পারে।
টেক্রাফ

@ টেক্রাফ: ঠিক আছে, কেন নতুন উত্তর জমা দেওয়া হয়েছিল সে সম্পর্কে আমি কিছু স্পষ্টতা / প্রশস্তি যুক্ত করেছি। এটি কারণ সার্ভারফল্ট মন্তব্যগুলি বহু-লাইন কোড স্নিপেটগুলি সমর্থন করে না, এবং আমি কেবল একটি পয়েন্ট দিচ্ছিলাম যে একাধিক লাইনে ইয়ামাল অ্যারেগুলি প্রায়শই (পছন্দনীয়?) লিখিত থাকে। আগের উত্তরটি সম্পাদনা করা এবং মাল্টি-লাইন অ্যারে ফর্ম্যাটটি দেখানো হলে আমিও ঠিক থাকতাম, যেহেতু আমি প্রায়শই দেখি। তাহলে আমার উত্তর মুছতে পারে।
ডন লি

উভয় স্বরলিপি একটি অধ্যায়ের ওয়াইএএমএল বুনিয়াদীতে উত্তরযোগ্য ডক্সে নির্দিষ্ট করা হয়েছে । আপনি অন্যটির তুলনায় একাধিকবার দেখতে পান তা এখনও এটিকে নতুন উত্তর দেয় না।
টেক্রাফ

0

একসাথে বিভিন্ন টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো রয়েছে ... অর্থাত

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

0

সর্বশেষ 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.