Bagaimana cara menentukan kata sandi sudo untuk Kemungkinan dengan cara non-interaktif?
Saya menjalankan buku pedoman yang memungkinkan seperti ini:
$ ansible-playbook playbook.yml -i inventory.ini \
--user=username --ask-sudo-pass
Tapi saya ingin menjalankannya seperti ini:
$ ansible-playbook playbook.yml -i inventory.ini \
--user=username` **--sudo-pass=12345**
Apakah ada cara? Saya ingin mengotomatiskan penyebaran proyek saya sebanyak mungkin.
Jawaban:
Anda dapat melewatkan variabel pada baris perintah melalui
--extra-vars "name=value"
. Variabel kata sandi sudo adalahansible_sudo_pass
. Jadi perintah Anda akan terlihat seperti:Pembaruan 2017 : An 2.2.2.0 sekarang menggunakan var
ansible_become_pass
. Sepertinya berhasil.sumber
history -c
setelah eksekusi yml..bash_history
.Docs sangat menyarankan untuk tidak menyetel kata sandi sudo dalam plaintext, dan alih-alih menggunakan
--ask-sudo-pass
pada baris perintah saat menjalankanansible-playbook
Pembaruan 2016:
Kemungkinan 2.0 (tidak 100% saat) ditandai
--ask-sudo-pass
sebagai usang. Docs sekarang merekomendasikan penggunaannya--ask-become-pass
, sementara juga mengganti penggunaansudo
seluruh buku pedoman Anda denganbecome
.sumber
Mungkin cara terbaik untuk melakukan ini - dengan asumsi bahwa Anda tidak dapat menggunakan solusi NOPASSWD yang disediakan oleh scottod adalah dengan menggunakan solusi Mircea Vutcovici dalam kombinasi dengan brankas yang dimungkinkan .
Misalnya, Anda mungkin memiliki buku pedoman seperti ini:
Di sini kita termasuk file yang disebut
secret
yang akan berisi kata sandi sudo kami.Kami akan menggunakan ansible-vault untuk membuat versi terenkripsi dari file ini:
Ini akan meminta Anda kata sandi, lalu buka editor default Anda untuk mengedit file. Anda bisa meletakkannya
ansible_sudo_pass
di sini.misalnya
secret
:Simpan dan keluar, sekarang Anda memiliki
secret
file terenkripsi yang dapat didekripsi oleh Ansible ketika Anda menjalankan playbook Anda. Catatan: Anda dapat mengedit file denganansible-vault edit secret
(dan memasukkan kata sandi yang Anda gunakan saat membuat file)Bagian terakhir dari teka-teki adalah untuk menyediakan Ansible dengan
--vault-password-file
yang akan digunakan untuk mendekripsisecret
file Anda .Buat file yang dipanggil
vault.txt
dan masukkan kata sandi yang Anda gunakan saat membuatsecret
file Anda . Kata sandi harus berupa string yang disimpan sebagai satu baris dalam file.Dari Ansible Documents:
Akhirnya: Anda sekarang dapat menjalankan buku pedoman Anda dengan sesuatu seperti
Di atas mengasumsikan tata letak direktori berikut:
Anda dapat membaca lebih lanjut tentang Vault Ansible di sini: https://docs.ansible.com/playbooks_vault.html
sumber
ansible-vault create group_vars/all/ansible.yml
dan tambahkan diansible_sudo_pass: yourpassword
sana. Tidak perlu mengubah buku pedoman atau inventarisfatal: [localhost]: FAILED! => {"changed": false, "failed": true, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE", "parsed": false}
Melihat kode (
runner/__init__.py
), saya pikir Anda mungkin dapat mengaturnya di file inventaris Anda:Tampaknya ada beberapa ketentuan dalam
ansible.cfg
file konfigurasi juga, tetapi tidak diterapkan sekarang (constants.py
).sumber
host_vars
ataugroup_vars
dan kemudian mengenkripsi file menggunakan kubah yang dimungkinkanSaya pikir ansible tidak akan membiarkan Anda menentukan kata sandi di flag seperti yang Anda inginkan. Mungkin ada suatu tempat di konfigurasi ini yang dapat diatur tetapi ini akan membuat penggunaan yang mungkin kurang aman secara keseluruhan dan tidak akan direkomendasikan.
Satu hal yang dapat Anda lakukan adalah membuat pengguna di mesin target dan memberi mereka hak sudo tanpa kata sandi untuk semua perintah atau daftar perintah terbatas.
Jika Anda menjalankan
sudo visudo
dan memasukkan baris seperti di bawah ini, maka pengguna 'pengguna istimewa' tidak harus memasukkan kata sandi ketika mereka menjalankan sesuatu sepertisudo service xxxx start
:sumber
Kata sandi sudo disimpan sebagai variabel yang dipanggil
ansible_sudo_pass
. Anda dapat mengatur variabel ini dalam beberapa cara:Per host, dalam file host inventaris Anda (
inventory/<inventoryname>/hosts
)Per grup, dalam file grup inventaris Anda (
inventory/<inventoryname>/groups
)Per grup, di vars grup (
group_vars/<groupname>/ansible.yml
)Per grup, terenkripsi (
ansible-vault create group_vars/<groupname>/ansible.yml
)sumber
Anda dapat mengatur kata sandi untuk grup atau untuk semua server sekaligus:
sumber
Saya merobek rambut saya lebih dari ini, sekarang saya menemukan solusi yang melakukan apa yang saya inginkan:
1 file terenkripsi per host yang berisi kata sandi sudo
/ etc / ansible / hosts:
maka Anda membuat untuk setiap host file var terenkripsi seperti:
dengan konten
bagaimana Anda mengatur kata sandi vault (masukkan melalui --ask-vault-pass) atau dengan cfg terserah Anda
berdasarkan ini saya menduga Anda hanya dapat mengenkripsi seluruh file host ...
sumber
ansible-playback
. Saya harus menggunakan-e @vault/filename.ext
untuk menggunakan lemari besi denganansible-playbook
panggilan saya .Cara yang lebih cerdas untuk melakukan ini adalah menyimpan
sudo
kata sandi Anda dalam brankas yang aman seperti LastPass atau KeePass dan kemudian meneruskannya denganansible-playbook
menggunakan-e@
tetapi alih-alih meng-hardcoding konten dalam file yang sebenarnya, Anda dapat menggunakan konstruk-e@<(...)
untuk menjalankan perintah dalam sebuah sub-shell, dan redirect outputnya (STDOUT) ke deskriptor file anonim, yang secara efektif memasukkan kata sandi ke-e@<(..)
.Contoh
Di atas adalah melakukan beberapa hal, mari kita jabarkan.
ansible-playbook -i /tmp/hosts pb.yml
- Jelas menjalankan buku pedoman melalui buku pedoman yang mungkin$(lpass show folder1/item1 --password)"
- Menjalankan LastPass CLIlpass
dan mengambil kata sandi untuk digunakanecho "ansible_sudo_pass: ...password..."
- mengambil string 'ansible_sudo_pass:' dan menggabungkannya dengan kata sandi yang disediakan olehlpass
-e@<(..)
- menempatkan di atas bersama-sama, dan menghubungkan subkulit<(...)
sebagai deskriptor file untukansible-playbook
dikonsumsi.Perbaikan lebih lanjut
Jika Anda lebih suka tidak mengetik itu setiap kali Anda bisa begitu saja hal-hal seperti itu. Pertama buat alias di
.bashrc
seperti Anda :Sekarang Anda dapat menjalankan buku pedoman Anda seperti ini:
Referensi
sumber
--extra-vars @<(echo ansible_become_pass: $(op get item <item name> | jq --raw-output '.details.sections[0].fields[] | select(.t=="password").v'))
/dev/fd/63
dan dengan kata sandi yang berada di deskriptor file temp, itu tidak diungkapkan.Jika Anda merasa nyaman menyimpan kata sandi dalam file teks biasa, opsi lain adalah menggunakan file JSON dengan parameter --extra-vars (pastikan untuk mengecualikan file dari kontrol sumber):
Ansible telah mendukung opsi ini sejak 1.3 .
sumber
Anda dapat menulis kata sandi sudo untuk buku pedoman Anda di file host seperti ini:
sumber
Gudang yang mungkin telah disarankan beberapa kali di sini, tetapi saya lebih suka git-crypt untuk mengenkripsi file sensitif di buku pedoman saya. Jika Anda menggunakan git untuk menyimpan buku pedoman yang memungkinkan, itu mudah. Masalah yang saya temukan dengan kubah yang memungkinkan adalah bahwa saya akhirnya menemukan salinan terenkripsi dari file yang ingin saya kerjakan dan harus mendekripsi sebelum saya dapat bekerja.
git-crypt
menawarkan alur kerja yang lebih baik IMO.Dengan menggunakan ini, Anda dapat meletakkan kata sandi di var di buku pedoman Anda, dan menandai buku bermain Anda sebagai file terenkripsi
.gitattributes
seperti ini:Buku pedoman Anda akan dienkripsi secara transparan di Github. Maka Anda hanya perlu menginstal kunci enkripsi Anda pada host yang Anda gunakan untuk menjalankan yang mungkin, atau ikuti instruksi pada dokumentasi untuk mengaturnya
gpg
.Ada T&J yang baik untuk meneruskan
gpg
kunci sepertissh-agent
kunci SSH ke depan Anda di sini: /superuser/161973/how-can-i-forward-a-gpg-key-via-ssh-agent .sumber
Anda dapat menggunakan
sshpass
utilitas seperti di bawah ini,sumber
Menggunakan 2.4.1.0 yang dimungkinkan dan berikut ini akan berfungsi:
Dan jalankan playbook dengan inventaris ini sebagai:
sumber
Retas saya untuk mengotomatiskan ini adalah dengan menggunakan variabel lingkungan dan mengaksesnya melalui
--extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"
.Mengekspor env var, tetapi hindari bash / shell history (diawali dengan spasi, atau metode lain). Misalnya:
Cari env var sambil meneruskan
ansible_become_pass
variabel ekstra keansible-playbook
, Misalnya:Jawaban alternatif yang bagus:
ansible_become_pass
. Ini layak. Namun, untuk tim paranoid yang perlu berbagi kata sandi kubah yang dimungkinkan, dan menjalankan permainan yang mungkin dengan akun induvidual, mereka dapat menggunakan kata sandi kubah bersama untuk saling membalikkan kata sandi sistem operasi lain (pencurian yang diidentifikasi). Boleh dibilang, Anda perlu mempercayai tim Anda sendiri?@
@ slm dihasilkan untuk temp descriptor file dan menggunakan awalan untuk membaca variabel yang mungkin dari desriptor file . Hindari setidaknya bash history. Tidak yakin, tetapi mudah-mudahan gema subkulit tidak tertangkap dan diekspos dalam audit logging (mis. Auditd).sumber
Anda dapat menggunakan vault yang dimungkinkan yang akan mengkodekan kata sandi Anda menjadi vault terenkripsi. Setelah itu Anda dapat menggunakan variabel dari vault di buku pedoman.
Beberapa dokumentasi tentang kubah yang mungkin:
http://docs.ansible.com/playbooks_vault.html
Kami menggunakannya sebagai lemari besi per lingkungan. Untuk mengedit vault kami memiliki perintah sebagai:
ansible-vault edit inventories/production/group_vars/all/vault
Jika Anda ingin memanggil variabel vault, Anda harus menggunakan playbook yang dimungkinkan dengan parameter seperti:
ansible-playbook -s --vault-password-file=~/.ansible_vault.password
Ya, kami menyimpan kata sandi brankas di direktori lokal dalam teks biasa, tetapi tidak lebih berbahaya seperti kata sandi penyimpanan root untuk setiap sistem. Kata sandi root ada di dalam file vault atau Anda dapat memilikinya seperti file sudoers untuk pengguna / grup Anda.
Saya merekomendasikan untuk menggunakan file sudoers di server. Berikut ini adalah contoh untuk admin grup:
%admin ALL=(ALL) NOPASSWD:ALL
sumber
Panggil saja buku pedoman Anda dengan
--extra-vars "become_pass=Password"
menjadi_pass = ('ansible_become_password', 'ansible_become_pass')
sumber
Setelah lima tahun, saya bisa melihat ini masih merupakan subjek yang sangat relevan. Agak mencerminkan jawaban leucos yang saya temukan yang terbaik dalam kasus saya, hanya menggunakan alat yang memungkinkan (tanpa otentikasi terpusat, token atau apa pun). Ini mengasumsikan Anda memiliki nama pengguna yang sama dan kunci publik yang sama di semua server. Jika tidak, tentu saja Anda harus lebih spesifik dan menambahkan variabel yang sesuai di sebelah host:
Menambahkan:
Kemudian:
Setidaknya dengan cara ini Anda tidak perlu menulis lebih banyak variabel yang mengarah ke kata sandi.
sumber
Solusi di atas oleh @ toast38coza bekerja untuk saya; Hanya itu sudo: ya sudah usang di Ansible sekarang. Gunakan sebaliknya menjadi dan menjadi pengguna .
sumber
kami juga Dapat Menggunakan EXPECT BLOCK dalam memungkinkan untuk menelurkan bash dan menyesuaikannya sesuai kebutuhan Anda
sumber
Sangat sederhana, dan hanya menambahkan dalam file variabel:
Contoh:
Dan tambahkan ini:
sumber
Hanya sebuah tambahan, jadi tidak ada orang lain yang melewati kekesalan yang baru-baru ini saya lakukan:
AFAIK, solusi terbaik adalah satu di sepanjang garis umum toast38coza di atas. Jika masuk akal untuk mengikat file kata sandi dan buku bermain Anda secara statis, kemudian ikuti templatnya dengan
vars_files
(atauinclude_vars
). Jika Anda ingin memisahkannya, Anda bisa menyediakan konten vault di baris perintah seperti:Itu jelas dalam retrospeksi, tetapi di sini adalah gotcha:
Tanda berdarah @ itu . Jika Anda membiarkannya, penguraian akan gagal secara diam-diam , dan playbook yang mungkin akan diproses seolah-olah Anda tidak akan pernah menentukan file di tempat pertama.
Anda harus mengimpor konten vault secara eksplisit, baik dengan baris perintah --extra-vars / -e atau di dalam kode YAML Anda. The
--ask-vault-pass
Bendera tidak melakukan apa pun dengan sendirinya (selain cepat Anda untuk nilai yang mungkin atau mungkin tidak digunakan kemudian).Semoga Anda memasukkan "@" dan menghemat satu jam.
sumber
Ini bekerja untuk saya ... Membuat file /etc/sudoers.d/90-init-users file dengan NOPASSWD
di mana "pengguna" adalah userid Anda.
sumber