ansible उत्तरदायी/bin/sh: 1:/usr/bin/python के साथ विफल रहता है: नहीं मिला




ansible-playbook (12)

हम बस इसमें भागते हैं।

हम एक योनंट पर उबंटू 16.04 तैनात करते हैं, इसलिए यदि आप योनि का उपयोग नहीं कर रहे हैं तो मेरी टिप्पणी व्यर्थ है।

हमने निम्नलिखित योनि प्लगइन्स (ट्रिगर, शेल-कमांडर) स्थापित किया है और हमें मशीन पर पाइथन 2.7.6 इंस्टॉल किया गया है (जो थियोओस प्लगइन्स के बिना नहीं थे) और उत्तर देने के बाद उत्तरदायी तैनात किया जा सकता है

यह हमारा आखिरी परीक्षण था, अन्यथा हम इस स्थापना को वाग्रेंट फ़ाइल में शेल कमांड में शामिल करने वाले थे

उम्मीद है कि यह किसी की मदद कर सकता है

मैं एक त्रुटि में भाग रहा हूं जिसे मैंने कभी नहीं देखा है। आदेश और त्रुटि यहां दी गई है:

$ ansible-playbook create_api.yml

PLAY [straw] ******************************************************************

GATHERING FACTS ***************************************************************
failed: [104.55.47.224] => {"failed": true, "parsed": false}
/bin/sh: 1: /usr/bin/python: not found


TASK: [typical | install required system packages] *****************************
FATAL: no hosts matched or all hosts have already failed -- aborting


PLAY RECAP ********************************************************************
           to retry, use: --limit @/Users/john/create_api.retry

104.55.47.224               : ok=0    changed=0    unreachable=0    failed=1

Create_api.yml फ़ाइल यहां दी गई है:

---

- hosts: api
  remote_user: root
  roles:
    - api

और यहां मेजबान फ़ाइल है:

[api]
104.55.47.224

मैं भूमिका खंड को हटा सकता हूं और यह इसे पहले TASK पर नहीं लाएगा, इसके बजाय यह इसे केवल लाइन /bin/sh: 1: /usr/bin/python: not found । यहाँ क्या हो सकता है?

नोट: यदि कोई व्यक्ति आईपी पता पिंग कर रहा है और प्रतिक्रिया प्राप्त करने में असफल रहा है, तो आपको पता होना चाहिए कि मैंने चिपकने वाले कोड के बाद आईपी पता बदल दिया है।

संपादित करें पाइथन स्थानीय रूप से स्थापित किया गया था, समस्या यह थी कि यह रिमोट मशीन पर स्थापित नहीं था, जो उबंटू 15.04 चला रहा था


मुझे पता चला कि वास्तव में एक ही प्लेबुक में एकाधिक नाटक करना संभव है, इसलिए मेरे सेटअप में अब "निर्भरता प्रावधान" खेल है जो सभी होस्टों पर चलता है, और विशिष्ट होस्टों के लिए अन्य नाटकों। तो कोई और pre_tasks

उदाहरण के लिए:

- name: dependency provisioning
  hosts: all
  become: yes
  become_method: sudo
  gather_facts: false
  tasks:
    - name: install python2
      raw: sudo apt-get -y install python-simplejson

- name: production
  hosts: production_host
  roles:
    - nginx
  tasks:
    - name: update apt cache
      apt: update_cache=yes cache_valid_time=3600
  # ....

- name: staging
  hosts: staging_host
  roles:
    - nginx
  tasks:
    - name: update apt cache
      apt: update_cache=yes cache_valid_time=3600
  # ....

मैं इसे ताजा डिजिटल महासागर बूंद पर उबंटू 15.10 पर काम करने के लिए उपयोग करता था:

# my-playbook.yml
- name: python2
  hosts: test
  gather_facts: no
  pre_tasks:
    - raw: sudo apt-get -y install python-simplejson

$ ansible-playbook path/to/my-playbook.yml

एक नए ओवीएच एसएसडी पर उबंटू 16.04 के लिए, मुझे पायथन 2 पैकेज उपलब्ध होने से पहले अपग्रेड करना पड़ा।


जैसा कि अन्य ने कहा, यह पाइथन 2 गायब होने के कारण है। यहां अन्य उत्तर pre_tasks और gather_facts: no साथ एक समाधान प्रदान करते हैं gather_facts: no , हालांकि यदि आप ईसी 2 पर हैं और आप उत्तरदायी के साथ उदाहरण को स्पिन करते हैं तो आप user_data विकल्प का उपयोग कर सकते हैं:

- ec2:
    key_name: mykey
    instance_type: t2.micro
    image: ami-123456
    wait: yes
    group: webserver
    count: 3
    vpc_subnet_id: subnet-29e63245
    assign_public_ip: yes
    user_data: |
      #!/bin/bash
      apt-get update
      apt-get install -y python-simplejson
    register: ec2

तब लोग आम तौर पर इस तरह उपलब्ध होने के लिए एसएसएच की प्रतीक्षा करते हैं:

  - name: "Wait for the instances to boot and start ssh"
    wait_for:
      host: "{{item.public_ip}}"
      port: 22
      delay: 5
      timeout: 300
    with_items: "{{ ec2.tagged_instances }}"
    when: ec2|changed

हालांकि मुझे पता चला है कि यह हमेशा इतना लंबा नहीं होता है क्योंकि बूट प्रक्रिया में CloudInit को देर से निष्पादित किया जाता है, इसलिए एसएसएच उपलब्ध होने के बाद भी CloudInit स्थापित नहीं किया जा सकता है। इसलिए अगर इंस्टेंस अभी बनाया गया था तो मैंने एक विराम जोड़ा है:

  - name: "Wait for cloud init on first boot"
    pause: minutes=2
    when: ec2|changed

यह पूरी तरह से काम करेगा और एक लाभ के रूप में आप प्रत्येक रन पर पायथन 2 की जांच नहीं कर रहे हैं और बाद में तथ्यों को इकट्ठा करने के लिए आपको कोई कामकाज नहीं करना है।

मुझे यकीन है कि अन्य क्लाउड प्रदाता समान क्लाउडइनिट कार्यक्षमता प्रदान करते हैं, इसलिए आपके उपयोग के मामले के लिए अनुकूलित करें।


समाधान 1:

यदि आप Ansible >2.2.0 का उपयोग कर रहे हैं, तो आप ansible_python_interpreter कॉन्फ़िगरेशन विकल्प को /usr/bin/python3 सेट कर सकते हैं:

ansible my_ubuntu_host -m ping -e 'ansible_python_interpreter=/usr/bin/python3'

या अपनी सूची फ़ाइल में:

[ubuntu_hosts]
<xxx.xxx.xxx.xxx>

[ubuntu_hosts:vars]
ansible_python_interpreter=/usr/bin/python3

समाधान 2:

यदि आप Ansible <2.2.0 का उपयोग कर रहे हैं तो आप इन pre_tasks को अपनी प्लेबुक में जोड़ सकते हैं:

gather_facts: False
pre_tasks:
  - name: Install python for Ansible
    raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
    register: output
    changed_when: output.stdout != ""
    tags: always
  - setup: # aka gather_facts

हर किसी के उत्तरों को सारांशित करने के लिए, यहां संयुक्त सेटिंग्स हैं जो मेरे लिए काम करती हैं:

 - hosts: all
   become: true
   gather_facts: false

   # Ansible requires python2, which is not installed by default on Ubuntu Xenial
   pre_tasks:
     - raw: sudo apt-get -y install python-simplejson
     # action: setup will gather facts after python2 has been installed
     - action: setup

मेरे पास एक ही समस्या थी, जब तक मुझे एहसास नहीं हुआ कि आपको रिमोट होस्ट के साथ-साथ अपनी खुद की स्थानीय मशीन पर पायथन स्थापित करने की भी आवश्यकता है। अब यह काम कर रहा है!


जवाब देने के लिए आपको अजगर 2.7 की आवश्यकता है। उबंटू 16.04 पर, आप इसे इस कमांड के माध्यम से इंस्टॉल कर सकते हैं:

sudo apt-get install python-minimal

उसके बाद, मैं दौड़ सकता था

ansible-playbook -i inventories/staging playbook.yml

उबंटू 16.04 पर उत्तरदायी उपयोग करने के लिए कृपया और जांचें


उत्तर 2.2 में पाइथन 3 समर्थन का एक तकनीकी पूर्वावलोकन है। इसका लाभ उठाने के लिए (इसलिए आपको उबंटू 16.04 पर पायथन 2 स्थापित करने की आवश्यकता नहीं है), बस ansible_python_interpreter कॉन्फ़िगरेशन विकल्प को /usr/bin/python3 । यह आपकी सूची फ़ाइल में प्रति-होस्ट आधार पर किया जा सकता है:

[db]
123.123.123.123 ansible_python_interpreter=/usr/bin/python3

मैं लक्ष्य मशीन पर पायथन स्थापित करके एक ही समस्या को ठीक करने में सक्षम था यानी मशीन जिसे हम एसएसएच करना चाहते हैं। मैंने निम्नलिखित कमांड का इस्तेमाल किया था:

sudo apt-get install python-minimal

बहुत सारे जवाब .. पोस्ट करने के लिए धन्यवाद क्योंकि मैंने इस पृष्ठ से भी शुरुआत की है!

मैंने खुदाई की और कुछ उबंटू 14.04 एलटीएस के साथ ठोस था, उबंटू 15.04 एलटीएस ने नवीनतम python गिरा दिया है, और उबंटू 16.04 एलटीएस ने aptitude को कम किया है।

मैंने कोई apt कॉल करने से पहले अपने बूटस्ट्रैप में निम्न क्रिया डाली:

- name: "FIX: Ubuntu 16.04 LTS doesn't come with certain modules, required by ansible"
  raw: apt-get install python-minimal aptitude -y
  become: true
  become_user: root
  become_method: sudo

यदि आप कहीं और become हैं, तो इसे पट्टी करने के लिए स्वतंत्र महसूस करें।

सूत्रों का कहना है:


इस गिस्ट के अनुसार आप निम्नानुसार उबंटू 16.04 पर पायथन 2 स्थापित कर सकते हैं:

enter code here
gather_facts: False
pre_tasks:
  - raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
  - setup: # aka gather_facts

tasks:
  # etc. etc.