2016-12-05 9 views
2

Я установил ящик с пользователем david, у которого есть привилегии sudo. Я могу отправить ssh в поле и выполнить операции sudo, такие как apt-get install. Когда я пытаюсь сделать то же самое, используя Ansible's «стать привилегией эскалации», я получаю ошибку permission denied. Так простой Playbook может выглядеть следующим образом:Наблюдаемый пользователь root-пользователя, не являющийся пользователем root, и эскалация привилегий «стать»

simple_playbook.yml:

--- 
- name: Testing... 
    hosts: all 
    become: true 
    become_user: david 
    become_method: sudo 

    tasks: 
    - name: Just want to install sqlite3 for example... 
     apt: name=sqlite3 state=present 

я запускаю этот сборник пьес с помощью следующей команды:

ansible-playbook -i inventory simple_playbook.yml --ask-become-pass 

Это дает мне подсказку для пароля, который я даю, и я получаю следующую ошибку (сокращенно):

fatal: [123.45.67.89]: FAILED! => {... 
failed: E: Could not open lock file /var/lib/dpkg/lock - open (13: 
Permission denied)\nE: Unable to lock the administration directory 
(/var/lib/dpkg/), are you root?\n", ...} 

Почему я получаю ng разрешено?

Дополнительная информация

Я бегу анзибль 2.1.1.0 и Таргетинг коробку Ubuntu 16.04. Если я использую remote_user и sudo варианты согласно анзибль < v1.9, он отлично работает, как это: remote_user: david sudo: yes

Update

Локальные и удаленные имена пользователей одинаковы. Чтобы получить эту работу, мне просто нужно было указать become: yes (см. Ответ @ techraf):

+0

Что такое имя пользователя, удаленный пользователь, который вы используете, чтобы выполнить первое соединение SSH? –

+0

Я думаю, что теперь пользователь станет root, замените корень вместо david, и он будет работать. –

+0

@helloV - Я также попытался добавить «стать истинным» к задаче, и результат будет таким же. – DavB

ответ

11

Why am I getting permission denied?

Поскольку APT требует корневых разрешений (см ошибки: are you root?) и вы работаете задачи, как david.

За эти параметры:

become: true 
become_user: david 
become_method: sudo 

анзибль становится david использованием sudo метода. Он в основном запускает свой скрипт Python с sudo david спереди.


the user 'david' on the remote box has sudo privileges.

Это означает david может выполнять команды (некоторые или все) с помощью sudo -executable изменить эффективный пользователь для дочернего процесса (команды). Если имя пользователя не указано, этот процесс выполняется как учетная запись root.

Сравните результаты этих двух команд:

$ sudo whoami 
root 
$ sudo david whoami 
david 

Перейти к APT проблемы, вы (из CLI), а также анзибль (соединяясь с SSH, используя учетную запись) необходимо выполнить:

sudo apt-get install sqlite3 

нет:

sudo david apt-get install sqlite3 

, который выйдет из строя с очень точным сообщением Ansible.


Следующая Playbook будет обостряться по умолчанию для привилегированного пользователя

--- 
- name: Testing... 
    hosts: all 
    become: true 

    tasks: 
    - name: Just want to install sqlite3 for example... 
     apt: name=sqlite3 state=present 
+0

Спасибо @techraf за объяснение. Если я использую 'remote_user: david' с' стать: true', он работает нормально. Правильны ли эти настройки в этой ситуации? – DavB

+0

@DavB 'remote_user' не имеет прямого отношения к параметрам, начинающимся с' стать'. Это '' вы используете в команде 'ssh @'. В одном из ваших комментариев вы сказали, что используете одного и того же пользователя 'david' как на клиенте, так и на сервере, поэтому вы связываетесь с' ssh '. В этой ситуации 'remote_user: david' ** не действует **. Вы можете включить его, вы можете удалить его. Ничего не будет меняться. Проблема заключалась в том, что 'становился_усером: david'. Только. – techraf

+1

Вам понадобится 'remote_user: david' **, если ** вы запускали Ansible на своей (клиентской) машине, используя учетную запись с именем' davb' (или любой другой, чем 'david'). – techraf

1

remote_user - david. Позвоните по сценарию с --ask-pass и дайте пароль для david. Если у david нет пароля sudo без пароля, вы также должны называть его --ask-become-pass.

- name: Testing... 
    hosts: all 
    remote_user: david 
    become: true 
    become_method: sudo 

    tasks: 
    - name: Just want to install sqlite3 for example... 
     apt: name=sqlite3 state=present 
+0

, но я не понимаю, что вы имеете в виду. У меня уже есть «стать: true» (и «стать_метод: sudo'). Не могли бы вы уточнить? – DavB

+0

@helloV У меня также есть аналогичный вопрос о невозможности [здесь] (https://stackoverflow.com/questions/48724920/copy-files-to-remote-servers-but-in-a-directory-which-belongs-to- some-other-user), где я не уверен, что я делаю с «стать» или «становиться». Хотел посмотреть, сможете ли вы помочь? – user1950349

 Смежные вопросы

  • Нет связанных вопросов^_^