जवाबदेह: क्या मैं कमांड लाइन से भूमिका निष्पादित कर सकता हूं?


90

मान लीजिए कि मेरी "अपाचे" नामक भूमिका है

अब मैं 192.168.0.10 होस्ट लाइन पर उस भूमिका को अंसिबल होस्ट से कमांड लाइन से निष्पादित करना चाहता हूं

ansible-playbook -i  "192.168.0.10" --role  "path to role"

क्या ऐसा करने के लिए कोई रास्ता है?

जवाबों:


84

मुझे इस सुविधा के बारे में जानकारी नहीं है, लेकिन आप अपनी प्लेबुक से केवल एक भूमिका चलाने के लिए टैग का उपयोग कर सकते हैं।

roles:
    - {role: 'mysql', tags: 'mysql'}
    - {role: 'apache', tags: 'apache'}

ansible-playbook webserver.yml --tags "apache"

60

2.7 2.7 के साथ आप यह कर सकते हैं:

$ cd /path/to/ansible/
$ ansible localhost -m include_role -a name=<role_name>
localhost | SUCCESS => {
    "changed": false,
    "include_variables": {
        "name": "<role_name>"
    }
}
localhost | SUCCESS => {
    "msg": "<role_name>"
}

यह भूमिका / पथ / से / ansible / भूमिका या कॉन्फ़िगर की गई भूमिका पथ तक चलेगी।

यहां पढ़ें: https://github.com/ansible/ansible/pull/43131


1
यह वास्तव में इस सवाल का जवाब नहीं देता है क्योंकि बाहरी भूमिका YAML फ़ाइल @kari लागू नहीं है और इसमें शामिल होना चाहता है। मेरे पास भी वही प्रश्न है। फिर भी इस उत्तर को पढ़ने के बाद, मैं केवल यह समझता हूं कि यह संभव है। मैं नहीं जानता कि कैसे।
कोला

उम्मीद है कि मैंने @Kola
Julius romaromskis

1
यह Ansible 2.8 में टूट गया है। यह सिर्फ क्रिप्टिक त्रुटि संदेशों को लॉग करता है जैसे'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
क्रिश्चियन सियाच

यह समाधान मेरे लिए काम करने योग्य 2.8.2 के साथ लगता है। यह मूल भूमिका के भीतर शामिल अन्य भूमिकाओं के लिए चर को उजागर करने के साथ एक समस्या है (जो एक प्लेबुक में कोई समस्या नहीं है)। मैंने बदलने की कोशिश की -a "name=<role_name> public=yes", लेकिन इससे कोई फायदा नहीं हुआ।
user2066480

यह समझने के लिए कि क्या -m और -a docs.ansible.com/ansible/latest/user_guide/modules_intro.html मूल रूप से देखता है , यह है कि कैसे कमांड लाइन से शुरू किया जा सकता है ( -m <module-name>) कुंजी = मान जोड़े के साथ तर्कों ( -a key=value) के साथ ( )
andymel

22

Ansible में ऐसी कोई बात नहीं है, लेकिन अगर यह आपके लिए अक्सर उपयोग किया जाने वाला मामला है, तो इस स्क्रिप्ट का प्रयास करें।
नाम के तहत अपने खोजा पेट के भीतर कहीं रखो ansible-role:

#!/bin/bash

if [[ $# < 2 ]]; then
  cat <<HELP
Wrapper script for ansible-playbook to apply single role.

Usage: $0 <host-pattern> <role-name> [ansible-playbook options]

Examples:
  $0 dest_host my_role
  $0 custom_host my_role -i 'custom_host,' -vv --check
HELP
  exit
fi

HOST_PATTERN=$1
shift
ROLE=$1
shift

echo "Trying to apply role \"$ROLE\" to host/group \"$HOST_PATTERN\"..."

export ANSIBLE_ROLES_PATH="$(pwd)/roles"
export ANSIBLE_RETRY_FILES_ENABLED="False"
ansible-playbook "$@" /dev/stdin <<END
---
- hosts: $HOST_PATTERN
  roles:
    - $ROLE
END

3
मैंने एक "एक बनाने योग्य भूमिका" उपकरण प्रस्ताव बनाया है, हम देखेंगे: github.com/ansible/proposals/issues/131
jhutar

4
ऐसा लगता है कि इसे Ansible 2.7 में लागू किया गया है: github.com/ansible/ansible/pull/43131
EM0

हां, कृपया कोशिश करें ansible localhost -m include_role -a name=myrole- मेरे लिए काम करता है!
झूतर

ansible localhost -m include_role -a name=myrole2.8 के बाद से टूट गया है। यह सिर्फ क्रिप्टिक त्रुटि संदेशों को लॉग करता है जैसे'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
क्रिश्चियन सियाच


13

मैंने एक छोटा सा ऐन्सिबल प्लगइन लिखा है, जिसे auto_tagsडायनामिक रूप से आपकी प्लेबुक में प्रत्येक भूमिका के लिए उसी नाम का टैग बनाया गया है। आप इसे यहाँ पा सकते हैं ।

इसे स्थापित करने के बाद (निर्देश ऊपर दिए गए विवरण में हैं) तब आप एक विशिष्ट भूमिका निभा सकते हैं:

ansible-playbook -i "192.168.0.10" --tags "name_of_role"


4

क्या आपने कोशिश की है? यह शानदार है। मैं अधिक सार्थक उदाहरण देने के लिए 'अपाचे' भूमिका के बजाय 'अपडेट-ओएस' का उपयोग कर रहा हूं। मेरे पास एक भूमिका है जिसे मैं कहता ./roles/update-os/हूं कि ./मैं एक फाइल जोड़ता हूं, ./role-update-os.ymlजिसका नाम ऐसा है:

#!/usr/bin/ansible-playbook
---
- hosts: all
  gather_facts: yes
  become: yes
  roles:
  - update-os

इस फ़ाइल को निष्पादन योग्य ( chmod +x role-update-os.yml) बनाएं । अब आप चला सकते हैं और आपके इन्वेंट्री में जो कुछ भी है ./update-os.yml -i inventory-dev --limit 192.168.0.10उसे सीमित कर सकते हैं और आप समूह के नामों को भी पास कर सकते हैं।

  • --limit web,db > वेब और डीबी आपकी सूची में परिभाषित समूह है
  • --limit 192.168.0.10,192.168.0.201
$ cat inventory-dev
[web]
192.168.0.10

[db]
192.168.0.201

ध्यान दें कि आप ssh-keys और sudoers नीति को कॉन्फ़िगर करने में सक्षम हो सकते हैं ताकि पासवर्ड टाइप किए बिना निष्पादित किया जा सके - स्वचालन के लिए आदर्श, इसके साथ सुरक्षा निहितार्थ हैं। इसलिए आपको यह देखने के लिए अपने वातावरण का विश्लेषण करना होगा कि क्या यह उपयुक्त है।


2

2.8 2.8 में यह थोड़ा अलग काम करता है

wohlgemuth@leela:~/workspace/rtmtb-ansible/kvm-cluster$ ansible localhost -m import_role -a name=rtmtb
 [WARNING]: No inventory was parsed, only implicit localhost is available

localhost | CHANGED => {
    "changed": true, 
    "checksum": "d31b41e68997e1c7f182bb56286edf993146dba1", 
    "dest": "/root/.ssh/id_rsa.github", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "b7831c4c72f3f62207b2b96d3d7ed9b3", 
    "mode": "0600", 
    "owner": "root", 
    "size": 3389, 
    "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.46-139127672211209/source", 
    "state": "file", 
    "uid": 0
}
localhost | CHANGED => {
    "changed": true, 
    "checksum": "1972ebcd25363f8e45adc91d38405dfc0386b5f0", 
    "dest": "/root/.ssh/config", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "f82552a9494e40403da4a80e4c528781", 
    "mode": "0644", 
    "owner": "root", 
    "size": 147, 
    "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.99-214274671218454/source", 
    "state": "file", 
    "uid": 0
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.