Cá nhân tôi đã tìm thấy 3 giải pháp khả thi cho vấn đề này hoạt động tốt trong các tình huống khác nhau:
Tùy chọn 1 - Đặt ansible_python_interpreter: /usr/bin/python3cho các máy chủ đã python3được cài đặt theo mặc định
Tôi nghĩ rằng đây là phương pháp ưu việt để giải quyết vấn đề nếu bạn có cách để nhóm các máy chủ của mình python3bằng cách mặc định chúng có được cài đặt hay không . Theo như tôi biết, python3có sẵn trên tất cả các phiên bản Ubuntu 16.04 trở lên.
- Nếu tất cả các máy chủ của bạn chắc chắn có
python3, bạn có thể thêm biến vào group_vars/all.yml(hoặc tương đương):
# group_vars/all.yml
ansible_python_interpreter: /usr/bin/python3
- Nếu một số máy chủ của bạn không có
python3và bạn có cách gắn thẻ chúng khi sử dụng khoảng không quảng cáo động (ví dụ: gắn thẻ AWS cho ec2.py), bạn có thể áp dụng biến cho một số máy chủ nhất định như sau:
# group_vars/tag_OS_ubuntu1804.yml
ansible_python_interpreter: /usr/bin/python3
- Nếu bạn sử dụng khoảng không quảng cáo tĩnh và có thể nhóm các máy chủ dựa trên việc chúng có hay không
python3, bạn có thể làm một cái gì đó như thế này:
# inventory/hosts
[python2_hosts]
centos7_server
[python3_hosts]
u1804_server
[python3_hosts:vars]
ansible_python_interpreter=/usr/bin/python3
Tôi thích tùy chọn này nhất vì nó không yêu cầu thay đổi trên máy chủ từ xa và chỉ thay đổi nhỏ đối với các biến, trái ngược với tùy chọn 2 và 3, yêu cầu bổ sung cho mọi playbook.
Tùy chọn 2 - Cài đặt Python 2 bằng cách sử dụng raw
Tùy chọn này yêu cầu đặt một phát ở đầu mỗi playbook có gather_facts: falsesử dụng rawđể cài đặt 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: truelà bắt buộc nếu bạn có kế hoạch chạy phát trên các máy chủ chưa apt-getcài đặt (ví dụ: mọi thứ dựa trên RHEL), nếu không chúng sẽ bị lỗi trong lần phát đầu tiên.
Giải pháp này hoạt động, nhưng là thấp nhất trong danh sách của tôi vì một vài lý do:
- Cần phải đi đầu mỗi cuốn sách (trái ngược với tùy chọn 1)
- Giả định
aptlà trên hệ thống và bỏ qua lỗi (trái ngược với tùy chọn 3)
apt-get các lệnh chậm (trái ngược với tùy chọn 3)
Tùy chọn 3 - Symlink /usr/bin/python -> /usr/bin/python3sử dụngraw
Tôi chưa thấy giải pháp này được đề xuất bởi bất cứ ai khác. Điều đó không lý tưởng, nhưng tôi nghĩ nó vượt trội so với lựa chọn 2 theo nhiều cách. Đề nghị của tôi là sử dụng rawđể chạy lệnh shell để symlink /usr/bin/python -> /usr/bin/python3nếu python3có trên hệ thống và python không:
- 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
Giải pháp này tương tự như tùy chọn 2 ở chỗ chúng ta cần đặt nó ở đầu mỗi cuốn sách, nhưng tôi nghĩ nó vượt trội theo một số cách:
- Chỉ tạo liên kết tượng trưng trong trường hợp cụ thể
python3có mặt và pythonkhông - nó sẽ không ghi đè Python 2 nếu nó đã được cài đặt
- Không giả định
aptđược cài đặt
- Có thể chạy với tất cả các máy chủ mà không cần xử lý lỗi đặc biệt
- Là siêu nhanh so với bất cứ điều gì với
apt-get
Rõ ràng nếu bạn cần cài đặt Python 2 tại /usr/bin/python, giải pháp này là không nên và tùy chọn 2 là tốt hơn.
Phần kết luận
- Tôi đề nghị sử dụng tùy chọn 1 trong mọi trường hợp nếu bạn có thể.
- Tôi khuyên bạn nên sử dụng tùy chọn 3 nếu kho lưu trữ của bạn thực sự lớn / phức tạp và bạn không có cách nào để dễ dàng nhóm các máy chủ lưu trữ
python3, khiến tùy chọn 1 trở nên khó khăn và dễ bị lỗi hơn nhiều.
- Tôi chỉ đề xuất tùy chọn 2 trên tùy chọn 3 nếu bạn cần cài đặt Python 2 tại
/usr/bin/python.
Nguồn