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/python3
cho 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 python3
bằng cách mặc định chúng có được cài đặt hay không . Theo như tôi biết, python3
có 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ó
python3
và 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: false
sử 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: true
là 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-get
cà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
apt
là 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/python3
sử 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/python3
nếu python3
có 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ể
python3
có mặt và python
khô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