Я особисто знайшов 3 можливі рішення цієї проблеми, які добре працюють у різних ситуаціях:
Варіант 1 - встановлення ansible_python_interpreter: /usr/bin/python3
для хостів, які python3
встановлені за замовчуванням
Я думаю, що це найкращий метод вирішення проблеми, якщо у вас є спосіб згрупувати своїх хостів за тим, чи python3
встановлені вони за замовчуванням. Наскільки мені відомо, python3
він доступний у всіх версіях Ubuntu 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 - /usr/bin/python -> /usr/bin/python3
Використання Symlinkraw
Я не бачив цього рішення, запропонованого ким-небудь ще. Це не ідеально, але я думаю, що багато в чому перевершує варіант 2. Моя пропозиція - використовувати raw
для запуску команди оболонки для символьного посилання, /usr/bin/python -> /usr/bin/python3
якщо 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
не - він не перекриє Python 2, якщо він уже встановлений
- Не припускає
apt
, що встановлено
- Може працювати з усіма хостами без особливих помилок
- Супер швидкий порівняно з чим-небудь із
apt-get
Очевидно, якщо вам потрібен Python 2, встановлений на /usr/bin/python
, це рішення не працює, а варіант 2 кращий.
Висновок
- Я пропоную використовувати варіант 1 у всіх випадках, якщо можете.
- Я пропоную скористатися варіантом 3, якщо ваш інвентар дійсно великий / складний, і ви не можете легко згрупувати хости
python3
, що зробить варіант 1 набагато складнішим і схильним до помилок.
- Я пропоную лише варіант 2 над варіантом 3, якщо вам потрібен Python 2, встановлений на
/usr/bin/python
.
Джерела