Kişisel olarak bu soruna farklı durumlarda iyi çalışan 3 olası çözüm buldum:
Seçenek 1 - Varsayılan olarak yüklenmiş ansible_python_interpreter: /usr/bin/python3
ana bilgisayarlar için ayarlapython3
Bence bu, ana bilgisayarlarınızı python3
varsayılan olarak yüklenmiş olup olmadıklarına göre gruplandırmanın bir yolu varsa, sorunu çözmek için üstün bir yöntemdir . Bildiğim kadarıyla python3
, tüm Ubuntu 16.04 ve sonraki sürümlerde mevcuttur.
- Tüm ana makineleriniz kesinlikle varsa
python3
, değişkeni group_vars/all.yml
(veya eşdeğerinize) ekleyebilirsiniz :
# group_vars/all.yml
ansible_python_interpreter: /usr/bin/python3
- Bazı ana makineleriniz yoksa
python3
ve dinamik envanter kullanırken (örneğin AWS etiketleme ec2.py
) bunları etiketlemek için bir yolunuz varsa, değişkeni aşağıdaki gibi belirli ana bilgisayarlara uygulayabilirsiniz:
# group_vars/tag_OS_ubuntu1804.yml
ansible_python_interpreter: /usr/bin/python3
- Statik envanter kullanıyorsanız ve ana bilgisayarları sahip olup olmadıklarına göre gruplandırabiliyorsanız
python3
, şöyle bir şey yapabilirsiniz:
# inventory/hosts
[python2_hosts]
centos7_server
[python3_hosts]
u1804_server
[python3_hosts:vars]
ansible_python_interpreter=/usr/bin/python3
Bu seçeneği en çok seviyorum çünkü uzak ana bilgisayarda hiçbir değişiklik gerektirmez ve her oynatma kitabına eklenmesi gereken seçenek 2 ve 3'ün aksine değişkenlerde sadece küçük değişiklikler gerektirir.
Seçenek 2 - Python 2'yi kullanarak yükleyin raw
Bu seçenek, yüklemek gather_facts: false
için kullanılan her oynatma kitabının üstüne bir oyun koymayı gerektirir :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
oyunu, apt-get
kurulu olmayan ana bilgisayarlarda (örneğin RHEL tabanlı herhangi bir şey) çalıştırmayı planlıyorsanız gerekir , aksi takdirde ilk oyunda hata yaparlar .
Bu çözüm işe yarıyor, ancak birkaç nedenden dolayı listemdeki en düşük değer:
- Her oyun kitabının en üstünde yer alması gerekir (1. seçeneğin aksine)
- Varsayım
apt
sistemdedir ve hataları yok sayar (3. seçeneğin aksine)
apt-get
komutlar yavaş (seçenek 3'ün aksine)
Seçenek 3 - Symlink /usr/bin/python -> /usr/bin/python3
kullanarakraw
Bu çözümü kimsenin önerdiğini görmedim. İdeal değil, ama seçenek 2'den birçok yönden üstün olduğunu düşünüyorum. Benim önerim sistemde ve değilse raw
symlink bir kabuk komutu çalıştırmak için kullanmaktır :/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
Bu çözüm, her oyun kitabının en üstüne koymamız gerektiğinden seçenek 2'ye benzer, ancak bence birkaç açıdan daha üstün:
- Symlink'i yalnızca
python3
mevcut olan ve python
olmayan belirli bir durumda oluşturur - önceden yüklenmişse Python 2'yi geçersiz kılmaz
apt
Yüklü olduğunu varsaymaz
- Herhangi bir özel hata işlemeden tüm ana bilgisayarlara karşı çalışabilir
- İle karşılaştırıldığında süper hızlı
apt-get
Açıkçası, Python 2'nin kurulu olması gerekiyorsa/usr/bin/python
, bu çözüm bir hareket değildir ve seçenek 2 daha iyidir.
Sonuç
- Mümkünse her durumda seçenek 1'i kullanmanızı öneririm .
- Envanteriniz gerçekten büyük / karmaşıksa ve ana bilgisayarları kolayca gruplandırmanın bir yolu yoksa , seçenek 1'i çok daha zor ve hataya açık hale getiriyorsanız seçenek 3'ü kullanmanızı öneririm .
python3
- Sadece önermek 2. seçeneği üzerinde seçenek 3 Python 2 monte gerekiyorsa
/usr/bin/python
.
Kaynaklar