उत्तर देने योग्य: क्या मैं 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 आइटम्स को एक ही ट्यूपल में स्क्वैश कर सकते हैं और जब तक यह मौजूद है और इसे लोड नहीं करता है तब तक Ansible स्वचालित रूप से हर एक के माध्यम से जाएगा। उदाहरण के लिए:

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

4
Ansible Developers के अनुसार , यह समाधान सभी फाइलों को लोड करेगा, न कि केवल पहले वाले को।
tjanez

10

Ansible डेवलपर्स के अनुसार , इसे हल करने का उचित तरीका कुछ का उपयोग करना है:

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

मुझे एक सेटअप में इस समस्या का सामना करना पड़ा जहाँ मुझे एक ही भौतिक सर्वर (यहाँ वर्चुअल मशीन की अनुमति नहीं है) के लिए कई परिनियोजन वातावरण (लाइव, डेमो, सैंडबॉक्स) बनाने की आवश्यकता थी, और फिर मनमाना svn repos तैनात करने के लिए एक स्क्रिप्ट

इसके लिए (वैकल्पिक) वैरिएबल .yml फ़ाइलों की निर्देशिका ट्री की आवश्यकता होती है, जो एक-दूसरे के बीच में विलय करते हैं और किसी भी लापता होने पर एक अपवाद नहीं फेंकते हैं

आरंभिक मर्जिंग को सक्षम करने से शुरू करें - ध्यान दें कि यह उथले हैश मर्जिंग (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

यह वैकल्पिक चर फ़ाइलों की निर्देशिका ट्री के लिए मुख्य तर्क है।

;; 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

भूमिकाओं / तैनाती / वार्स / main.yml

परियोजना की चूक

ansible_project:
  node_env:   development
  node_port:  4200
  nginx_port: 4400

भूमिकाओं / तैनाती / वार्स / project_1.yml

प्रोजेक्ट 1 के लिए चूक

ansible_project:
  node_port:  4201
  nginx_port: 4401

भूमिकाओं / तैनाती / वार्स / लाइव / main.yml

लाइव पर्यावरण के लिए चूक, परियोजना की चूक को ओवरराइड करता है

ansible_project:
  node_env: production

भूमिकाओं / तैनाती / वार्स / लाइव / project_1.yml

लाइव वातावरण में Project_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 }}"

नोट: पथ परीक्षण (फ़ाइल मौजूद है, मौजूद है, ...) ansible-playbook कमांड चलाने के दौरान केवल वर्तमान पथ निर्देशिका के सापेक्ष पूर्ण पथ या पथ के साथ काम करते हैं। यही कारण है कि हमने लुकअप का उपयोग किया है। लुकअप प्लेबुक निर्देशिका के सापेक्ष पथ स्वीकार करता है और फ़ाइल मौजूद होने पर निरपेक्ष पथ लौटाता है।


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', ...]

कई प्रकारों पर सरणी मान लिखने के yaml तरीके का उपयोग करें, जैसे:

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

जैसा कि यह उल्लेख एक vars फ़ाइल नाम के लिए लग रहा है {{ ansible_hostname }}.yml, और अगर यह मौजूद नहीं है का उपयोग करता हैdefault.yml


यह उत्तर समान कोड का उपयोग करता है क्योंकि यह एक अलग डेटा का उपयोग करता है। अर्थात् {{ ansible_hostname }}.ymlबजाय फ़ाइल नाम ../path/to/file1। क्या बात है? कोई भी असीमित संख्या में इनपुट फ़ाइल नाम जोड़ सकता है।
Techraf

@techraf: ठीक है, मैंने कुछ स्पष्टीकरण / प्रवर्धन जोड़ा है कि क्यों एक नया जवाब प्रस्तुत किया गया था। ऐसा इसलिए है क्योंकि सर्वरफॉल्ट टिप्पणियाँ मल्टी-लाइन कोड स्निपेट का समर्थन नहीं करते हैं, और मैं सिर्फ एक बिंदु बना रहा था कि कई लाइनों पर यमल सरणियां अक्सर (अधिमानतः) लिखी जाती हैं। मैं भी ठीक होता अगर पहले वाला उत्तर संपादित किया जाता और बहु-पंक्ति सरणी प्रारूप दिखाया जाता, जैसा कि मुझे लगता है कि अधिक बार। तब मेरा उत्तर हटाया जा सकता है।
डॉन ली

दोनों अधिसूचनाएं एक अध्याय YAML मूल बातें में Ansible डॉक्स में निर्दिष्ट हैं । यह तथ्य कि आप एक को दूसरे की तुलना में अधिक बार देखते हैं, यह अभी तक एक नया उत्तर नहीं बनाता है।
Techraf

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.