पाठ 9 / 26
Variables और Precedence
कई जगहों पर variables परिभाषित करें और समझें कि कौन जीतता है।
कई जगहें, एक विजेता
Variables inventory, group_vars/ और host_vars/ files, play के vars:, role defaults, facts, register किए नतीजों और command line से आ सकते हैं। एक ही नाम कई जगह हो तो Ansible प्रलेखित precedence क्रम अपनाता है। दो उपयोगी नियम: role defaults सबसे कमज़ोर हैं, इसलिए उन्हें बदलना आसान है; और command line का -e (extra vars) लगभग सब पर भारी पड़ता है, जो एक-बार के override के लिए सुविधाजनक है।
एक playbook, अलग hosts
Variables, facts और templates एक playbook को कई अलग hosts सही ढंग से configure करने देते हैं।
-e से override, चलाकर
मैंने नीचे का उदाहरण चलाया जहाँ play में env का डिफ़ॉल्ट staging है। when: env == "production" वाला task सामान्यतः छोड़ा जाता है। -e env=production --tags prod के साथ extra var जीतता है और task चलकर अपना संदेश छापता है।
ansible-playbook -i inventory.ini vars.yml -e env=production --tags prod
Output:
"msg": "prod only"
उपयोग हुई playbook
यही फ़ाइल अगले खंड में loops, when, register और tags भी दिखाती है।
---
- hosts: web1
gather_facts: false
vars:
packages: [git, curl, nginx]
env: staging
tasks:
- name: Show packages with loop
ansible.builtin.debug:
msg: "install {{ item }}"
loop: "{{ packages }}"
- name: Only in production
ansible.builtin.debug:
msg: "prod only"
when: env == "production"
tags: [prod]
- name: Register a result
ansible.builtin.command: echo hello
register: out
changed_when: false
tags: [info]
- name: Show registered stdout
ansible.builtin.debug:
var: out.stdout
tags: [info]नाम स्पष्ट और prefix वाले रखें
आकस्मिक टकराव से बचने के लिए role variables में role का नाम prefix करें (port नहीं, nginx_port)। ऐसा variable नाम कभी न रखें जो Ansible का keyword भी है।
त्वरित जाँच: कौन-सा स्रोत आम तौर पर लगभग सब कुछ override करता है?
- YAML में comment
- Role defaults
- Command line पर -e extra vars
- फ़ाइल का नाम
Answer
Command line पर -e extra vars — Extra vars की precedence सबसे ऊँची है, जो overrides के लिए उपयोगी और ज़्यादा उपयोग पर जोखिम भरी है।