Jak określić hasło sudo dla Ansible w sposób nieinteraktywny?
Korzystam z instrukcji Ansible w następujący sposób:
$ ansible-playbook playbook.yml -i inventory.ini \
--user=username --ask-sudo-pass
Ale chcę uruchomić to w ten sposób:
$ ansible-playbook playbook.yml -i inventory.ini \
--user=username` **--sudo-pass=12345**
Czy jest jakiś sposób? Chcę maksymalnie zautomatyzować wdrażanie mojego projektu.
Odpowiedzi:
Możesz przekazać zmienną w wierszu poleceń przez
--extra-vars "name=value"
. Zmienna hasła Sudo toansible_sudo_pass
. Twoje polecenie wyglądałoby więc tak:Aktualizacja 2017 : Ansible 2.2.1.0 używa teraz var
ansible_become_pass
. Albo wydaje się, że działa.źródło
history -c
po wykonaniu yml..bash_history
.Dokumenty zdecydowanie nie zalecają ustawiania hasła sudo w postaci zwykłego tekstu, a zamiast tego używają
--ask-sudo-pass
w wierszu poleceń podczas uruchamianiaansible-playbook
Aktualizacja 2016:
Ansible 2.0 (nie 100%, gdy) oznaczony
--ask-sudo-pass
jako przestarzały. Doktorzy zalecają teraz używanie--ask-become-pass
zamiast tego, jednocześnie zamieniając korzystanie zsudo
wszystkich instrukcji wbecome
.źródło
Prawdopodobnie najlepszym sposobem na zrobienie tego - zakładając, że nie możesz użyć rozwiązania NOPASSWD dostarczonego przez scottod, jest użycie rozwiązania Mircea Vutcovici w połączeniu z Vault Ansible .
Na przykład możesz mieć taki poradnik:
Dołączamy tutaj plik o nazwie,
secret
który będzie zawierał nasze hasło sudo.Użyjemy ansible-vault, aby utworzyć zaszyfrowaną wersję tego pliku:
Poprosi Cię o hasło, a następnie otwórz domyślny edytor, aby edytować plik. Możesz umieścić
ansible_sudo_pass
tutaj.np .
secret
:Zapisz i wyjdź, teraz masz zaszyfrowany
secret
plik, który Ansible jest w stanie odszyfrować po uruchomieniu twojego playbooka. Uwaga: możesz edytować plik za pomocąansible-vault edit secret
(i wprowadzić hasło, którego użyłeś podczas tworzenia pliku)Ostatnim elementem układanki jest zapewnienie Ansible narzędzia,
--vault-password-file
które wykorzysta do odszyfrowaniasecret
pliku.Utwórz plik o nazwie
vault.txt
i wpisz hasło użyte podczas tworzeniasecret
pliku. Hasło powinno być ciągiem przechowywanym jako pojedynczy wiersz w pliku.Z Ansible Docs:
Wreszcie: możesz teraz uruchomić swój podręcznik z czymś takim
Powyższe zakłada następujący układ katalogów:
Możesz przeczytać więcej o Ansible Vault tutaj: https://docs.ansible.com/playbooks_vault.html
źródło
ansible-vault create group_vars/all/ansible.yml
i dodajansible_sudo_pass: yourpassword
tam. Nie trzeba zmieniać podręczników ani ekwipunkufatal: [localhost]: FAILED! => {"changed": false, "failed": true, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE", "parsed": false}
Patrząc na kod (
runner/__init__.py
), myślę, że prawdopodobnie możesz ustawić go w pliku ekwipunku:Wydaje się, że w
ansible.cfg
pliku konfiguracyjnym znajduje się również pewne postanowienie , ale nie jest teraz zaimplementowane (constants.py
).źródło
host_vars
lub,group_vars
a następnie zaszyfrowanie pliku przy użyciu ansible-vaultNie sądzę, aby ansible pozwoliło ci podać hasło we flagach, jak chcesz. Może być gdzieś w konfiguracjach, które można ustawić, ale spowoduje to, że używanie ansible będzie mniej bezpieczne i nie będzie zalecane.
Jedną rzeczą, którą możesz zrobić, to utworzyć użytkownika na maszynie docelowej i przyznać mu uprawnienia do sudo bez hasła do wszystkich poleceń lub ograniczonej listy poleceń.
Jeśli uruchomisz
sudo visudo
i wpiszesz wiersz taki jak poniżej, to użytkownik „privilegedUser” nie powinien wprowadzać hasła, gdy uruchamia coś takiegosudo service xxxx start
:źródło
Hasło sudo jest przechowywana jako zmienna o nazwie
ansible_sudo_pass
. Możesz ustawić tę zmienną na kilka sposobów:Na hosta, w pliku hostów zasobów reklamowych (
inventory/<inventoryname>/hosts
)Na grupę, w pliku grup zapasów (
inventory/<inventoryname>/groups
)Na grupę, w zmiennych grupowych (
group_vars/<groupname>/ansible.yml
)Na grupę, zaszyfrowane (
ansible-vault create group_vars/<groupname>/ansible.yml
)źródło
Możesz ustawić hasło dla grupy lub wszystkich serwerów jednocześnie:
źródło
Odrywałem włosy od tego, teraz znalazłem rozwiązanie, które robi to, co chcę:
1 zaszyfrowany plik na host zawierający hasło sudo
/ etc / ansible / hosts:
następnie dla każdego hosta tworzysz zaszyfrowany plik var w następujący sposób:
z zawartością
jak zorganizujesz hasło do skarbca (wpisz przez --ask-vault-pass) lub przez cfg, zależy od ciebie
na tej podstawie podejrzewam, że możesz po prostu zaszyfrować cały plik hosts ...
źródło
ansible-playback
. Musiałem użyć,-e @vault/filename.ext
aby użyć skarbca z moimansible-playbook
połączeniem.Bardziej sprytnym sposobem na to jest przechowywanie
sudo
hasła w bezpiecznym repozytorium, takim jak LastPass lub KeePass, a następnie przekazanie goansible-playbook
przy użyciu,-e@
ale zamiast zakodować zawartość w rzeczywistym pliku, możesz użyć konstrukcji-e@<(...)
do uruchomienia polecenia w podpowłokę i przekieruj swoje wyjście (STDOUT) do anonimowego deskryptora pliku, skutecznie przekazując hasło do-e@<(..)
.Przykład
Powyżej robi kilka rzeczy, podzielmy to.
ansible-playbook -i /tmp/hosts pb.yml
- oczywiście prowadzenie playbooka przez ansible-playbook$(lpass show folder1/item1 --password)"
- uruchamia interfejs CLI LastPasslpass
i pobiera hasło do użyciaecho "ansible_sudo_pass: ...password..."
- pobiera ciąg „ansible_sudo_pass:” i łączy go z hasłem podanym przezlpass
-e@<(..)
- łączy powyższe i łączy podpowłokę<(...)
jako deskryptor plikuansible-playbook
do wykorzystania.Dalsze doskonalenia
Jeśli wolisz nie pisać tego za każdym razem, możesz po prostu coś takiego. Najpierw utwórz alias w
.bashrc
taki sposób:Teraz możesz uruchomić swój poradnik w ten sposób:
Bibliografia
źródło
--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
Dlatego, że hasło znajduje się w deskryptorze pliku tymczasowego, nie jest ujawniane.Jeśli nie masz nic przeciwko utrzymywaniu haseł w plikach zwykłego tekstu, inną opcją jest użycie pliku JSON z parametrem --extra-vars (pamiętaj, aby wykluczyć plik z kontroli źródła):
Ansible obsługuje tę opcję od 1.3 .
źródło
możesz wpisać hasło sudo do swojego playbooka w pliku hosts:
źródło
Kilka razy sugerowano tutaj skrzynkę głosową, ale wolę git-crypt do szyfrowania poufnych plików w moich podręcznikach. Jeśli używasz git, aby zachować swoje podręczniki, to jest to proste. Problem, który znalazłem w Vault, jest taki, że nieuchronnie trafiam na zaszyfrowane kopie pliku, z którym chcę pracować i muszę go odszyfrować, zanim będę mógł pracować.
git-crypt
oferuje ładniejszy przepływ pracy IMO.Korzystając z tego, możesz umieścić swoje hasła w var w swoim playbooku i oznaczyć swój playbook jako zaszyfrowany plik w
.gitattributes
następujący sposób:Twój podręcznik będzie zaszyfrowany w Github. Następnie wystarczy zainstalować klucz szyfrujący na hoście, którego używasz do uruchomienia ansible, lub postępuj zgodnie z instrukcjami w dokumentacji, aby go skonfigurować
gpg
.Odpowiedzi na pytania dotyczące przekazywania
gpg
kluczy, takich jakssh-agent
klucze SSH do przesyłania dalej, są tutaj: /superuser/161973/how-can-i-forward-a-gpg-key-via-ssh-agent .źródło
Możesz użyć
sshpass
narzędzia, jak poniżej,źródło
Korzystanie z ansible 2.4.1.0 i następujących elementów powinno działać:
I po prostu uruchom podręcznik z tym ekwipunkiem jako:
źródło
Moim hackem do zautomatyzowania tego było użycie zmiennej środowiskowej i dostęp do niej poprzez
--extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"
.Wyeksportuj zmienną env var, ale unikaj historii bash / shell (poprzedzaj spacją lub innymi metodami). Na przykład:
Wyszukaj
ansible_become_pass
zmienną env podczas przekazywania dodatkowej zmiennej doansible-playbook
, np .:Dobre alternatywne odpowiedzi:
ansible_become_pass
. To jest przyzwoite. Jednak w przypadku paranoicznych zespołów, które muszą udostępniać hasła do repozytorium i wykonywać gry ansible z indywidualnymi kontami, mogą używać wspólnego hasła do repozytorium, aby nawzajem wymieniać hasło systemu operacyjnego (kradzież tożsamości). Zapewne musisz zaufać własnemu zespołowi?@
@ slm wygenerowane do deskryptora pliku tymczasowego i przy użyciu prefiksu do odczytu zmiennej ansible z deskryptora pliku . Unika przynajmniej historii bashów. Nie jestem pewien, ale mam nadzieję, że echo podpowłoki nie zostanie złapane i ujawnione podczas rejestrowania kontroli (np. Auditd).źródło
Możesz użyć skarbca ansible który twoje hasło w skarbcu szyfrowanym. Następnie możesz używać zmiennej z repozytorium w playbookach.
Trochę dokumentacji dotyczącej ansible vault:
http://docs.ansible.com/playbooks_vault.html
Używamy go jako skarbca dla środowiska. Aby edytować skarbiec, mamy polecenie jako:
ansible-vault edit inventories/production/group_vars/all/vault
Jeśli chcesz wywołać zmienną vault, musisz użyć playbooka Ansible z parametrami takimi jak:
ansible-playbook -s --vault-password-file=~/.ansible_vault.password
Tak, przechowujemy hasło do przechowalni w katalogu lokalnym w postaci zwykłego tekstu, ale nie jest to bardziej niebezpieczne, jak hasło roota sklepu dla każdego systemu. Hasło roota znajduje się w pliku repozytorium lub można je ustawić tak jak plik sudoers dla użytkownika / grupy.
Polecam używać pliku sudoers na serwerze. Oto przykład dla administratora grupy:
%admin ALL=(ALL) NOPASSWD:ALL
źródło
Po prostu zadzwoń do swojego playbooka
--extra-vars "become_pass=Password"
Become_pass = („ansible_become_password”, „ansible_become_password”)
źródło
Po pięciu latach widzę, że jest to nadal bardzo istotny temat. W pewnym sensie odzwierciedla odpowiedź Leucos, która wydaje mi się najlepsza w moim przypadku, przy użyciu tylko narzędzi ansible (bez scentralizowanego uwierzytelnienia, tokenów itp.). Zakłada się, że masz tę samą nazwę użytkownika i ten sam klucz publiczny na wszystkich serwerach. Jeśli nie, oczywiście musisz być bardziej szczegółowy i dodać odpowiednie zmienne obok hostów:
Dodaj:
Następnie:
Przynajmniej w ten sposób nie musisz pisać więcej zmiennych, które wskazują hasła.
źródło
Powyższe rozwiązanie autorstwa @ toast38coza działało dla mnie; tylko to sudo: tak jest już przestarzałe w Ansible. Zamiast tego należy użyć funkcji Zostań i zostań_użytkownikiem .
źródło
możemy również użyć EXPECT BLOCK w ansible, aby spawnować bash i dostosowywać go zgodnie z twoimi potrzebami
źródło
Bardzo proste i dodaj tylko w pliku zmiennych:
Przykład:
I dodaj te:
źródło
To tylko dodatek, więc nikt inny nie przechodzi przez irytację, którą ostatnio zrobiłem:
AFAIK, najlepszym rozwiązaniem jest jedno z ogólnych założeń powyższego toast38coza. Jeśli sensowne jest powiązanie plików haseł i podręcznika ze sobą statycznie, postępuj zgodnie z jego szablonem za pomocą
vars_files
(lubinclude_vars
). Jeśli chcesz je rozdzielić, możesz podać zawartość skarbca w wierszu poleceń w następujący sposób:Z perspektywy czasu jest to oczywiste, ale oto gotcha:
Ten cholerny znak @ . Jeśli go pominiesz, parsowanie nie powiedzie się po cichu , a playbook ansible będzie postępował tak, jakbyś nigdy nie określił pliku.
Musisz jawnie zaimportować zawartość skarbca za pomocą wiersza polecenia --extra-vars / -e lub w kodzie YAML.
--ask-vault-pass
Flaga nie ma niczego sobie (oprócz poprosi o wartości, które mogą lub nie mogą być wykorzystane później) zrobić.Możesz dołączyć swoje „@” i zaoszczędzić godzinę.
źródło
To działało dla mnie ... Utworzono plik /etc/sudoers.d/90-init-users za pomocą NOPASSWD
gdzie „użytkownik” jest twoim identyfikatorem użytkownika.
źródło