Soru Uzun süredir Ansible görevi için ilerlemeyi nasıl gösterebilirim?


Maalesef uzun operasyonları gerçekleştiren bazı Ansible görevlerim var - S3 klasörüyle senkronizasyon işlemini çalıştırma gibi şeyler. Devam ediyorlarsa veya takılıp kalmıyorlarsa (ya da ssh bağlantısı öldüyse) her zaman açık değildir, bu yüzden bir çeşit ilerleme çıktısının görüntülenmesi güzel olurdu. Komutun stdout / stderr'i doğrudan görüntülendiyse, bunu görürdüm, ancak Ansible çıktıyı yakalar.

Boru çıkışı geri Ansible'ın mevcut haliyle çözmesi zor bir sorundur. Ancak, bazı şeylerin hala hareket ettiğini göstermek için kullanabileceğim herhangi bir Ansible hilesi var mı?

Geçerli bilet https://github.com/ansible/ansible/issues/4870


21
2017-12-16 23:54


Menşei




Cevaplar:


Bugün bu problemi OSX'te buldum, uzun bir zamana dayanan bir docker kabuğunu çalıştırıyordum ve inşa edilirken çıktı yoktu. Komutun asılı olup olmadığını ya da yavaş yavaş ilerlediğini anlamak çok sinir bozucuydu.

Kabuk komutunun çıkışını (ve hatasını) bir bağlantı noktasına pipetlemeye karar verdim, bu da ayrı bir terminalde netcat yoluyla dinlenebildi.

myplaybook.yml

- name: run some long-running task and pipe to a port
  shell: myLongRunningApp > /dev/tcp/localhost/4000 2>&1

Ve ayrı bir terminal penceresinde:

$ nc -lk 4000
Output from my
long
running
app will appear here

Hata çıkışını aynı bağlantı noktasına pipettiğimi unutmayın; Farklı bir limana kolayca boru ekleyebilirim.

Ayrıca, denilen bir değişken belirledim nc_port Bu, portun kullanımda olması durumunda portun değiştirilmesine izin verecektir. Anlaşılan görev şu şekilde görünür:

  shell: myLongRunningApp > /dev/tcp/localhost/{{nc_port}} 2>&1

Komuta dikkat edin myLongRunningApp localhost üzerinde çalıştırılıyor (yani, envanterde ayarlanmış ana makine) bu yüzden localhost'u dinliyorum nc.


13
2018-03-13 21:15





Yapabileceğin birkaç şey var, ama doğru bir şekilde işaret ettiğin gibi, Ansible şimdiki haliyle gerçekten iyi bir çözüm sunmuyor.

Resmi ish çözümleri:

Bir fikir, görevi asenkron olarak işaretlemek ve sorgulamaktır. Açıkçası bu sadece, oyun defterinizde başka bir yerde başarısızlığa neden olmadan böyle bir şekilde koşabiliyorsa uygundur. Eşzamansız dokümanlar İşte ve bunlardan bir örnek kaldı:

- hosts: all
  remote_user: root
  tasks:
  - name: simulate long running op (15 sec), wait for up to 45 sec, poll every 5 sec
    command: /bin/sleep 15
    async: 45
    poll: 5

Bu, görevin asılmadığını bilmek için size en azından 'ping' verebilir.

Resmi olarak onaylanan diğer tek yöntem, görevler için ilerleme çubuklarına sahip olan ancak özgür olmayan Ansible Tower'dır.

Hacky-ish çözümleri:

Yukarıdakilerin ötesinde, kendinizinkini yapmak zorunda kalacaksınız. Bir S3 grubunu eşleme özel örneğiniz AWS CLI'yi düzenli olarak çağıran ve bir kovadaki öğe sayısını sayan bir betikle oldukça kolay izlenebilir, ancak bu pek de iyi bir jenerik çözüm değildir.

Biraz etkili olabileceğimi hayal edebilecek tek şey, gelen ssh seansını düğümlerinizden birinden izliyor olacaktı.

Bunu yapmak için, bu makinede sesli kullanıcı ile ekran üzerinden bağlanmak ve aktif olarak izlemek için yapılandırabilirsiniz. Alternatif olarak belki de log_output Bu kullanıcının sudoers girdisinde, dosyayı kuyruğa sokmanıza izin veren seçenek. Log_output ayrıntılarını bulunabilir. sudoers man sayfası


8
2017-12-20 23:42





Linux kullanıyorsanız, kullanabilirsiniz systemd-run geçici bir birim oluşturmak ve çıkışı journalctl, sevmek:

sudo systemd-run --unit foo \                                      
     bash -c 'for i in {0..10}; do 
                   echo "$((i * 10))%"; sleep 1;
              done;
              echo "Complete"'

Ve başka bir oturumda

sudo journalctl -xf --unit foo

Böyle bir şey çıktılar:

Apr 07 02:10:34 localhost.localdomain systemd[1]: Started /bin/bash -c for i in {0..10}; do echo "$((i * 10))%"; sleep 1; done; echo "Complete".
-- Subject: Unit foo.service has finished start-up
-- Defined-By: systemd
-- Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit foo.service has finished starting up.
-- 
-- The start-up result is done.
Apr 07 02:10:34 localhost.localdomain bash[10083]: 0%
Apr 07 02:10:35 localhost.localdomain bash[10083]: 10%
Apr 07 02:10:36 localhost.localdomain bash[10083]: 20%
Apr 07 02:10:37 localhost.localdomain bash[10083]: 30%
Apr 07 02:10:38 localhost.localdomain bash[10083]: 40%
Apr 07 02:10:39 localhost.localdomain bash[10083]: 50%
Apr 07 02:10:40 localhost.localdomain bash[10083]: 60%
Apr 07 02:10:41 localhost.localdomain bash[10083]: 70%
Apr 07 02:10:42 localhost.localdomain bash[10083]: 80%
Apr 07 02:10:43 localhost.localdomain bash[10083]: 90%
Apr 07 02:10:44 localhost.localdomain bash[10083]: 100%
Apr 07 02:10:45 localhost.localdomain bash[10083]: Complete

0
2018-04-07 05:12