Görev Çıktısını Bir Dosyaya Nasıl Kaydederim?


10

Ansible görevlerimden biri, kullanarak bir Oracle veritabanı alır impdp.

Bu , konsola çok fazla çıktı üretir , bu yüzden ayarladım no_log: True.

Ancak, bu başarısız olduğunda günlüğü görmek istiyorum!

Bu özel görev günlüğünü konsola değil bir dosyaya nasıl yapabilirim?


Komut modülünü mü kullanıyorsunuz?
Xiong Chiamiov

Bir fikir [bir hack daha] günlükleri bazı harici dosyaya yazmak ve daha sonra failed_whenkoşuldan yararlanan bir göreve sahip olmak ve eğer önceki günlük dosyasını kaldırmak olacaktır. görev başarılı oldu :)
Dawny33

Başarılı çalışmalarda neden konsol çıkışını görebiliyorsunuz? Ben başarılı bir görev yürütme sırasında stdout göstermek için bir yapılandırma görmedim, ne de mümkün olduğunu düşündüm, sadece gelmelidir [ok: ana bilgisayar adı]. Ancak bir hata tespit edildiğinde, çıkış sesli kontrol konsoluna (ve tanımlanan herhangi bir günlük dosyasına) dökülür.
hvindin

koyun @hvindin -vvvsonra ansible-playbookgünlükleri ayrıntılı almak için komutu.
Dawny33

1
Bir değişkeni kaydetmek en mantıklı hareket gibi görünüyor, ansible tetiklenmiş komutların çıktılarıyla ne yapacağım hakkındaki görüşlerim için cevabınızdaki yorumuma bakın.
hvindin

Yanıtlar:


4

[Yorumumu bir cevaba dönüştürme]

Bunu yapmanın bir yolu, günlükleri bazı harici dosyalara yazmak ve daha sonra fail_when koşulunu kullanan bir göreve sahip olmak ve önceki görev başarılı olursa günlük dosyasını kaldırmak olacaktır.

Böyle bir şey size yardımcı olacaktır.

 - name: Run Py script
      command: <>.py  > <>.log
      become: yes
      register: PyScript
      ignore_errors: True

    - name: PyScript on success
      command: rm <>.log
      when: PyScript|succeeded

Not: Bu, sorununuzu çözmenin en iyi yolu olmayabilir. Ancak bu, günlük kaydı ve izlememi yapmama yardımcı olan bir hackti.


2
Bir daha ileri gidip komutunuzu stdout / stderr'a yazabileceğinizi söyleyebilirim, sonra sadece bir hataya yanıt olarak onları dökebilirsiniz. Bu nedenle, yukarıdaki örnekte bir örnek olarak, bir hata durumunda yürütmeyi durdurmak isterseniz, rc! = 0 daha bütünsel bir çözüm gibi göründüğünde, PyScript'te kayıtlı stdout ve stderr çıktısını almak için başarısız bir görev kullanmak. Ansibles dahili mekanizmaları kullanırsanız, örneğin bir kontrol sunucusunda ayarlanmış bir günlük kaydı varsa, o zaman bu kontrol sunucusu hatayı günlüğe kaydedemez. Hangi Ben bunun için doğru bir yer olacağını düşünüyorum
hvindin

3

Tek yapmanız gereken, ihtiyacınız olan her komutun çıktısını kaydetmek (bir değişkende saklamak) ve daha sonra sadece değişkeni bir dosyaya dökmek olduğunu düşünüyorum. Bu şekilde daha sonra inceleyebilirsiniz.

tasks:
  - name: Dump all vars
    action: template src=templates/dumpall.j2 dest=/tmp/ansible.all

Sonra dumpall.j2'de:

Module Variables ("vars"):
--------------------------------
{{ vars | to_nice_json }} 

Environment Variables ("environment"):
--------------------------------
{{ environment | to_nice_json }} 

GROUP NAMES Variables ("group_names"):
--------------------------------
{{ group_names | to_nice_json }}

GROUPS Variables ("groups"):
--------------------------------
{{ groups | to_nice_json }}

HOST Variables ("hostvars"):
--------------------------------
{{ hostvars | to_nice_json }} 

Kullandığım örnek buradan


3

Bunu ekleyerek çözdüm

ignore_errors: true
register: results

no_log-task. Bu, görev başarısız olsa bile bir sonraki göreve ansible devam etmeyi sağlar. Daha sonra bir sonraki görev için her zaman başarısız olan ve kayıtlı değişkeni çıkaran ancak yalnızca önceki görev başarısız olduğunda çalışan bir hata ayıklama görevi tanımlayın:

- name: Error output
  debug:
     var: results
  failed_when: true
  when:
     results is failed

Bu nedenle no_log: true ile bile, bu başarısız görevin çıkışını görüntülü olarak gösterecektir. Bu çözüm, istendiği gibi bir dosyaya günlüğe kaydetmiyor, ancak 'başarısız olduğunda günlüğü görme' ihtiyacınızı yerine getiriyor ve elbette, tam çözüm çıktısını bir dosyaya çıktılamak için tee'yi yeniden yönlendirebilir veya kullanabilirsiniz, bu çözümle ayrıca başarısız görevin günlüğünü de içerir.


2

Sadece başarısızlık durumunda günlüğü yürütmek ve almak için bir komut aldığımda ne yapmalıyım aşağıdaki gibidir ( /bin/sh -c '...'başlatıcı bir systemçağrı kullanmıyorsa veya doğrudan kabuk olmadan komutu yürütür gibi bir kabuk komatının ön eki ) :

command 2&>1 > command-log.txt || cat command-log.txt

Bu, hatayı ve standart çıktıyı bir dosyaya yönlendirir ve yalnızca hata olması durumunda dosyanın içeriğini görüntüler. Komut çok ayrıntılıysa ve günlüğü tamam olduğunda tutmak istemiyorsanız şu yolla gidebilirsiniz:

command 2&>1 > command-log.txt && rm command-log.txt || cat command-log.txt

Sh manpage için teklif &&ve ||kullanım :

&& (||) sembolü, aşağıdaki listenin yalnızca önceki ardışık düzen sıfır (sıfır olmayan) bir değer döndürdüğünde yürütülmesine neden olur.

Muhtemelen bu, ansible ile yapmanın en deyimsel yolu değildir, ancak komut stdout'unu görüntüleme olanağı veren herhangi bir yapılandırma yönetim sistemi ile çok taşınabilir olma avantajına sahiptir.


0

Ansible'ın hataları stderr'a doğru şekilde attığını varsayarsak, çıktı yönlendirmesini kullanarak herhangi bir programdaki hataların çıktısını bir dosyaya kaydedebilirsiniz:

some command 2> error.log

Ancak durumun böyle olduğunu düşünmüyorum.

Bunun yerine, hataların ne zaman oluşacağına karar vermek için bu kılavuza başvurmak isteyeceksiniz http://docs.ansible.com/ansible/playbooks_error_handling.html ve daha sonra bir dosyaya çıkmadan önce bir hatayı gösteren dizeler için çıktınızı grep

yani.

ansible-playbook my-playbook | grep 'error' > error.log


-2

Bence aradığınız şey stdout'u ve sokağı dosyaya yönlendirmek olabilir.

Genellikle, bazı komutlar>> logfile.log

ya da bazı varyantlar ...


Hangi sadece kısmi bir cevap, OP hata durumunda günlüğü görmek istiyor.
Tensibai

Bu soruya kısmi bir cevap bile yok. Bir kabuk betiği için iyidir, ancak ansibleda kodlama için işe yaramaz .
civcivler

@chicks Sanırım ansible içinde bir 'kabuk' yöntemi yaklaşımında geçerli bir geçici çözüm olabilir (ki çok fazla bilmiyorum)
Tensibai

-2

Tee günlük kaydı için çok basit bir araç olacak, aşağıdaki komutu başvurabilirsiniz.

eric@eric-MacBookPro:~$ ansible -m ping all | tee > /tmp/ansible.log
eric@eric-MacBookPro:~$ cat /tmp/ansible.log 
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

2
1. Bu sadece tek bir görevi değil, tüm çalışmayı etkiler. 2. Stdout'unu bir dosyaya yönlendirecekseniz, tee ile borulama yapmanın bir anlamı yoktur; komutu böyle kullanmıyorsunuz. 3. Tee'yi düzgün bir şekilde kullanıyorsanız, OP'nin istemediği tüm spamleri konsola gönderir.
Xiong Chiamiov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.