실습 Ansible와 Python
페이지 정보
본문
Ansible와 Python 3의 통합 개발 가이드
이 게시글에서는 Ansible과 Python 3 통합을 위한 개발 문서를 살펴보고, 예시만 안내드리는 글입니다.
1. Python 2와 Python 3에서의 Ansible 코드 호환성
Ansible은 다양한 운영 환경을 지원하기 위해 Python 2와 Python 3에서 모두 작동할 수 있는 단일 코드 기반을 유지하고 있습니다. Ansible 개발자는 Python 버전 간 호환성을 위해 몇 가지 규칙을 준수해야 하며, 이 규칙은 Ansible 코드의 세 가지 주요 타입에 모두 적용됩니다.
1.1 컨트롤러 코드
컨트롤러 코드란 Ansible 명령을 실행하는 시스템에서 구동되는 코드입니다.
1.2 모듈 코드
모듈은 Ansible에서 관리하는 시스템에 전달되어 실행되는 코드로, 다양한 환경에서 작동할 수 있도록 설계됩니다.
1.3 모듈 유틸리티 코드
공유되는 모듈 유틸리티 코드는 모듈이 작업을 수행할 때 필요한 기능을 제공하며, 컨트롤러에서도 사용될 수 있습니다.
2. Python 2와 Python 3 최소 지원 버전
컨트롤러에서는 Python 3.5 이상과 Python 2.7 이상을 지원합니다. 모듈 측에서는 Python 3.5 이상과 Python 2.6 이상을 지원하며, Python 2.4와 2.5에 대한 지원은 Ansible 버전 2.4에서 중단되었습니다.
2.1 Python 3의 최소 버전 선택 이유
Python 3.5는 Ubuntu 16.04 LTS 등에서 기본 Python으로 채택되었기 때문에 최소 버전으로 선정되었습니다.
3. Python 2와 Python 3 간의 문자열 처리 차이
Python 2와 Python 3는 문자열을 처리하는 방식에 차이가 있습니다. Python 2에서는 byte와 unicode가 혼용될 수 있지만, Python 3에서는 byte와 str 타입이 분리되어 강제적으로 구분됩니다.
3.1 컨트롤러 코드에서의 문자열 처리: 유니코드 샌드위치
컨트롤러 코드에서 사용하는 '유니코드 샌드위치' 전략은 외부 입출력에서 byte로 변환하고 내부에서는 문자열을 유지하는 방법입니다. 파일을 읽을 때는 byte를 읽고 텍스트로 변환하는 방식입니다.
```python
from ansible.module_utils._text import to_text
with open('filename.txt', 'rb') as my_file:
b_data = my_file.read()
data = to_text(b_data, errors='surrogate_or_strict')
```
해당 명령을 실행할 시 파일의 내용을 텍스트 형태로 변환하여 처리할 수 있습니다.
3.2 모듈 코드에서의 문자열 처리: 네이티브 스트링
모듈 코드에서는 네이티브 스트링을 사용하여, Python 2에서는 byte로, Python 3에서는 str 타입으로 간주하도록 작성합니다.
```python
filename = u'/var/tmp/파일이름.txt'
b_filename = to_bytes(filename)
with open(b_filename) as f:
data = f.read()
```
해당 명령은 파일명을 byte로 변환하여 파일을 읽어들입니다.
4. Python 2와 Python 3 호환을 위한 코드 작성 팁
Python 2와 Python 3 모두에서 동작하는 코드를 작성하기 위해 몇 가지 공통적인 팁을 소개합니다.
4.1 Python 3 호환성을 위한 전처리 구문 추가
모든 Python 파일의 상단에 아래 코드를 추가하여 Python 2와 Python 3에서의 호환성을 높입니다.
```python
# Python 3 호환성을 위한 설정
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
```
해당 명령은 Python 2에서 Python 3과 유사한 동작을 구현해 줍니다.
4.2 예외 처리에 'as' 키워드 사용
Python 2와 3에서 모두 호환되도록 예외 처리는 'as' 키워드를 사용하여 작성합니다.
```python
try:
a = 2/0
except ValueError as e:
module.fail_json(msg="오류 발생: %s" % e)
```
해당 명령을 실행할 시 오류 발생 시 유연하게 예외를 처리할 수 있습니다.
4.3 바이트 문자열 앞에 'b_' 접두사 추가
Python 3에서는 바이트 문자열을 명확히 하기 위해 접두사 'b_'를 사용하여 작성합니다.
```python
filename = u'/var/tmp/파일이름.txt'
b_filename = to_bytes(filename)
```
해당 명령은 문자열을 명확하게 구분하여 Python 3에서의 오류를 방지합니다.
4.4 문자열 포맷팅
Python 2.6 호환성을 위해, 문자열 포맷팅 시 str.format() 방식과 숫자 인덱스를 사용하여 Python 2.6과 Python 3 양쪽에서 호환되도록 합니다.
```python
new_string = "사용자 {0}, {1}에 오신 것을 환영합니다.".format(username, location)
```
위 코드는 Python 2.6 이상의 모든 버전에서 호환됩니다.
5. Python 3에서의 Ansible 모듈 테스트
Ansible 모듈은 Python 3에서 정상 작동하도록 많은 테스트가 필요합니다. 모의 객체를 활용하여 Python 3 환경에서 코드가 예상대로 작동하는지 점검할 수 있습니다.
5.1 모듈 테스트 환경 설정
Ansible의 테스트 페이지를 참고하여 Python 3 환경에서의 모듈 테스트를 설정하고 실행할 수 있습니다.
관련링크
- 이전글Ansible - 개발 디버깅 24.11.08
- 다음글Ansible - 모듈 개발 시작하기 24.10.11
댓글목록
등록된 댓글이 없습니다.