2015-11-04 14 views
7

Chciałbym użyć Ansible do zarządzania konfiguracją naszego klastra Hadoop (z systemem Red Hat).Odpowiedz: sudo, ale bez korzenia

Mam dostęp do sudo i mogę ręcznie ssh do węzłów do wykonywania poleceń. Jednak występują problemy podczas próby uruchomienia modułów Ansible w celu wykonania tych samych zadań. Chociaż mam dostęp sudo, nie mogę zostać rootem. Kiedy próbuję wykonać skrypty ansibl wymagające podwyższonych uprawnień, pojawia się błąd jak poniżej:

Niestety, awoolford użytkownik nie może wykonać „/ bin/bash -c-echo ZOSTAŃ został pomyślnie [...]/usr/bin/python /tmp/ansible-tmp-1446662360.01-231435525506280/copy 'as awoolford na [some_hadoop_node].

Patrząc przez documentation, myślałem, że nieruchomość become_allow_same_user może rozwiązać ten problem, a więc dodałem do ansible.cfg następujące:

[privilege_escalation] 
become_allow_same_user=yes 

Niestety, to nie działa.

Ten post sugeruje, że potrzebuję uprawnień do sudo /bin/sh (lub innej powłoki). Niestety nie jest to możliwe ze względów bezpieczeństwa. Oto urywek z /etc/sudoers:

root   ALL=(ALL) ALL 
awoolford  ALL=(ALL) ALL, !SU, !SHELLS, !RESTRICT 

Czy ansibl pracę w środowisku, jak to? Jeśli tak, co robię źle?

+0

Powiedziałeś, że możesz ręcznie ssh do węzła i wykonać polecenia, który to jest użytkownik? – frank

+0

Mogę 'sudo [some_command]' jako użytkownik 'awoolford' pod warunkiem, że nie znajduje się on na żadnej z list'! '(Patrz fragment z'/etc/sudoers'). –

+0

Czy możesz udostępnić przykładową grę/rolę, która zgłasza błąd? – ydaetskcoR

Odpowiedz

1

Po prostu nie można wykonać /bin/sh lub /bin/bash jako programów /etc/sudoers. Co możesz zrobić, to zmienić domyślną powłokę ansalyla na coś innego (zmienna executable w ansible.conf).

Ponieważ twoja polityka sudo domyślnie pozwala na wszystko (nie wydaje mi się to naprawdę bezpieczne), i przypuszczam, że ansible oczekuje powłoki kompatybilnej z sh, jako naprawdę brudny hack możesz skopiować /bin/bash do innej ścieżki/nazwy i ustaw odpowiednio zmienną executable (nie testowano).

+0

Dzięki @ LluísVilanova. To miłe obejście. –

0

W pliku PlayBook (some.yml) ustaw

runthisplaybook.yml

--- 
- hosts: label_which_will_work_on_some_servers 
    sudo: yes 

    roles: 
    - some_role_i_want_to_run 

Następnie w roli // zadania/main.yml dla działań, które trzeba uruchom jako sudo .. użyć czegoś podobnego become_user (gdzie common_user to zmienna zdefiniowana w domyślnych pewną rolę w \ plik main.yml jak common_user: "this_user_can_sudo":

- name: Run chkconfig on init script 
    command: "sudo -u root /sbin/chkconfig --add tomcat" 

# Set execute permission on run_jmeter_test.sh 
- name: Set execute permission on run_jmeter_test.sh 
    command: "chmod -R 755 {{ jmeter_perf_tests_results }}" 
    become_user: "{{ common_user }}" 

# OR Set execute permission on run_jmeter_test.sh 
- name: Set execute permission on run_jmeter_test.sh 
    command: "sudo -u firstuser sudo -u seconduser chmod -R 755 {{ jmeter_perf_tests_results }}" 
    become_user: "{{ common_user }}" 

# OR Set execute permission on run_jmeter_test.sh 
- name: Set execute permission on run_jmeter_test.sh 
    command: "chmod -R 755 {{ jmeter_perf_tests_results }}" 
    become_user: "{{ common_user }}" 

PS: Podczas pracy ansibl-Poradnik,

ansibl-PlayBook runthisplaybook.yml --sudo user = this_user_can_sudo -i gospodarzy.yml -u user_which_will_connect_from_source_machine --private klucz $ {DEPLOYER_KEY_FILE} --extra-vars "target_svr_type = $ {typ_serwera} deploy_environment = $ {DEPLOY_ENVIRONMENT} ansible_user = $ {ANSIBLE_USER}"

-1

myślę teraz sudo: yes jest depricated i wymień become: yes

--- 
- hosts: servers_on_which_you_want_to_run 
    become: yes 

    roles: 
    - some_role 

smiplist rozwiązaniem jest po prostu stworzyć ansible.cfg w katalogu PlayBook o następującej treści, jeśli nie akceptuje root użytkownika:

[defaults] 
sudo_user  = UsernameToWhichYouWantToUse 

Mam nadzieję, że rozwiąże to twój problem.