이전에 본 적이없는 오류가 발생했습니다. 명령과 오류는 다음과 같습니다.
$ 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_interpreter
config 옵션을로 설정하십시오 /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: true
apt-get
설치 되지 않은 호스트 (예 : RHEL 기반) 에서 플레이를 실행하려는 경우 첫 번째 플레이에서 오류가 발생합니다.
이 솔루션은 작동하지만 몇 가지 이유로 내 목록에서 가장 낮습니다.
- 옵션 1과 달리 모든 플레이 북 의 상단에 있어야합니다.
apt
시스템에 있고 오류를 무시한다고 가정 합니다 (옵션 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 사용 에서 자세한 내용을 확인하십시오