Eu, pessoalmente, encontrei 3 soluções possíveis para esse problema que funcionam bem em diferentes situações:
Opção 1 - Configure ansible_python_interpreter: /usr/bin/python3
para hosts que foram python3
instalados por padrão
Eu acho que esse é o método superior para resolver o problema se você tiver uma maneira de agrupar seus hosts, independentemente de eles terem ou não sido python3
instalados por padrão. Tanto quanto sei, python3
está disponível em todas as versões 16.04 e posteriores do Ubuntu.
- Se todos os seus hosts tiverem definitivamente
python3
, você poderá adicionar a variável ao seu group_vars/all.yml
(ou equivalente):
# group_vars/all.yml
ansible_python_interpreter: /usr/bin/python3
- Se alguns de seus hosts não tiverem
python3
e você tiver uma maneira de marcá-los ao usar o inventário dinâmico (por exemplo, marcação da AWS ec2.py
), você poderá aplicar a variável a determinados hosts como este:
# group_vars/tag_OS_ubuntu1804.yml
ansible_python_interpreter: /usr/bin/python3
- Se você usa inventário estático e pode agrupar hosts com base no que eles têm
python3
, você pode fazer algo assim:
# inventory/hosts
[python2_hosts]
centos7_server
[python3_hosts]
u1804_server
[python3_hosts:vars]
ansible_python_interpreter=/usr/bin/python3
Eu gosto mais dessa opção porque ela não requer alterações no host remoto e apenas pequenas alterações nas variáveis, em oposição às opções 2 e 3, que exigem adições a todos os manuais.
Opção 2 - Instale o Python 2 usando raw
Esta opção requer colocar uma reprodução na parte superior de todos os playbooks gather_facts: false
usados raw
para instalar 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
é necessário se você planeja executar a peça em hosts que não possuem apt-get
instalado (por exemplo, qualquer coisa baseada em RHEL), caso contrário, eles ocorrerão na primeira reprodução.
Esta solução funciona, mas é a mais baixa da minha lista por alguns motivos:
- Precisa ir no topo de cada manual (em oposição à opção 1)
- Assume
apt
está no sistema e ignora erros (em oposição à opção 3)
apt-get
comandos são lentos (em oposição à opção 3)
Opção 3 - Symlink /usr/bin/python -> /usr/bin/python3
usandoraw
Eu não vi essa solução proposta por mais ninguém. Não é o ideal, mas acho que é superior à opção 2 de várias maneiras. Minha sugestão é usar raw
para executar um comando shell para ligar simbolicamente /usr/bin/python -> /usr/bin/python3
se python3
estiver no sistema e python
não estiver:
- 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
Essa solução é semelhante à opção 2, pois precisamos colocá-la no topo de todos os manuais, mas acho que é superior em alguns aspectos:
- Cria apenas o link simbólico no caso específico
python3
presente epython
não está - ele não substituirá o Python 2 se já estiver instalado
- Não assume
apt
está instalado
- Pode ser executado em todos os hosts sem nenhum tratamento especial de erros
- É super rápido comparado a qualquer coisa com
apt-get
Obviamente, se você precisar do Python 2 instalado em/usr/bin/python
, esta solução é proibida e a opção 2 é melhor.
Conclusão
- Sugiro usar a opção 1 em todos os casos, se puder.
- Sugiro usar a opção 3 se seu inventário for realmente grande / complexo e você não tiver como agrupar hosts facilmente
python3
, tornando a opção 1 muito mais difícil e propensa a erros.
- Eu só sugiro a opção 2 sobre a opção 3 se você precisar do Python 2 instalado em
/usr/bin/python
.
Fontes