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/python3para hosts que foram python3instalados 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 python3instalados por padrão. Tanto quanto sei, python3está 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
python3e 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: falseusados rawpara 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 rawpara executar um comando shell para ligar simbolicamente /usr/bin/python -> /usr/bin/python3se python3estiver 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
python3presente 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