Ansible için sudo parolasını belirtin


226

Ansible için etkileşimli olmayan bir şekilde sudo şifresini nasıl belirleyebilirim?

Ansible playbook'u şu şekilde çalıştırıyorum:

$ ansible-playbook playbook.yml -i inventory.ini \
    --user=username --ask-sudo-pass

Ama şu şekilde çalıştırmak istiyorum:

$ ansible-playbook playbook.yml -i inventory.ini \
    --user=username` **--sudo-pass=12345**

Bir yolu var mı? Proje dağıtımımı olabildiğince otomatikleştirmek istiyorum.


Yanıtlar:


170

Değişkeni komut satırına üzerinden iletebilirsiniz --extra-vars "name=value". Sudo şifre değişkendir ansible_sudo_pass. Yani komutunuz şöyle görünecektir:

ansible-playbook playbook.yml -i inventory.ini --user=username \
                              --extra-vars "ansible_sudo_pass=yourPassword"

Güncelleme 2017 : Ansible 2.2.1.0 artık var ansible_become_pass. Her ikisi de işe yarıyor gibi görünüyor.


7
Güvenlik açısından, aşağıdakileri eklerseniz en iyi yanıt: history -cyml yürütüldükten sonra.
kiltek

12
@kiltek: veya satırın başına (bash içinde) satır yazmayacak * fazladan bir boşluk ekleyin .bash_history.
ccpizza

44
Komut satırında şifreleri iletmek için iyi bir uygulama değil. Komut yürütülürken herkes süreç listesinde şifreyi görebilecek ...
Pavel Chernikov

22
hala yapma. --ask-sudo-pass
JasonG

2
@scrutari Bazı durumlarda mükemmel şekilde geçerlidir: Örn: Kullanıcının genel ssh anahtarını enjekte etmek için varsayılan, dünyaca bilinen, ilk paroladan değiştirme ... Yeni yeniden görüntülenen bir sistemin ilk yapılandırmasını düşünün.
Ceredig

237

Dokümanlar sudo parolasını düz metin olarak ayarlamamanızı ve bunun yerine komut satırında çalıştırmayı şiddetle önerir.--ask-sudo-passansible-playbook


2016 Güncellemesi:

Ansible 2.0 (ne zaman% 100 değil) --ask-sudo-passkullanımdan kaldırıldı olarak işaretlendi . Dokümanlar artık --ask-become-passbunun yerine sudooyun kitaplarınızdaki kullanımını değiştirirken kullanılmasını öneriyor become.


16
Evet, bunun neden önerildiğini görebiliyorum. Ancak Ansible'ı dağıtım sürecinin bir parçası olarak kullandığımızda, bunu otomatikleştirmenin daha iyi yolu nedir? Dağıtım işleminin ortasında durmak ve kullanıcıdan sudo parolasını girmesini istemek çok uygun değildir.
Slava Fomin II

9
Not --ask-sudo-pass, -K olarak kısaltılabilir, ancak görebildiğim kadarıyla, farklı şifreleri olan birden fazla sunucuda çalışan bir oyun kitabını ele almanın bir yolu yoktur (sadece bir kez sorar), bu yüzden şifresiz düşünüyorum sudo gitmek için bir yoldur.
William Turrell

1
Çalışmıyor gibi görünüyor. ama bir sonraki öneri ("some-host ansible_sudo_pass = 'foobar'") yapar
nadavkav

--ask-sudo-pass daha önce, 1.9'da kullanımdan kaldırıldı
Chris Betti

Varsa cevabı bir kaynak bağlantıyla güncellemek isterim.
deefour

106

Muhtemelen bunu yapmanın en iyi yolu - scottod tarafından sağlanan NOPASSWD çözümünü kullanamayacağınızı varsayarak Mircea Vutcovici'nin çözümünü Ansible tonoz ile birlikte kullanmaktır .

Örneğin, şöyle bir oynatma kitabınız olabilir:

- hosts: all

  vars_files:
    - secret

  tasks:
    - name: Do something as sudo
      service: name=nginx state=restarted
      sudo: yes

Burada secretsudo şifremizi içeren bir dosya ekliyoruz.

Bu dosyanın şifrelenmiş bir sürümünü oluşturmak için ansible-vault kullanacağız:

ansible-vault create secret

Bu sizden bir şifre isteyecektir, ardından dosyayı düzenlemek için varsayılan düzenleyicinizi açacaktır. Buraya girebilirsin ansible_sudo_pass.

ör . secret:

ansible_sudo_pass: mysudopassword

Kaydedin ve çıkın, secretAnsible'ın oyun kitabınızı çalıştırdığınızda şifresini çözebileceği şifrelenmiş bir dosyanız var. Not: ile dosyayı düzenleyebilirsiniz ansible-vault edit secret(ve dosyayı oluştururken kullandığınız şifreyi girebilirsiniz)

Bulmacanın son parçası Ansible'a dosyanızın --vault-password-fileşifresini çözmek için kullanacağı bir yöntem sunmaktır secret.

Dosyanızı oluştururken vault.txtkullandığınız şifreyi koyduğunuz adlı bir dosya oluşturun secret. Parola, dosyada tek bir satır olarak depolanan bir dize olmalıdır.

Ansible Docs'tan:

.. dosyadaki izinlerin başka hiç kimse anahtarınıza erişemeyeceği ve anahtarınızı kaynak denetimine eklemeyecek şekilde olduğundan emin olun

Son olarak: artık oyun kitabınızı aşağıdaki gibi bir şeyle çalıştırabilirsiniz

ansible-playbook playbook.yml -u someuser -i hosts --sudo --vault-password-file=vault.txt 

Yukarıdaki dizin düzenini varsayarsak:

.
|_ playbook.yml
|_ secret
|_ hosts
|_ vault.txt

Ansible Vault hakkında daha fazla bilgiyi buradan edinebilirsiniz: https://docs.ansible.com/playbooks_vault.html


5
Not: ansible 1.9'dan itibaren artık ansible_sudo_pass (veya ansible_become_pass) değişkenini kullanamayacağınız anlaşılıyor: "fatal: [...] => Şifre
olmuyor

6
Bu çözümü üretimde kullanıyorum, jenkins gizli bir değişken olarak kasa parolasını depolar, çalışma zamanında geçici bir dosyaya yazar ve ansible'ı çağırmaya devam eder.
simone cittadini

6
veya daha basit: ansible-vault create group_vars/all/ansible.ymlve ansible_sudo_pass: yourpasswordoraya ekleyin .
Oyun

1
Bunu denedim ama şu hatayı aldım:fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE", "parsed": false}
JohnnyQ

8
Kasanın parolasını hemen yanında düz metin olarak saklarsanız kasa ne işe yarar?
Erik

44

Code ( runner/__init__.py) bakarak, muhtemelen envanter dosyasında ayarlayabilirsiniz düşünüyorum:

[whatever]
some-host ansible_sudo_pass='foobar'

ansible.cfgYapılandırma dosyasında da bazı hükümler var gibi görünüyor , ancak şu anda uygulanmadı ( constants.py).


7
Bunu güvenli bir şekilde yapılandırmanın harika bir yolu, bunu host_varsveya group_varsdizininde saklamak ve daha sonra dosyayı ansible tonoz
Kyle

44

Ansible'ın bayraklarda istediğiniz gibi bir şifre belirlemenize izin vereceğini sanmıyorum. Konfigürasyonlarda bir yer olabilir, bu ayarlanabilir, ancak bu genel olarak ansible daha az güvenli kullanılmasını sağlar ve önerilmez.

Yapabileceğiniz bir şey, hedef makinede bir kullanıcı oluşturmak ve onlara tüm komutlara veya kısıtlı komut listesine şifresiz sudo ayrıcalıkları vermektir.

sudo visudoAşağıdaki gibi bir satır çalıştırıp girerseniz , 'privilegedUser' kullanıcısının aşağıdaki gibi bir şey çalıştırdığında bir parola girmesi gerekmez sudo service xxxx start:

%privilegedUser ALL= NOPASSWD: /usr/bin/service

7
@bschlueter yani kötü uygulamayı onaylıyorsunuz?
stephen

1
Bunun iyi bir fikir olduğunu düşünmüyorum. --Ask-sudo-pass kullanmak bana mantıklı geliyor.
kgpdeveloper

@simone cittadini Ben vereceğim cevap aslında tamamen katılıyorum. Bu bir güvenlik riskidir.
einarc

Aşamaya / ürüne dağıtmak için şifresiz sudo kullanıyorsanız, bu yanıtları her gün 15 dakikada bir yerel ana makinenize dağıtırken yerel dizüstü oturum açma parolanızı girmek zorunda kalmamak için kullanmak daha az güvenlik riski taşır.
Jonathan Hartley

Ansible kullanarak bu satırı nasıl eklersiniz?
Matthias

21

Sudo şifre adında bir değişken olarak depolanır ansible_sudo_pass. Bu değişkeni birkaç yolla ayarlayabilirsiniz:

Ana bilgisayar başına, envanter ana makine dosyanızda ( inventory/<inventoryname>/hosts)

[server]
10.0.0.0 ansible_sudo_pass=foobar

Grup başına, envanter grupları dosyanızda ( inventory/<inventoryname>/groups)

[server:vars]
ansible_sudo_pass=foobar

Grup başına, grup vars ( group_vars/<groupname>/ansible.yml) cinsinden

ansible_sudo_pass: "foobar"

Grup başına, şifreli ( ansible-vault create group_vars/<groupname>/ansible.yml)

ansible_sudo_pass: "foobar"

18

Bir grubun veya tüm sunucuların şifresini bir kerede ayarlayabilirsiniz:

[all:vars]
ansible_sudo_pass=default_sudo_password_for_all_hosts

[group1:vars]
ansible_sudo_pass=default_sudo_password_for_group1

14

Saçımı bu konuda yırtıyordum, şimdi istediğimi yapan bir çözüm buldum:

Ana bilgisayar başına sudo şifresini içeren 1 şifreli dosya

/ Etc / yanıtlayıcı '/ ana:

[all:vars]
ansible_ssh_connection=ssh ansible_ssh_user=myuser ansible_ssh_private_key_file=~/.ssh/id_rsa

[some_service_group]
node-0
node-1

her ana bilgisayar için şu şekilde şifrelenmiş bir var dosyası oluşturursunuz:

ansible-vault create /etc/ansible/host_vars/node-0

içerikle

ansible_sudo_pass: "my_sudo_pass_for_host_node-0"

kasa şifresini nasıl organize edersiniz (--ask-vault-pass ile girin) veya cfg ile size kalmış

Buna dayanarak tüm ana bilgisayarlar dosyasını şifreleyebileceğinizden şüpheleniyorum ...


Kasayı kullanarak şifrelemek benim için en mantıklı ansible-playback. -e @vault/filename.extKasamı çağrımda kullanmak için kullanmak zorunda kaldım ansible-playbook.
Alex

9

Bunu yapmanın daha anlayışlı bir yolu, sudoşifrenizi LastPass veya KeePass gibi güvenli bir kasada saklamak ve daha sonra bunu ansible-playbookkullanmaya geçirmektir , -e@ancak içeriği gerçek bir dosyada kodlamak yerine, -e@<(...)bir komutta komut çalıştırmak için yapıyı kullanabilirsiniz. alt kabuk, ve çıkış (STDOUT) anonim bir dosya tanımlayıcısına yönlendirerek, parolayı etkin bir şekilde -e@<(..).

Misal

$ ansible-playbook -i /tmp/hosts pb.yml \
   -e@<(echo "ansible_sudo_pass: $(lpass show folder1/item1 --password)")

Yukarıdakiler birkaç şey yapıyor, hadi yıkalım.

  • ansible-playbook -i /tmp/hosts pb.yml - açık bir şekilde ansible-playbook aracılığıyla bir playbook çalıştırmak
  • $(lpass show folder1/item1 --password)"- LastPass CLI'yi çalıştırır ve lpasskullanılacak şifreyi alır
  • echo "ansible_sudo_pass: ...password..." - 'ansible_sudo_pass:' dizesini alır ve tarafından verilen şifreyle birleştirir lpass
  • -e@<(..)- yukarıdakileri bir araya getirir ve tükenmek <(...)üzere bir dosya tanımlayıcı olarak alt kabuğunu bağlar ansible-playbook.

Diğer iyileştirmeler

Bunu her seferinde yazmak istemiyorsanız, böyle şeyler yapabilirsiniz. Öncelikle beğeninize bir takma ad oluşturun .bashrc:

$ cat ~/.bashrc
alias asp='echo "ansible_sudo_pass: $(lpass show folder1/item1 --password)"'

Artık oyun kitabınızı şu şekilde çalıştırabilirsiniz:

$ ansible-playbook -i /tmp/hosts pb.yml -e@<(asp)

Referanslar


1
Subshell kullanmak çok akıllıca bir fikir! Merak edenler için, 1Password CLI ile şöyle görünüyor:--extra-vars @<(echo ansible_become_pass: $(op get item <item name> | jq --raw-output '.details.sections[0].fields[] | select(.t=="password").v'))
Diti

1
Bach geçmişini kontrol ettiğimde, şifre açık metin olarak açığa çıkmadığı için bunu beğendim. Muhtemelen bunun için de doğrudur, eğer sistem denetimi etkinleştirilmişse, komut bir dosyayı okuyormuş gibi kaydedilir, örneğin /dev/fd/63şifre geçici dosya tanımlayıcısında olması nedeniyle ifşa edilmez.
JPvRiel

5

Parolaları düz metin dosyalarında tutmaktan memnunsanız, başka bir seçenek --extra-vars parametresiyle bir JSON dosyası kullanmaktır (dosyayı kaynak denetiminden hariç tuttuğunuzdan emin olun):

ansible-playbook --extra-vars "@private_vars.json" playbook.yml 

Ansible bu seçeneği 1.3'ten beri destekliyor .


5

oyun kitabınız için sudo şifresini aşağıdaki gibi hosts dosyasına yazabilirsiniz:

[host-group-name]
host-name:port ansible_sudo_pass='*your-sudo-password*'

5

Ansible tonoz burada birkaç kez önerildi, ancak oyun kitaplarımdaki hassas dosyaları şifrelemek için git-crypt'i tercih ediyorum. Ansible playbook'larınızı saklamak için git'i kullanıyorsanız, bu bir çırpıda. Ansible tonoz ile bulduğum sorun, kaçınılmaz olarak çalışmak istediğim dosyanın şifrelenmiş kopyalarına rastlıyorum ve çalışmaya başlamadan önce şifresini çözmek zorundayım. git-cryptgüzel bir iş akışı IMO sunar.

Bunu kullanarak, şifrelerinizi oynatma kitabınızdaki bir değişkene koyabilir ve oynatma kitabınızı şu şekilde şifreli bir dosya olarak işaretleyebilirsiniz .gitattributes:

 my_playbook.yml filter=git-crypt diff=git-crypt

Başucu kitabınız Github'da şeffaf bir şekilde şifrelenecek. Ardından, şifreleme anahtarınızı, ansible'ı çalıştırmak için kullandığınız ana bilgisayara yüklemeniz veya kurmak için belgelerdeki talimatları izlemeniz yeterlidir gpg.

Yönlendirme SSH anahtarlarınız gpggibi yönlendirme anahtarlarında iyi bir Soru-Cevap ssh-agentvar: /superuser/161973/how-can-i-forward-a-gpg-key-via-ssh-agent .


3

sshpassYardımcı programı aşağıdaki gibi kullanabilirsiniz ,

$ sshpass -p "your pass" ansible pattern -m module -a args \
   -i inventory --ask-sudo-pass

3

2.4.4.0 ve aşağıdakileri kullanmak işe yarayacaktır:

[all]
17.26.131.10
17.26.131.11
17.26.131.12
17.26.131.13
17.26.131.14

[all:vars]
ansible_connection=ssh
ansible_user=per
ansible_ssh_pass=per
ansible_sudo_pass=per

Ve oyun kitabını şu envanterle şu şekilde çalıştırın :

ansible-playbook -i inventory copyTest.yml

3

Bunu otomatikleştirmek için benim kesmek bir ortam değişkeni kullanmak ve üzerinden erişmek oldu --extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'".

Bir env değişkenini dışa aktarın, ancak bash / shell geçmişinden kaçının (boşluk veya diğer yöntemlerle başa). Örneğin:

     export ANSIBLE_BECOME_PASS='<your password>'

Ekstra ansible_become_passdeğişkeni ansible-playbook, örn.

ansible-playbook playbook.yml -i inventories/dev/hosts.yml -u user --extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"

İyi alternatif cevaplar:


2

Parolanızı şifrelenmiş kasaya kodlayacak olan sesli kasayı kullanabilirsiniz . Bundan sonra playbooks'ta kasadan değişken kullanabilirsiniz.

Ansible tonoz hakkında bazı belgeler:
http://docs.ansible.com/playbooks_vault.html

Her ortam için kasa olarak kullanıyoruz. Kasayı düzenlemek için şu komutu verdik:
ansible-vault edit inventories/production/group_vars/all/vault

Kasa değişkenini çağırmak istiyorsanız ansible-playbook'u aşağıdaki parametrelerle kullanmanız gerekir:
ansible-playbook -s --vault-password-file=~/.ansible_vault.password

Evet, kasa şifresini yerel dizinde düz metin olarak saklıyoruz, ancak her sistem için root şifresini saklamak gibi daha tehlikeli değil. Kök parolası kasa dosyasının içindedir veya kullanıcı / grubunuz için sudoers dosyası gibi kullanabilirsiniz.

Sunucuda sudoers dosyasını kullanmanızı öneririm. Grup yöneticisi için örnek:
%admin ALL=(ALL) NOPASSWD:ALL



2

Beş yıl sonra, bunun hala çok alakalı bir konu olduğunu görebiliyorum. Benim durumumda en iyi bulduğum leucos'un cevabını sadece ansible araçları kullanarak (herhangi bir merkezi kimlik doğrulama, jeton veya herhangi bir şey olmadan) biraz yansıtmak. Bu, tüm sunucularda aynı kullanıcı adına ve aynı ortak anahtara sahip olduğunuzu varsayar. Bunu yapmazsanız, elbette daha spesifik olmanız ve ilgili değişkenleri ana bilgisayarların yanına eklemeniz gerekir:

[all:vars]
ansible_ssh_user=ansible
ansible_ssh_private_key_file=home/user/.ssh/mykey
[group]
192.168.0.50 ansible_sudo_pass='{{ myserver_sudo }}'

ansible-vault create mypasswd.yml
ansible-vault edit mypasswd.yml

Ekle:

myserver_sudo: mysecretpassword

Sonra:

ansible-playbook -i inv.ini my_role.yml --ask-vault --extra-vars '@passwd.yml'

En azından bu şekilde parolalara işaret eden daha fazla değişken yazmak zorunda kalmazsınız.


1

@ Toast38coza'nın üstündeki çözüm benim için çalıştı; şu sudo: evet şimdi Ansible'da kullanımdan kaldırıldı. Kullanım haline ve become_user yerine.

tasks:
 - name: Restart apache service
   service: name=apache2 state=restarted
   become: yes
   become_user: root

0

Ayrıca bash ortaya çıkarmak ve ihtiyaçlarınıza göre özelleştirmek için mümkün olan EXPECT BLOCK'u kullanabiliriz

- name: Run expect to INSTALL TA
  shell: |
    set timeout 100
    spawn /bin/sh -i

    expect -re "$ "
    send "sudo yum remove -y xyz\n"

    expect "$ "
    send "sudo yum localinstall -y {{ rpm_remotehost_path_for_xyz }}\n"

    expect "~]$ "
    send "\n"

    exit 0
  args:
  executable: /usr/bin/expect

0

Çok basit ve sadece değişken dosyaya ekleyin:

Misal:

$ vim group_vars/all

Ve bunları ekleyin:

Ansible_connection: ssh
Ansible_ssh_user: rafael
Ansible_ssh_pass: password123
Ansible_become_pass: password123

Teşekkürler, ama Ansible_become_pass yerine ansible_become_pass demek istediğinizi düşünüyorum.
Krishnom

0

Sadece bir zeyilname, bu yüzden son zamanlarda yaptığım sıkıntıdan başka kimse geçmiyor:

AFAIK, en iyi çözüm, toast38coza'nın genel hatları boyunca olanıdır. Parola dosyalarınızı ve oynatma kitabınızı statik olarak birbirine bağlamak mantıklıysa, şablonunu vars_files(veya include_vars) ile takip edin . Bunları ayrı tutmak istiyorsanız, kasa içeriğini komut satırında şu şekilde sağlayabilirsiniz:

ansible-playbook --ask-vault-pass -e@<PATH_TO_VAULT_FILE> <PLAYBOOK_FILE>

Geçmişe bakıldığında bu açıktır, ama işte gotchas:

  1. O kanlı @ işareti. Dışarıda bırakırsanız, ayrıştırma sessizce başarısız olur ve ansible-playbook, dosyayı daha önce hiç belirtmemişsiniz gibi devam eder.

  2. Kasanın içeriğini --extra-vars / -e komut satırı ile veya YAML kodunuzda açıkça almanız gerekir. --ask-vault-passBayrak (veya daha kullanılamaz olabilecek bir değer için istemi dışında siz) tek başına hiçbir şey yapmaz.

"@" Lerinizi ekleyip bir saat kazanın.


-3

Bu benim için çalıştı ... NOPASSWD ile /etc/sudoers.d/90-init-users dosyası oluşturuldu

echo "user ALL=(ALL)       NOPASSWD:ALL" > 90-init-users

burada "kullanıcı" kullanıcı kimliğinizdir.

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.