티스토리 뷰

728x90
반응형

본 포스팅에서는 Private 환경에서 python3로 ansible을 설치하는 방법에 대해 살펴보겠습니다.

기본 rhel repo를 사용하여 yum or apt-get package manager로 ansible을 설치하면 python2를 기반으로 설치하게 됩니다.

물론 인터넷 환경이 제공되는 상황에서는 손쉽게 pip upgrade로 원하는 library 버전을 업그레이드할 수 있지만, 폐쇄망 환경에서는 제한적인 것이 사실입니다.

앞선 포스팅에서 살펴보았던 python private registry 구축방법은 아래 포스팅을 참고하시기 바랍니다.

 

[pypi] python private registry 구축하기 (pip)

 

Python의 경우 앞선 여러 offline 환경에서 구성한 CI Server들과 다르게 어마어마한 library들을 자랑합니다.

대략 ansible에서 자주 사용하는 pypi.org/simple 하위 경로의 라이브러리만 보더라도..

이런 말도 안된는 라이브러리 들을 자랑하죠.. 왼쪽 스크롤바를 보시면 어느 정도 수준인지 알 수 있습니다.

이를 offline 환경으로 이관하는 것은 사실상 매우 힘들 과정이 될 것이고, 최신 버전으로 유지하는 것 역시 매우 힘든 과정이 될 것입니다.

따라서 python private registry의 경우 신규로 개발한 본인의 라이브러리를 관리하거나, 필요한 라이브러리 목록들에 대한 집합을 관리하는 용도로 사용하는 것이 일반적입니다.

 

문제의 발생

ansible-playbook을 이용하여 kubespray를 이용한 kubernetes를 구축할 때 아래와 같은 문제가 발생할 경우 대처 방법입니다.

TASK [etcd : Check_certs | Set 'sync_certs' to true] ****************************************************************************************************************************************
Tuesday 22 October 2019 02:55:13 -0400 (0:00:00.053) 0:02:25.222 *******
ok: [kubeworker] => {"ansible_facts": {"sync_certs": true}, "changed": false}
fatal: [kubemaster]: FAILED! => {"msg": "The conditional check 'gen_node_certs[inventory_hostname] or (not etcdcert_node.results[0].stat.exists|default(false)) or (not etcdcert_node.results[1].stat.exists|default(false)) or (etcdcert_node.results[1].stat.checksum|
default('') != etcdcert_master.files|selectattr(\"path\", \"equalto\", etcdcert_node.results[1].stat.path)|map(attribute=\"checksum\")|first|default(''))' failed. The error was: no test named 'equalto'\n\nThe error appears to be in
'/root/git_repo/kubespray/roles/etcd/tasks/check_certs.yml': line 57, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: \"Check_certs | Set 'sync_certs' to true\"\n ^ here\n"}
NO MORE HOSTS LEFT **************************************************************************************************************************************************************************

에러 메시지의 요지는 "The error was: no test named 'equalto'"로 jinja2.7 이하 버전을 사용할 경우 최신 kubespray github의 /root/git_repo/kubespray/roles/etcd/tasks/check_certs.yml에 포함되어 있는 equalto를 사용할 수 없어서 발생하는 에러입니다.

Jinja2.8 버전이상에서 사용가능한 Jinja2.equalto를 사용하기 위한 문제로 최신 rhel repository에서는 jinja2.7를 기반으로 ansible을 설치하여 문제가 발생하였습니다.

 

문제의 해결

이를 해결하는 방법은 여러가지로 접근이 가능하지만, Python3 기반의 pip3 install ansible을 사용하여 설치할 경우 매우 손쉽게 문제를 해결할 수 있습니다.
다만 python repository를 인터넷망에서 사용할 수 없는 폐쇄망 기반일 경우에는 다음과 같은 과정으로 문제를 해결해야 합니다.

본 환경은 pip3가 기본 설치되어 있다는 가정하에 진행되며, 설치가 되어 있지 않을 경우 yum install python3-pip package를 설치한 후 따라하기 바랍니다.

 

1. pip3 download ansible & pip3 install ansible-2.8.6.tar.gz

먼저 ansible을 설치합니다.

이때 pip3 repogitory를 통해 dependency check를 할 수 없어 다음과 같은 오류가 발생됩니다.

[root@nrson ansible]# pip3 install ansible-2.8.6.tar.gz
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Processing ./ansible-2.8.6.tar.gz
Collecting jinja2 (from ansible==2.8.6)
Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/jinja2/
Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/jinja2/
Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/jinja2/
Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/jinja2/
Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/jinja2/
Could not find a version that satisfies the requirement jinja2 (from ansible==2.8.6) (from versions: )
No matching distribution found for jinja2 (from ansible==2.8.6)
[root@nrson ansible]#

이는 pip3 package 내부에 Jinja2가 설치되어 있지 않아 외부 python repository에서 다운로드를 시도하지만 폐쇄망 환경이라 발생하는 문제입니다. 따라서 Jinja2를 먼저 설치를 진행합니다.

 

2. pip3 download jinja2 & pip3 install Jinja2-2.10.3.tar.gz

[root@nrson ansible]# pip3 install Jinja2-2.10.3.tar.gz
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Processing ./Jinja2-2.10.3.tar.gz
Collecting MarkupSafe>=0.23 (from Jinja2==2.10.3)
Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/markupsafe/
Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/markupsafe/
Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/markupsafe/
Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/markupsafe/
Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/markupsafe/
Could not find a version that satisfies the requirement MarkupSafe>=0.23 (from Jinja2==2.10.3) (from versions: )
No matching distribution found for MarkupSafe>=0.23 (from Jinja2==2.10.3)
[root@nrson ansible]#

Jinja2 역시 markupsafe에 dependency를 갖고 있어 이를 먼저 설치해야 한다.

 

3. pip3 download markupsafe & pip3 install MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl & pip3 install Jinja2-2.10.3.tar.gz

[root@nrson ansible]# pip3 install MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Processing ./MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl
Installing collected packages: MarkupSafe
Successfully installed MarkupSafe-1.1.1
[root@nrson ansible]#
[root@nrson ansible]# pip3 install Jinja2-2.10.3.tar.gz
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Processing ./Jinja2-2.10.3.tar.gz
Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib64/python3.6/site-packages (from Jinja2==2.10.3)
Installing collected packages: Jinja2
Running setup.py install for Jinja2 ... done
Successfully installed Jinja2-2.10.3
[root@nrson ansible]#

markupSafe는 별다른 dependency 없이 설치가 가능합니다. 설치가 완료되면 다시 jinja2를 설치합니다.

4. pip3 install ansible-2.8.6.tar.gz

[root@nrson ansible]# pip3 install ansible-2.8.6.tar.gz
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Processing ./ansible-2.8.6.tar.gz
Requirement already satisfied: jinja2 in /usr/local/lib/python3.6/site-packages (from ansible==2.8.6)
Requirement already satisfied: PyYAML in /usr/lib64/python3.6/site-packages (from ansible==2.8.6)
Collecting cryptography (from ansible==2.8.6)
Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/cryptography/
Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/cryptography/
Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/cryptography/
Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/cryptography/
Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/cryptography/
Could not find a version that satisfies the requirement cryptography (from ansible==2.8.6) (from versions: )
No matching distribution found for cryptography (from ansible==2.8.6)
[root@nrson ansible]#

다시 ansible을 설치하였지만 이번에는 cryptography에 대한 dependency가 발생되었습니다.

 

5. pip3 download cryptography & pip3 install cryptography-2.8-cp34-abi3-manylinux1_x86_64.whl

[root@nrson ansible]# pip3 install cryptography-2.8-cp34-abi3-manylinux1_x86_64.whl
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Processing ./cryptography-2.8-cp34-abi3-manylinux1_x86_64.whl
Requirement already satisfied: six>=1.4.1 in /usr/lib/python3.6/site-packages (from cryptography==2.8)
Collecting cffi!=1.11.3,>=1.8 (from cryptography==2.8)
Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/cffi/
Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/cffi/
Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/cffi/
Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/cffi/
Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno -2] 이름 혹은
서비스를 알 수 없습니다',)': /simple/cffi/
Could not find a version that satisfies the requirement cffi!=1.11.3,>=1.8 (from cryptography==2.8) (from versions: )
No matching distribution found for cffi!=1.11.3,>=1.8 (from cryptography==2.8)
[root@nrson ansible]#

이번에는... cffi에 대한 dependency가..

 

6. pip3 download cffi & pip3 install pycparser-2.19.tar.gz & pip3 install cffi-1.13.1-cp36-cp36m-manylinux1_x86_64.whl

[root@nrson ansible]# pip3 install pycparser-2.19.tar.gz
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Processing ./pycparser-2.19.tar.gz
Installing collected packages: pycparser
Running setup.py install for pycparser ... done
Successfully installed pycparser-2.19
[root@nrson ansible]# pip3 install cffi-1.13.1-cp36-cp36m-manylinux1_x86_64.whl
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Processing ./cffi-1.13.1-cp36-cp36m-manylinux1_x86_64.whl
Requirement already satisfied: pycparser in /usr/local/lib/python3.6/site-packages (from cffi==1.13.1)
Installing collected packages: cffi
Successfully installed cffi-1.13.1
[root@nrson ansible]#

 

7. pip3 install cryptography-2.8-cp34-abi3-manylinux1_x86_64.whl

[root@nrson ansible]# pip3 install cryptography-2.8-cp34-abi3-manylinux1_x86_64.whl
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Processing ./cryptography-2.8-cp34-abi3-manylinux1_x86_64.whl
Requirement already satisfied: six>=1.4.1 in /usr/lib/python3.6/site-packages (from cryptography==2.8)
Requirement already satisfied: cffi!=1.11.3,>=1.8 in /usr/local/lib64/python3.6/site-packages (from cryptography==2.8)
Requirement already satisfied: pycparser in /usr/local/lib/python3.6/site-packages (from cffi!=1.11.3,>=1.8->cryptography==2.8)
Installing collected packages: cryptography
Successfully installed cryptography-2.8
[root@nrson ansible]# 

 

8. pip3 install ansible-2.8.6.tar.gz

자 드디어 다시 ansible을 설치합니다.

[root@nrson ansible]# pip3 install ansible-2.8.6.tar.gz
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Processing ./ansible-2.8.6.tar.gz
Requirement already satisfied: jinja2 in /usr/local/lib/python3.6/site-packages (from ansible==2.8.6)
Requirement already satisfied: PyYAML in /usr/lib64/python3.6/site-packages (from ansible==2.8.6)
Requirement already satisfied: cryptography in /usr/local/lib64/python3.6/site-packages (from ansible==2.8.6)
Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib64/python3.6/site-packages (from jinja2->ansible==2.8.6)
Requirement already satisfied: cffi!=1.11.3,>=1.8 in /usr/local/lib64/python3.6/site-packages (from cryptography->ansible==2.8.6)
Requirement already satisfied: six>=1.4.1 in /usr/lib/python3.6/site-packages (from cryptography->ansible==2.8.6)
Requirement already satisfied: pycparser in /usr/local/lib/python3.6/site-packages (from cffi!=1.11.3,>=1.8->cryptography->ansible==2.8.6)
Installing collected packages: ansible
Running setup.py install for ansible ... done
Successfully installed ansible-2.8.6
[root@nrson ansible]#

정상적으로 ansible-2.8.6이 python3 버전 기반으로 설치 된 것을 확인할 수 있습니다.

 

정리

복잡해 보이지만 이를 정리하면 다음과 같습니다.
사실상 순서를 살펴보자면,


a) pip3 download markupsafe & pip3 install MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl
b) pip3 download jinja2 & pip3 install Jinja2-2.10.3.tar.gz
c) pip3 download cffi & pip3 install pycparser-2.19.tar.gz & pip3 install cffi-1.13.1-cp36-cp36m-manylinux1_x86_64.whl
d) pip3 install cryptography-2.8-cp34-abi3-manylinux1_x86_64.whl
e) pip3 install ansible-2.8.6.tar.gz


5스텝의 총 6개의 python package가 디펜던시를 이루고 있습니다.
물론.. 인터넷이 되는 환경에서는 자동으로 디펜던시를 확인하고 pip에서 직접 설치를 진행해 준다는 사실.. 명심해야합니다. 굳이 이럴 필요가 없다는 것이죠..

 

ansible 상태 확인

마지막으로 살펴볼 내용은 바로 아래와 같이 디펜던시를 갖고 기동된 것을 확인할 수 있으며,

[root@nrson ansible]# ansible --version
ansible 2.8.6
config file = None
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.6.8 (default, Jun 11 2019, 15:15:01) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
[root@nrson ansible]#

을 통해 python3로 기동된 것을 확인할 수 있습니다. 이를 통해

[root@nrson ansible]# pip3 show jinja2
Name: Jinja2
Version: 2.10.3
Summary: A very fast and expressive template engine.
Home-page: https://palletsprojects.com/p/jinja/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
License: BSD-3-Clause
Location: /usr/local/lib/python3.6/site-packages
Requires: MarkupSafe
[root@nrson ansible]#

pip3 package manage가 사용중인 jinja2 버전은 2.10.3으로 2.8 이상 버전을 사용하여 equalto를 사용할 수 있는 환경이 구성되었습니다.

이 과정은 단순히 ansible을 설치하는 과정에 한정되어 설명하였지만, 이와 비슷하게 pip repository에 접근이 불가능한 경우 활용할 수 있을 것입니다.

The error was: no test named 'equal
728x90
반응형