कमांड लाइन से Ansible playbook के होस्ट वेरिएबल को ओवरराइड करें




ansible-playbook (7)

यदि आप एक ऐसे कार्य को चलाना चाहते हैं जो एक मेजबान के साथ जुड़ा हुआ है, लेकिन अलग-अलग होस्ट पर, आपको डेल्टेट_टो की कोशिश करनी चाहिए।

आपके मामले में, आपको अपने लोकलहोस्ट (अन्सिएबल मास्टर) को कॉल करना चाहिए और कॉल करने योग्य ansible-playbook कमांड को कॉल करना चाहिए

यह एक प्लेबुक का एक टुकड़ा है जिसका मैं उपयोग कर रहा हूं ( server.yml ):

- name: Determine Remote User
  hosts: web
  gather_facts: false
  roles:
    - { role: remote-user, tags: [remote-user, always] }

मेरे होस्ट फ़ाइल में सर्वरों के विभिन्न समूह हैं, जैसे

[web]
x.x.x.x

[droplets]
x.x.x.x

अब मैं ansible-playbook -i hosts/<env> server.yml निष्पादित करना चाहता हूं और hosts: web ओवरराइड करना चाहता हूं hosts: web [droplets] लिए इस प्लेबुक को चलाने के लिए server.yml से hosts: web

क्या मैं server.yml सीधे संपादन के बिना, एक बार की चीज़ के रूप में ओवरराइड कर सकता हूं?

धन्यवाद।


मैं ansible 2.5 (2.5.3 वास्तव में) का उपयोग कर रहा हूं, और ऐसा लगता है कि vars फ़ाइल को लोड किया गया है इससे पहले कि मेजबानों को निष्पादित किया जाए। इसलिए आप होस्ट को एक vars.yml फ़ाइल में सेट कर सकते हैं और अपनी होस्टबुक में केवल hosts: {{ host_var }} लिख सकते हैं

उदाहरण के लिए, मेरी playbook.yml में:

---
- hosts: "{{ host_name }}"
  become: yes
  vars_files:
    - vars/project.yml
  tasks:
    ... 

और अंदर var / project.yml:

---

# general
host_name: your-fancy-host-name

मैंने बिना किसी होस्ट के डिफ़ॉल्ट को बदल दिया और इसे पकड़ने के लिए एक चेक किया। इस तरह उपयोगकर्ता या क्रोन को एक एकल होस्ट या समूह आदि प्रदान करने के लिए मजबूर किया जाता है। मुझे @wallydrag की टिप्पणी से तर्क पसंद है। empty_group में empty_group में कोई होस्ट नहीं है।

- hosts: "{{ variable_host | default('empty_group') }}"

फिर कार्यों में चेक जोड़ें:

   tasks:
   - name: Fail script if required variable_host parameter is missing
     fail:
       msg: "You have to add the --extra-vars='variable_host='"
     when: (variable_host is not defined) or (variable_host == "")

मुझे नहीं लगता कि Ansible यह सुविधा प्रदान करता है, जिसे यह करना चाहिए। यहाँ कुछ है जो आप कर सकते हैं:

hosts: "{{ variable_host | default('web') }}"

और आप या तो कमांड-लाइन से या vars फ़ाइल से वेरिएबल_होस्ट पास कर सकते हैं, जैसे:

ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"

यह थोड़ा देर से है, लेकिन मुझे लगता है कि आप पैटर्न को और अधिक विशिष्ट होस्ट तक सीमित करने के लिए --limit or -l कमांड का उपयोग कर सकते हैं। (संस्करण 2.3.2.0)

आपके पास हो सकता है - hosts: all (or group) tasks: - some_task

और फिर ansible-playbook playbook.yml -l some_more_strict_host_or_pattern और ansible-playbook playbook.yml -l some_more_strict_host_or_pattern --list-hosts फ्लैग का उपयोग करके देखें कि यह कॉन्फ़िगरेशन किस होस्ट पर लागू होगा।


बस एक समाधान के लिए इस googling भर में आया था। दरअसल, Ansible 2.5 में एक है। आप अपनी इन्वेंट्री फ़ाइल को इस तरह से --inventory , के साथ निर्दिष्ट कर सकते हैं: ansible --inventory configs/hosts --list-hosts all


मैं एक और दृष्टिकोण का उपयोग कर रहा हूं जिसे किसी भी सूची की आवश्यकता नहीं है और इस सरल कमांड के साथ काम करता है:

ansible-playbook site.yml -e working_host=myhost

ऐसा करने के लिए, आपको दो नाटकों के साथ एक प्लेबुक चाहिए:

  • पहला नाटक लोकलहोस्ट पर चलता है और एक ज्ञात समूह में एक होस्ट (दिए गए वैरिएबल से) को इनमेमोरी इन्वेंट्री में जोड़ता है
  • इस ज्ञात समूह पर दूसरा नाटक चलता है

एक कार्यकारी उदाहरण (इसे कॉपी करें और इसे पिछले कमांड से चलाता है):

- hosts: localhost
  connection: local
  tasks:
  - add_host:
      name: "{{ working_host }}"
      groups: working_group
    changed_when: false

- hosts: working_group
  gather_facts: false
  tasks:
  - debug:
      msg: "I'm on {{ ansible_host }}"

मैं ansible 2.4.3 और 2.3.3 का उपयोग कर रहा हूं





ansible-playbook