# Variables और Precedence — Ansible: Playbooks से Servers का Automation

Source: https://www.geekswithgeeks.com/hi/ansible/var-basics

> कई जगहों पर 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 करने देते हैं।

![चार स्रोत: inventory, vars, facts, templates।](assets/figures/ansible/section-3-map.svg) — चित्र 3.1 — Inventory, vars, facts और templates।

## -e से override, चलाकर

मैंने नीचे का उदाहरण चलाया जहाँ play में `env` का डिफ़ॉल्ट `staging` है। `when: env == "production"` वाला task सामान्यतः छोड़ा जाता है। `-e env=production --tags prod` के साथ extra var जीतता है और task चलकर अपना संदेश छापता है।

```bash
ansible-playbook -i inventory.ini vars.yml -e env=production --tags prod
```

Output:

```
"msg": "prod only"
```

## उपयोग हुई playbook

यही फ़ाइल अगले खंड में loops, `when`, `register` और tags भी दिखाती है।

```yaml
---
- 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 भी है।

**Quiz:** कौन-सा स्रोत आम तौर पर लगभग सब कुछ override करता है?

- [ ] YAML में comment
- [ ] Role defaults
- [x] Command line पर -e extra vars
- [ ] फ़ाइल का नाम

*Answer:* Command line पर -e extra vars. Extra vars की precedence सबसे ऊँची है, जो overrides के लिए उपयोगी और ज़्यादा उपयोग पर जोखिम भरी है।
