Ansible होस्ट पर रन कमांड


247

क्या यह संभव है कि आंसरशीट होस्ट पर कमांड चलाया जा सके?

मेरा परिदृश्य यह है कि मैं एक git सर्वर से चेकआउट लेना चाहता हूं जो आंतरिक रूप से होस्ट किया गया है (और कंपनी फ़ायरवॉल के बाहर सुलभ नहीं है)। फिर मैं चेकआउट (तारांकित) को उत्पादन सर्वर (बाहरी रूप से होस्ट किया गया) पर अपलोड करना चाहता हूं।

फिलहाल, मैं एक स्क्रिप्ट चलाने पर विचार कर रहा हूं जो चेकआउट करता है, इसे तारकोल करता है, और फिर तैनाती स्क्रिप्ट चलाता है - लेकिन अगर मैं इसे अंसिबल में एकीकृत कर सकता हूं जो बेहतर होगा।

जवाबों:


347

हां, आप अंसिबल होस्ट पर कमांड चला सकते हैं। आप यह निर्दिष्ट कर सकते हैं कि सभी कार्य Ansible host पर चलते हैं, या आप Ansible host पर चलने के लिए अलग-अलग कार्यों को चिह्नित कर सकते हैं।

आप Ansible मेजबान पर एक पूरे नाटक को चलाने के लिए है, तो निर्दिष्ट चाहते हैं hosts: 127.0.0.1और connection:localउदाहरण के लिए खेलने में,:

- name: a play that runs entirely on the ansible host
  hosts: 127.0.0.1
  connection: local
  tasks:
  - name: check out a git repository
    git: repo=git://foosball.example.org/path/to/repo.git dest=/local/path

देखें स्थानीय playbooks अधिक जानकारी के लिए Ansible दस्तावेज में।

यदि आप अपने Ansible host पर केवल एक ही कार्य चलाना चाहते हैं, तो आप यह local_actionनिर्दिष्ट करने के लिए उपयोग कर सकते हैं कि कोई कार्य स्थानीय रूप से चलाया जाना चाहिए। उदाहरण के लिए:

- name: an example playbook
  hosts: webservers
  tasks:
  - ...

  - name: check out a git repository
    local_action: git repo=git://foosball.example.org/path/to/repo.git dest=/local/path

देखें प्रतिनिधिमंडल अधिक जानकारी के लिए Ansible दस्तावेज में।

संपादित करें: आप इसे connection: localअपनी सूची में जोड़कर अपने नाटक में टाइप करने से बच सकते हैं :

localhost ansible_connection=local

(यहाँ आप "127.0.0.1" के बजाय "लोकलहोस्ट" का प्रयोग करेंगे।

संपादित करें: ansible के नए संस्करणों में, अब आपको अपनी सूची में उपरोक्त पंक्ति को जोड़ने की आवश्यकता नहीं है, ansible मान लेता है कि यह पहले से ही वहां मौजूद है।


8
मुझे sudo: noप्रतिनिधिमंडल के परिदृश्य में भी ज़रूरत थी
डेनियल

रूट कनेक्शन के रूप में स्थानीय कनेक्शन कैसे चलाएं?
बिलाल उसैन

@BalalUsean ansible-playbook -K playbook.ymlजहां -K रूट के लिए
कुश

74

मुझे कुछ और तरीके मिले हैं, जिन्हें आप लिख सकते हैं जो कि थोड़ा अधिक पठनीय IMHO हैं।

- name: check out a git repository
  local_action: 
    module: git
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

या

- name: check out a git repository
  local_action: git
  args:
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

3
दिलचस्प है, कि कमांड के साथ काम कैसे होगा ? क्योंकि जहां तक ​​मुझे पता है कि हम कमांड को निष्पादित करने के लिए परम फ्री_फॉर्म का उपयोग नहीं कर सकते हैं
एंडर

@Ander shellमॉड्यूल पर लागू होता है।
ceving

6
कमांड / शेल के उपयोग के लिए, आप जो चाहते हैं वह "_raw_params" है
mvr

41

मैं साझा करना चाहूंगा कि अन्सिबल को शेल के माध्यम से लोकलहोस्ट पर चलाया जा सकता है:

ansible all -i "localhost," -c local -m shell -a 'echo hello world'

यह सरल कार्यों के लिए या कुछ हाथों पर सीखने के लिए उपयोगी हो सकता है।

कोड का उदाहरण इस अच्छे लेख से लिया गया है:

लोकलहोस्ट में ansible playbook चलाना


2
लोकलहोस्ट के बाद अल्पविराम (,) का क्या महत्व है। मैंने देखा कि यह काम करने के लिए महत्वपूर्ण है
Tuomas Toivonen

2
अनुगामी अल्पविराम एक फ़ाइल को इंगित करने के साथ एक सरल इन्वेंट्री को परिभाषित करना है। यह एक अनजाने हैक की तरह है, और दूर जा सकता है (iirc)।
सीनर्समाइल

19

आप delegate_toअपने Ansible host (एडमिन होस्ट) पर कमांड चलाने के लिए उपयोग कर सकते हैं , जहाँ से आप अपना Ansible प्ले चला रहे हैं। उदाहरण के लिए:

यदि यह पहले से ही Ansible होस्ट पर मौजूद है, तो एक फ़ाइल हटाएँ:

 - name: Remove file if already exists
   file:
    path: /tmp/logfile.log
    state: absent
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

Ansible होस्ट पर एक नई फ़ाइल बनाएँ:

 - name: Create log file
   file:
    path: /tmp/logfile.log
    state: touch
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

1
यह किसी भी उत्तर का अब तक का सबसे साफ समाधान प्रतीत होता है।
चूजों

1
इस बात से सहमत। कम से कम नया वाक्यविन्यास, सबसे अधिक लचीला (कहीं और प्रतिनिधि)। नोट करने के लिए एक आइटम - यदि becomeकार्य के लिए सही है, तो यह sudo और इस तरह की शिकायत करेगा। यह सीधे कार्य पर हो सकता है या अन्यत्र विरासत में मिल सकता है।
बजे JL Peyret

4

@Gordon द्वारा उत्तर पर विस्तार करते हुए, यहां शेल / कमांड मॉड्यूल के साथ पढ़ने योग्य वाक्यविन्यास और तर्क का एक उदाहरण दिया गया है (ये git मॉड्यूल से भिन्न होते हैं जिसमें @ander द्वारा उल्लेखित आवश्यक लेकिन मुक्त रूप तर्क हैं)

- नाम: "रिलीज टारबॉल उत्पन्न होता है"
  local_action:
    मॉड्यूल: खोल
    _raw_params: git आर्काइव --format zip --output release.zip HEAD
    chdir: "फाइलें / क्लोन / वेबहुक"

2

Ansible दस्तावेज़ से :

प्रत्यायोजन यह वास्तव में अद्यतन अद्यतन नहीं है, लेकिन उन मामलों में अक्सर आता है।

यदि आप अन्य होस्ट के संदर्भ में एक होस्ट पर एक कार्य करना चाहते हैं, तो एक कार्य पर 'डेलीगेट_टो' कीवर्ड का उपयोग करें। यह एक लोड संतुलित पूल में नोड्स रखने या उन्हें हटाने के लिए आदर्श है। आउटेज विंडो को नियंत्रित करने के लिए भी यह बहुत उपयोगी है। ध्यान रखें कि यह सभी कार्यों को सौंपने के लिए कोई मतलब नहीं है, डिबग, add_host, शामिल, आदि को हमेशा नियंत्रक पर निष्पादित किया जाता है। एक समय में निष्पादित करने वाले मेजबानों की संख्या को नियंत्रित करने के लिए 'सीरियल' कीवर्ड के साथ इसका उपयोग करना भी एक अच्छा विचार है:

---

- hosts: webservers
  serial: 5

  tasks:

  - name: take out of load balancer pool
    command: /usr/bin/take_out_of_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

  - name: actual steps would go here
    yum:
      name: acme-web-stack
      state: latest

  - name: add back to load balancer pool
    command: /usr/bin/add_back_to_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

ये कमांड 127.0.0.1 पर चलेंगे, जो कि मशीन चल रही है। एक शॉर्टहैंड सिंटैक्स भी है जिसे आप प्रति-कार्य के आधार पर उपयोग कर सकते हैं: 'local_action'। यहाँ ऊपर की तरह ही प्लेबुक है, लेकिन 127.0.0.1 पर प्रतिनिधि के लिए शॉर्टहैंड सिंटैक्स का उपयोग करना:

---

# ...

  tasks:

  - name: take out of load balancer pool
    local_action: command /usr/bin/take_out_of_pool {{ inventory_hostname }}

# ...

  - name: add back to load balancer pool
    local_action: command /usr/bin/add_back_to_pool {{ inventory_hostname }}

एक सामान्य पैटर्न प्रबंधित सर्वरों में फ़ाइलों की पुन: प्रतिलिपि करने के लिए 'rsync' को कॉल करने के लिए एक स्थानीय कार्रवाई का उपयोग करना है। यहाँ एक उदाहरण है:

---
# ...
  tasks:

  - name: recursively copy files from management server to target
    local_action: command rsync -a /path/to/files {{ inventory_hostname }}:/path/to/target/

ध्यान दें कि आपके पास पासफ़्रेज़-कम SSH कुंजी या कार्य करने के लिए कॉन्फ़िगर किया गया ssh- एजेंट होना चाहिए, अन्यथा rsync को पासफ़्रेज़ के लिए पूछने की आवश्यकता होगी।


0
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

डिफ़ॉल्ट मॉड्यूल कमांड मॉड्यूल है, इसलिए command कीवर्ड की आवश्यकता नहीं है।

यदि आपको -bउसी कमांड के अंत में एलिवेटेड विशेषाधिकारों के साथ कोई कमांड जारी करने की आवश्यकता है ।

ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b

-1

आप इस तरह से कोशिश कर सकते हैं

  • git: रेपो: ' https://foosball.example.org/path/to/repo.git ' डेस्ट: / srv / चेकआउट संस्करण: रिलीज़-0.2 डेलीगेट_टो: लोकलहोस्ट
  • नाम: अगले yum में कुछ कमांड करें: name = ntp state = latest
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.