[ansible] / bin / sh : 1 : / usr / bin / python :에서 찾을 수 없음

이전에 본 적이없는 오류가 발생했습니다. 명령과 오류는 다음과 같습니다.

$ 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

그리고 hosts 파일은 다음과 같습니다.

[api]
104.55.47.224

역할 섹션을 제거 할 수 있으며 첫 번째 작업으로 만들지 않고 대신 행으로 만 만듭니다 /bin/sh: 1: /usr/bin/python: not found. 여기서 무슨 일이 일어날 수 있습니까?


참고 : IP 주소를 핑 (ping)하는 사람이 있고 응답을받지 못하는 경우 코드 붙여 넣기 이후에 IP 주소를 변경했음을 알아야합니다.

EDIT
python이 로컬로 설치되었지만 문제는 Ubuntu 15.04를 실행하는 원격 컴퓨터에 설치되지 않았다는 것입니다.



답변

우분투 15.10 서버에서 파이썬 3.4.3 과 함께 제공 되며 ansible에는 Python 2가 필요 하기 때문에이 오류가 발생 했습니다 .

이것이 나의 provision.yml모습입니다 :

- hosts: my_app
  sudo: yes
  remote_user: root
  gather_facts: no
  pre_tasks:
    - name: 'install python2'
      raw: sudo apt-get -y install python

  tasks:
    - name: 'ensure user {{ project_name }} exists'
      user: name={{ project_name }} state=present
  • apt-get과 함께 -y (모든 질문에 예) 옵션을 잊지 마십시오 (또는 원시 모듈이 자동으로 멈춤).

  • gather_facts: no 줄도 중요합니다 (파이썬없이 사실을 수집 할 수 없기 때문에)


답변

Ansible 2.2에는 Python 3 지원의 기술 미리보기가 있습니다. 이것을 이용하려면 (우분투 16.04에 Python 2를 설치할 필요가 없습니다), ansible_python_interpreterconfig 옵션을로 설정하십시오 /usr/bin/python3. 인벤토리 파일에서 호스트별로 수행 할 수 있습니다.

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


답변

해결책 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

업데이트를
사용하면 ansible 2.8.x걱정할 필요가 없습니다. 컨트롤러 및 대상 시스템 모두에서 python> 3.5 이상에서 즉시 작동합니다.


답변

raw 모듈 을 사용하여 원격 호스트에 Python을 설치할 수 있습니다 .

- raw: sudo apt-get install python-simplejson


답변

다른 사람의 답변을 요약하면 다음과 같이 결합 된 설정이 있습니다.

 - 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


답변

다른 상황에서 잘 작동하는이 문제에 대한 3 가지 가능한 해결책을 개인적으로 발견했습니다.

옵션 1- 기본적으로 설치된 ansible_python_interpreter: /usr/bin/python3호스트 python3에 설정

python3기본적으로 설치 되었는지 여부에 따라 호스트를 그룹화하는 방법이 있다면 이것이 문제를 해결하기위한 최상의 방법이라고 생각합니다 . 내가 아는 python3한 모든 우분투 릴리스 16.04 이상에서 사용할 수 있습니다.

  • 모든 호스트에 확실히가 있다면 python3변수를 group_vars/all.yml(또는 동등한) 변수에 추가 할 수 있습니다 .
# group_vars/all.yml

ansible_python_interpreter: /usr/bin/python3
  • 일부 호스트가없고 python3동적 인벤토리를 사용할 때 태그를 지정할 수있는 방법이있는 경우 (예 :에 AWS 태깅 ec2.py) 다음과 같이 특정 호스트에 변수를 적용 할 수 있습니다.
# group_vars/tag_OS_ubuntu1804.yml

ansible_python_interpreter: /usr/bin/python3
  • 정적 인벤토리를 사용하고 호스트 여부에 따라 호스트를 그룹화 python3할 수있는 경우 다음과 같이 할 수 있습니다.
# inventory/hosts

[python2_hosts]
centos7_server

[python3_hosts]
u1804_server

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

모든 플레이 북에 추가해야하는 옵션 2 및 3과 달리 원격 호스트를 변경할 필요가없고 변수를 약간만 변경하기 때문에이 옵션이 가장 좋습니다.

옵션 2-다음을 사용하여 Python 2 설치 raw

이 옵션 gather_facts: false을 사용 raw하려면 설치 하는 데 사용 하는 모든 플레이 북의 맨 위에 플레이 해야합니다 python.

- name: install python2 on all instances
  hosts: "*"
  gather_facts: false
  tasks:
    - name: run apt-get update and install python
      raw: "{{ item }}"
      loop:
        - sudo apt-get update
        - sudo apt-get -y install python
      become: true
      ignore_errors: true

ignore_errors: trueapt-get설치 되지 않은 호스트 (예 : RHEL 기반) 에서 플레이를 실행하려는 경우 첫 번째 플레이에서 오류가 발생합니다.

이 솔루션은 작동하지만 몇 가지 이유로 내 목록에서 가장 낮습니다.

  1. 옵션 1과 달리 모든 플레이 북 의 상단에 있어야합니다.
  2. apt시스템에 있고 오류를 무시한다고 가정 합니다 (옵션 3과 반대)
  3. apt-get 명령이 느립니다 (옵션 3과 반대)

옵션 3-Symlink를 /usr/bin/python -> /usr/bin/python3사용하는raw

다른 사람이 제안한이 솔루션을 보지 못했습니다. 이상적이지는 않지만 옵션 2보다 많은 방법이 우수하다고 생각합니다. 내 제안은 시스템에 있고raw 쉘 이 아닌 /usr/bin/python -> /usr/bin/python3경우 쉘 명령을 실행하여 symlink 하는 것 python3입니다 . python

- name: symlink /usr/bin/python -> /usr/bin/python3
  hosts: "*"
  gather_facts: false
  tasks:
    - name: symlink /usr/bin/python -> /usr/bin/python3
      raw: |
        if [ -f /usr/bin/python3 ] && [ ! -f /usr/bin/python ]; then
          ln --symbolic /usr/bin/python3 /usr/bin/python;
        fi
      become: true

이 솔루션은 모든 플레이 북의 맨 위에 배치해야한다는 점에서 옵션 2와 유사하지만 몇 가지면에서 우수하다고 생각합니다.

  • python3존재하고 python존재하지 않는 특정 경우에만 심볼릭 링크를 만듭니다. 파이썬 2가 이미 설치되어 있으면 재정의하지 않습니다.
  • apt설치되어 있지 않습니다
  • 특별한 오류 처리없이 모든 호스트에 대해 실행할 수 있습니다
  • 무엇보다 초고속입니다 apt-get

에 Python 2를 설치 해야하는/usr/bin/python 경우이 솔루션은 필요 없으며 옵션 2가 더 좋습니다.

결론

  • 가능 하다면 모든 경우에 옵션 1 을 사용하는 것이 좋습니다 .
  • 내가 사용하는 것이 좋습니다 옵션 3을 인벤토리 정말 큰 / 복잡한 경우에 당신은에 쉽게 그룹 호스트에 방법이 없습니다 python3만들기, 옵션 1을 훨씬 더 어렵고 오류가 발생하기 쉬운입니다.
  • 에 Python 2를 설치 해야하는 경우 옵션 3 보다 옵션 2 만 제안 합니다./usr/bin/python

출처


답변

Ansible을 실행하려면 Python 2.7이 필요합니다. Ubuntu 16.04에서 다음 명령을 통해 설치할 수 있습니다.

sudo apt-get install python-minimal

그 후, 나는 달릴 수 있었다

ansible-playbook -i inventories/staging playbook.yml

성공적으로 실행

Ubuntu 16.04 에서 ansible 사용 에서 자세한 내용을 확인하십시오