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


187

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

$ 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를 실행하는 원격 컴퓨터에 설치되지 않았다는 것입니다.

답변:


171

우분투 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 줄도 중요합니다 (파이썬없이 사실을 수집 할 수 없기 때문에)


12
따라서 후속 역할은 사실을 사용할 수 없습니다. 사실을 다시 수집 할 수있는 방법이 있습니까? aha, stackoverflow.com/questions/31054453/…
stephen

16
'gather_facts : no'줄 중요합니다.
rcreswick

6
@ surfer190 위대한 발견! 또한 추가 발견 action: setup최종 pre_task으로도 좋은 :) 일
mrooney을

1
@ surfer190 EC2를 사용하는 경우 여기에 내 대답을 참조하십시오. CloudInit을 사용하여 python2를 설치하여 평상시와 같이 수집 사실을 사용할 수 있습니다.
Miroslav

1
누구나 궁금해하는 경우 Python 2를 설치하기 위해 작업을 실행할 필요 는 없습니다 . 정기적으로 작동합니다. 그러나 다른 모듈 과 함께 Ansible 모듈 을 호출하여이를 배치하면 호스트에 할당 된 모든 역할에서 팩트를 사용할 수 있습니다. rawpre_taskstaskspre_taskssetup
Kenny Evitt

125

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

이 변수에 / usr / bin / python을 추가하려고 시도했지만 작동하지 않았습니다. 추가 python3 대신 일이 문제가 해결되었다
깊은 LF

98

해결책 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 이상에서 즉시 작동합니다.


태그를 사용하여 플레이 북을 실행하는 경우 항상 설정 작업에 태그를 추가해야합니다. 그렇지 않으면 태그를 사용할 때 사실이 수집되지 않습니다.
Ionut Bajescu

16
나는 가지고 ansible 2.3.0.0있고 그것이 밖으로 작동하지 않습니다. OP에서 게시 한 것과 동일한 오류입니다.
Coder

명확하지 않은 경우 포함 된 변수가 아닌 호스트 인벤토리 파일에 추가해야합니다. 즉, 호스트 주소 / 이름과 동일한 인벤토리 파일에 있습니다.
Shawn Mehan

32

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

- raw: sudo apt-get install python-simplejson

11
이것이 역할의 작업 전에, 메타 파일의 종속성 전에 호출되도록하려면 플레이 북에 다음과 같이 추가하십시오. pre_tasks: - raw: sudo apt-get install python-simplejson
Laurens Rietveld

5
플레이 북에서 gather_facts 비활성화 해야합니다. 그렇지 않으면 raw 명령을 실행하기 전에 실패합니다. (gather_facts : no)
rcreswick

@ rcreswick 그것은 내 문제 였고 솔루션은 나를 위해 일했습니다. 정말 고마워. 기본 .yml 파일 (setup-ansible.yml)에 "gather_facts : no"줄을 입력하고 다음 명령으로 플레이 북을 실행했습니다. "ansible-playbook -i hosts setup-ansible.yml --flush-cache -vvvvvv -kK ". 기본 우분투 설치에는 "sudo"를하기 위해 암호가 필요하기 때문에 ansible-playbook과 함께 "-kK"옵션을 사용했습니다.
알리 Yousefi Sabzevar

왜 pytghon이 아닌 simplejson을 설치하고 파이썬 설치에 대해 이야기합니까?
Henning

@Henning python-simplejson은 Python으로 작성되었으므로 Python이 필요합니다. simplejson은 대부분의 Ansible 코어 모듈에 대한 요구 사항입니다. / 를 python-simplejson통해 설치 하면 파이썬도 설치되므로 모든 기본적인 Ansible 의존성을 apt-getyum
다루게됩니다

18

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

 - 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

14

다른 상황에서 잘 작동하는이 문제에 대한 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

출처


13

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

sudo apt-get install python-minimal

그 후, 나는 달릴 수 있었다

ansible-playbook -i inventories/staging playbook.yml

성공적으로 실행

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


12

신선한 디지털 오션 드롭 릿에서 우분투 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

새로운 OVH SSD의 우분투 16.04의 경우 python2 패키지를 사용하기 전에 업그레이드를 시작해야했습니다.


8

실제로는 단일 플레이 북에 여러 개의 재생이 가능하다는 사실을 알았으므로 이제 모든 호스트에서 실행되는 "종속성 프로비저닝"재생과 특정 호스트에 대한 다른 재생이 설정에 포함됩니다. 더 이상은 없습니다 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
  # ....

6

다른 사람들이 말했듯이, 이것은 python2가 없기 때문입니다. 여기에있는 다른 답변은 pre_tasks및에 대한 해결 방법을 제공 gather_facts: no하지만 EC2에 있고 인스턴스를 ansible로 스핀하면 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

그런 다음 사람들은 일반적으로 ssh가 다음과 같이 사용 가능할 때까지 기다립니다.

  - 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 이 상당히 늦게 실행되어 ssh를 사용할 수있는 직후에 python2가 여전히 설치되지 않을 수 있으므로 이것이 충분하지 않다는 것을 알았습니다 . 따라서 인스턴스가 방금 생성 된 경우 일시 중지를 추가했습니다.

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

이것은 작업을 완벽하게 수행하며 모든 실행에서 python2를 확인하지 않는 이점으로 나중에 사실을 수집하기 위해 해결 방법을 수행 할 필요가 없습니다.

다른 클라우드 제공 업체도 비슷한 CloudInit 기능을 제공하므로 사용 사례에 맞게 조정하십시오.


3

Packer를 사용하는 사람들은 아래 솔루션이 도움이 될 수 있습니다.

패커의 제공자를 사용한다고 가정 해 봅시다. 설정은 아래와 같습니다.

먼저 쉘 프로 비져를 사용하여 파이썬을 설치 한 다음 아래와 같이 ansible_python_intepreter 옵션을 구성 할 수 있습니다

"provisioners": [
    {
      "type": "shell",
      "inline": [
        "apk update && apk add --no-cache python python-dev ansible bash"
      ]
    },
    {
      "type": "ansible-local",
      "playbook_file": "playbooks/your-play-book.yml",
      "playbook_dir": "playbooks",
      "extra_arguments": [
        "-e",
        "'ansible_python_interpreter=/usr/bin/python3'",
        "-vvv"
      ]
    },

2

기본적으로 Ansible에는 Python 2가 필요 하지만 Ansible 2.2 이상은 Python 3 에서도 작동 합니다.

그래서 중 하나를 사용하여 파이썬 2를 설치 raw모듈을 , 예를 들어,

ansible localhost --sudo -m raw -a "yum install -y python2 python-simplejson"

인벤토리 파일에서 다음과 같이 ansible_python_interpreter변수 를 설정 하십시오 .

[local]
localhost ansible_python_interpreter="env python3"

Docker의 경우 다음 줄을 추가 할 수 있습니다.

RUN printf '[local]\r\nlocalhost ansible_python_interpreter="env python3"\r\n' > /etc/ansible/hosts

또는 다음과 같이 실행하십시오.

ansible-playbook /ansible/provision.yml -e 'ansible_python_interpreter=/usr/bin/python3' -c local

1

이 요점 에 따르면 다음과 같이 Ubuntu 16.04에 Python2를 설치할 수 있습니다.

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.

1

답변이 많이 있습니다.이 페이지에서 시작한 게시물에 감사드립니다.

나는 약간의 파기를했고 우분투 14.04LTS로 견고했고 우분투 15.04LTS는 최신을 떨어 뜨린 것으로 보 python였으며 우분투 16.04LTS는 떨어졌다 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다른 곳에서 관리하는 경우 자유롭게 제거하십시오.

출처 :


1

대상 머신, 즉 SSH하려는 머신에 Python을 설치하여 동일한 문제를 해결할 수있었습니다. 나는 다음 명령을 사용했다 :

sudo apt-get install python-minimal

1

@Miroslav, 올바른 방향으로 나를 가리켜 주셔서 감사합니다. 내가 사용 user_dataec2_instance너무 모듈은 치료처럼 작동합니다.

- name: Creating single EC2 instance 
  ec2_instance:
    region: "{{ aws_region }}"
    key_name: "{{ aws_ec2_key_pair }}"
    name: "some-cool-name"
    instance_type: t1.micro
    image_id: ami-d38a4ab1
    security_group: sg-123456
    vpc_subnet_id: sn-678901234
    network:
        assign_public_ip: no
    volumes:
      - device_name: /dev/sda1
        ebs:
          volume_type: gp2
          volume_size: 15
    user_data: |
      #!/bin/bash
      #
      apt update
      apt install -y python-simplejson              
    termination_protection: yes
    wait: yes     

1

Ubuntu 18.04에 python3을 첫 번째 우선 순위로 사용하도록 표시 할 수 있습니다 /usr/bin/python.

- hosts: all
  become: true
  pre_tasks:
    - raw: update-alternatives --install /usr/bin/python python /usr/bin/python3 1

0

원격 호스트뿐만 아니라 로컬 컴퓨터에도 파이썬을 설치해야한다는 것을 알기 전까지는 같은 문제가있었습니다. 이제 작동합니다!


-2

우리는 이것에 부딪칩니다.

우리는 우분투 16.04를 방랑자에 배치하므로 방랑자를 사용하지 않으면 내 의견은 의미가 없습니다.

우리는 다음과 같은 방랑 플러그인 (트리거, 쉘 커맨더)을 설치했으며 티오 오스 플러그인이없는 머신에 파이썬 2.7.6을 설치하고 ansible 배포 후

마지막 테스트였습니다. 그렇지 않으면 Vagrant 파일의 쉘 명령 에이 설치를 포함하려고했습니다.

그것이 누군가를 도울 수 있기를 바랍니다.


2
Ansible을 사용하는 경우 아래 Ansible 솔루션이 올바른 해결책입니다. Vagrant가 일부 플러그인의 부작용으로 실수로 설치하기를 희망하면 문제를 묻는 것처럼 보입니다.
Paul Becotte 2016 년

실례하지만 파이썬이 없다면 어떻게 할 수 있습니까? 솔루션을 시도했지만 작업 설정에서 실패하므로 사전 작업 전에 이벤트가 발생합니다. vagrant 파일의 vagrant shell 명령은 그것을 수행하는 가장 좋은 방법입니다 (물론 경우). 내 dev에 설치 한 vagrant plugin이 작업을 수행한다는 것을 알았습니다. 나는 플러그인에 의존하지 않지만 방랑 파일에 의존하고 있는데, 방금 플러그인과 함께 작동하지만 방랑 파일은 더 나은 선택입니다 (자동화를 위해) 수동으로 각 작업을 할 필요가 없기 때문에 파괴 / 제공
wadoo

1
해당 코드 블록을 그대로 복사했으며 답변을 게시하기 직전에 설명한대로 정확하게 작동했습니다. gather_facts: no파이썬이 필요한 줄을 넣지 않았을 것입니다 . 다른 가능성은 호스트 컴퓨터에서도 파이썬이 필요하지만 프로세스 초기에 오류가 발생했을 것입니다.
Paul Becotte 2016 년

나는 붙여 넣기도 복사했지만 직장에서 금요일 가까이했다. 내가 gather_fact 부분을 가져간 경우 나는 정직하게 기억할 수 없다. 어쨌든 다른 컴퓨터에서 오늘 아침에 다시 가져 왔을 때 방금 명령을 vagrantfile에 넣었습니다. 실제 서버에서 프로덕션에 갈 때까지는 충분합니다. 나는 신선한 마음으로 (금요일 저녁이 아닌) 답으로 다시 테스트 할 것이다;)
wadoo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.