Ansible: Bir oyun kitabı oynatırken hata ayıklama olarak değil "cat file" yapmak ve çıktısını ekrana aktarmak mümkün müdür?


22

Kullanıcı başına Google Authenticator'ı yükleyen ve yapılandıran bir oyun kitabı yazdım.

Çalma kitabının son adımını catgoogle_authenticator yapılandırma dosyasına istiyorum.

"Hata ayıklama" modülünü kullanarak ekranda görüntülenecek veriyi ancak hata ayıklama mesajı olarak gösterebiliyorum:

TASK: [debug var=details.stdout_lines] ****************************************
ok: [localhost] => {
    "details.stdout_lines": [
        "ZKMFTE2ADYA2OYCH",
        "\"RATE_LIMIT 3 30",
        "\" DISALLOW_REUSE",
        "\" TOTP_AUTH",
        "12920994",
        "88224784",
        "69464205",
        "38144121",
        "45634120"
    ]
}

Çevrimiçi olarak şöyle bir şey yapabileceğimi okudum:

  - name: Print to screen google authenticator details
    command: /bin/cat {{ google_authenticator_secret_file_location }}
    register: details
    tags: google_2fa_user

  - debug: msg="{{ details.stdout_lines }}"

Ancak çalıştırdığımda hata alıyorum:

TASK: [Print to screen google authenticator details] **************************
changed: [localhost]

TASK: [debug msg="{{details.stdout_lines}}"] **********************************
fatal: [localhost] => Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 532, in _executor
    exec_rc = self._executor_internal(host, new_stdin)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 629, in _executor_internal
    return self._executor_internal_inner(host, self.module_name, self.module_args, inject, port, complex_args=complex_args)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 815, in _executor_internal_inner
    result = handler.run(conn, tmp, module_name, module_args, inject, complex_args)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/action_plugins/debug.py", line 41, in run
    kv = utils.parse_kv(module_args)
  File "/usr/lib/python2.7/dist-packages/ansible/utils/__init__.py", line 526, in parse_kv
    vargs = [x.decode('utf-8') for x in shlex.split(args, posix=True)]
  File "/usr/lib/python2.7/shlex.py", line 279, in split
    return list(lex)
  File "/usr/lib/python2.7/shlex.py", line 269, in next
    token = self.get_token()
  File "/usr/lib/python2.7/shlex.py", line 96, in get_token
    raw = self.read_token()
  File "/usr/lib/python2.7/shlex.py", line 172, in read_token
    raise ValueError, "No closing quotation"
ValueError: No closing quotation


FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************

Hata diyor: "Her ne kadar alıntı yapılsa da" Ayrıca denedim:

 - debug: msg= "{{ details.stdout_lines }}"

Sorunun ne olabileceği hakkında bir fikrin var mı?

Yanıtlar:


3

Alıntı Jinja filtre alıntı sorunu çözmek gerekir. Bu şekilde kullanın:

  - debug: msg="{{ details.stdout_lines | quote }}"

Diğer soru için, modül dışındaki ifadeleri basacak bir modülün farkında değilim debug. Kayıtlı değişkeni dosyaya kaydet seçeneğinin olup olmadığını kontrol etmek isteyebilirsiniz . Ansible değişkenlerini kontrol cihazı ana bilgisayarında saklamak istiyorsanız, bunun gibi bir şey yapılabilir:

- local_action: copy content={{ details.stdout_lines }} dest=/path/to/destination/file

EDIT Kendimi biraz düzeltmem gerekiyor. Bu sunucu hatası sorusuna bir göz atın . callback.displayFonksiyonu kullanarak Ansible çıktısını ince ayar yapabilirsiniz . Bağlantılı blog gönderisini okumanızı tavsiye ederim .


1

Bahse girerim ki sorun cat'ing dosyasındaki alıntıların uyuşmazlığı ve msg'deki tırnakların karışmasıdır. Belki dene:

- debug: msg = "{{details.stdout_lines | regex_escape ()}"

veya

- debug: msg = "{{details.stdout_lines | regex_replace ('"', '\ "')}"

Bu, msj'deki tırnak işaretlerinden kaçmalıdır, böylece msg etrafındaki tırnak işaretleri birbiriyle eşleşir.

Bu test edilmedi (şu anda test edecek durumda değilim), ancak çok hızlı bir şekilde deneyebilir ve görebilirsiniz.


İkisini de denedim ... işe yaramadı.
Itai Ganot

Hmm, sadece yukarıdaki önerilerim olmadan koştum ve başlangıçta sahip olduğunuz çıktıyı aldım. Bununla birlikte, göründüğü gibi kendi log modülünüzü yazmadan, bir kabuk veya perl betiğine ya da başka birşeye aktarmadan, hata ayıklama dışında bir biçimde alabilirsiniz. Bu bağlantıya iyi bir yanıt geldi stackoverflow.com/questions/28564811/…
lsd

1

İnternetten derinlere baktım ve bazı Ansible uzmanlarına baktım.

Anladığım kadarıyla, Ansible 1.8'de komutun çıktısını ekrana debug çıktısı yerine normal çıktı olarak yönlendirmek için böyle bir seçenek yoktur.


2
Ansible 2.2'ye gelince, hala hata ayıklama kullanmak dışında ekrana yazdırma seçeneği yoktur.
Itai Ganot

0

Yukarıda yazdığınız metin bloğu üzerinde bazı testler yaptım - yerine bıraktım ve details.stdout_lines kullanarak eklenen json tırnak işaretlerini temizledim.

Eğer auth dosyanızdaki 'bad' metni her zaman bir öncü ise \", o zaman bu (test edilmiş) hemen hemen aynı çıktıyı ancak bu dize yerine iki nokta üst üste koyarak çalışır.

- debug: msg="{{ details.stdout.replace('\\"',':').split('\n') }}"

Şimdi bu son derece sınırlı bir kullanım durumudur, ancak google auth çıkışı burada kesin olarak tanımlanmışsa (ve durum tamamen mümkün), o zaman istediğini yapmalısınız.

Bununla birlikte, var=details.stdout_linesburadaki içerikleri sadece almak için kullanmak daha kolay ve tercih edilir olacaktır .

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.