Я лично нашел 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
использование символической ссылкиraw
Я не видел такого решения, предложенного кем-либо еще. Это не идеал, но я думаю, что он превосходит вариант 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
.
источники