Ansible: Apakah mungkin untuk "file cat" dan mengekspor outputnya ke layar saat bermain playbook dan bukan sebagai debug?

22

Saya menulis buku pedoman yang menginstal dan mengonfigurasi Google Authenticator per pengguna.

Saya ingin langkah terakhir playbook ke catfile konfigurasi google_authenticator.

Menggunakan modul "debug" saya bisa mendapatkan data untuk ditampilkan di layar tetapi hanya sebagai pesan debug:

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"
    ]
}

Saya membaca online bahwa saya dapat melakukan sesuatu seperti itu:

  - 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 }}"

Tapi saya mendapatkan kesalahan saat menjalankannya:

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 ********************************************************************

Kesalahan mengatakan: "Tidak ada kutipan penutup" meskipun dikutip. Juga mencoba:

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

Adakah yang tahu apa masalahnya?

Itai Ganot
sumber

Jawaban:

3

The kutipan Jinja saringan harus memecahkan masalah mengutip. Gunakan seperti ini:

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

Untuk pertanyaan lain, saya tidak mengetahui modul untuk mencetak pernyataan selain debugmodul. Anda mungkin ingin memeriksa apakah Simpan variabel terdaftar ke file merupakan opsi. Jika Anda ingin menyimpan variabel Ansible pada host controller, Anda dapat melakukan sesuatu seperti ini:

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

Sunting Saya perlu sedikit mengoreksi diri. Lihatlah pertanyaan kesalahan server ini . Anda dapat men-tweak output Ansible dengan menggunakan callback.displayfungsi. Saya sarankan membaca posting blog yang terhubung .

Henrik Pingel Reinstate Monica
sumber
1

Saya berani bertaruh bahwa masalahnya adalah tanda kutip dalam file yang Anda cating tidak cocok dan mengacaukan tanda kutip dalam pesan. Mungkin mencoba:

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

atau

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

Ini harus menghindari tanda kutip di pesan sehingga tanda kutip di sekitar pesan akan cocok satu sama lain.

Ini belum diuji (saya tidak dalam posisi untuk mengujinya sekarang), tetapi Anda dapat mencobanya dengan cepat dan lihat.

lsd
sumber
Mencoba keduanya ... tidak berhasil.
Itai Ganot
Hmm, saya hanya menjalankannya tanpa saran saya di atas, dan mendapat hasil yang sama dengan yang Anda miliki di awal. Namun itu tidak muncul Anda bisa mendapatkannya dalam format selain debug, tanpa menulis modul log Anda sendiri untuk kemungkinan, atau pipa ke shell atau skrip perl atau sesuatu. Tautan ini memiliki jawaban yang baik stackoverflow.com/questions/28564811/...
lsd
1

Saya telah melihat mendalam melalui internet dan memeriksa dengan beberapa profesional yang mungkin.

Sejauh yang saya mengerti, tidak ada opsi seperti itu di An 1.8 untuk mengarahkan output dari perintah ke layar sebagai output normal daripada output debug.

Itai Ganot
sumber
2
Adapun An 2.2 2.2 masih ada pilihan untuk mencetak ke layar selain menggunakan debug.
Itai Ganot
0

Saya menjalankan beberapa tes pada blok teks yang Anda miliki di atas - menjatuhkannya ke tempatnya dan membersihkan json quotes yang ditambahkan dengan menggunakan details.stdout_lines.

Jika teks 'buruk' dalam file auth Anda selalu menjadi yang utama \", maka ini (diuji) kebetulan bekerja, menghasilkan banyak output yang sama tetapi dengan titik dua di tempat ini dari satu string.

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

Sekarang ini adalah kasus penggunaan yang sangat terbatas, tetapi jika output auth google didefinisikan secara ketat di sini (dan sangat mungkin itu terjadi), maka ini harus melakukan apa yang Anda inginkan.

Namun, itu masih akan lebih mudah, dan lebih baik digunakan var=details.stdout_linesuntuk hanya mendapatkan konten di sini.

Ryder
sumber