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




ansible-playbook (7)

किसी के लिए जो समाधान की तलाश में आ सकता है।
प्ले बुक

- hosts: '{{ host }}'
  tasks:
  - debug: msg="Host is {{ ansible_fqdn }}"

इन्वेंटरी

[web]
x.x.x.x

[droplets]
x.x.x.x

कमांड: ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets" ताकि आप अतिरिक्त- ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets" में समूह का नाम निर्दिष्ट कर सकें

यह एक प्लेबुक का एक टुकड़ा है जिसका मैं उपयोग कर रहा हूं ( 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 सीधे संपादन के बिना, एक बार की चीज़ के रूप में ओवरराइड कर सकता हूं?

धन्यवाद।


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


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

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

---
- name: Playbook will fail if hosts not specified via --limit option.
  # Hosts must be set via limit. 
  hosts: "{{ play_hosts }}"
  connection: local
  gather_facts: false
  tasks:
  - set_fact:
      inventory_hosts: []
  - set_fact:
      inventory_hosts: "{{inventory_hosts + [item]}}"
    with_items: "{{hostvars.keys()|list}}"

  - meta: end_play
    when: "(play_hosts|length) == (inventory_hosts|length)"

  - debug:
      msg: "About to execute tasks/roles for {{inventory_hostname}}"

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

---
- name: Force limit
  # all is okay, because we must anyway specify a limit
  hosts: 'all'

  tasks:
  - name: checking limit arg
    fail:
      msg: "you must use -l or --limit - when you really want to use all hosts, use -l 'all'"
    when: ansible_limit is not defined
    run_once: true

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

- 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 2.4.3 और 2.3.3 का उपयोग कर रहा हूं


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

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


यह थोड़ा देर से है, लेकिन मुझे लगता है कि आप पैटर्न को और अधिक विशिष्ट होस्ट तक सीमित करने के लिए --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 फ्लैग का उपयोग करके देखें कि यह कॉन्फ़िगरेशन किस होस्ट पर लागू होगा।


हम उपयोगकर्ता को Ansible सीमा विकल्प को निर्दिष्ट करने के लिए मजबूर करने के लिए एक सरल असफल कार्य का उपयोग करते हैं, ताकि हम डिफ़ॉल्ट / दुर्घटना द्वारा सभी मेजबानों पर निष्पादित न करें।

सबसे आसान तरीका मुझे यह मिला:

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

जब हम playbook चलाते हैं तो हमें -l (= --limit विकल्प) का उपयोग करना चाहिए, जैसे

---

# general
host_name: your-fancy-host-name

सीमा विकल्प डॉक्स :

एक या अधिक होस्ट तक सीमित करें यह तब आवश्यक है जब कोई एक होस्ट समूह के खिलाफ एक प्लेबुक चलाना चाहता है, लेकिन केवल उस समूह के एक या अधिक सदस्यों के खिलाफ।

एक मेजबान तक सीमित

ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit "host1"

कई मेजबानों तक सीमित करें

ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit "host1,host2"

नकारात्मक सीमा।
नोट: बैश प्रक्षेप को रोकने के लिए एकल उद्धरण का उपयोग किया जाना चाहिए।

ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit 'all:!host1'

मेजबान समूह की सीमा

ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit 'group1'





ansible-playbook