Nano Hash - криптовалюты, майнинг, программирование

Ansible некорневой пользователь sudo и повышение привилегий

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

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", ...}

Почему мне отказали в разрешении?

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

Я использую Ansible 2.1.1.0 и нацелен на Ubuntu 16.04. Если я использую параметры remote_user и sudo согласно Ansible ‹v1.9, он работает нормально, например: remote_user: david sudo: yes

Обновить

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

05.12.2016

  • Какое имя пользователя, удаленного пользователя, которого вы используете для выполнения первого ssh-соединения? 06.12.2016
  • Я думаю, что пользователь будет root, смените root вместо david, и он будет работать. 06.12.2016
  • @helloV - Я тоже пробовал добавить к задаче «стало правдой», и результат тот же. 06.12.2016
  • @Raul Hugo - имя пользователя david как на удаленной, так и на локальной машине. Если я удалю «стать_пользователем», он сработает, потому что по умолчанию используется root (согласно документации). Однако я хочу запускать его как «давид», а не как «корень». 06.12.2016
  • @DavB см. Мой обновленный ответ. 06.12.2016
  • Однако я хочу запускать его как 'david', а не как 'root'. - вы не можете. Ansible использует диспетчер пакетов APT и требует прав root. 06.12.2016
  • @techraf - пользователь david на удаленном сервере имеет привилегии sudo. Итак, если я использую remote_user: david и sudo: yes согласно ansible ‹1.9, он работает нормально (с предупреждениями об устаревании). Я обновил вопрос этой информацией. Я думал, что он должен работать так же с become_user и become_method. 06.12.2016
  • Потому что remote_user: david не действует. Вы уже сказали, что имя пользователя "david" на [] удаленной машине. А sudo - это псевдоним become. У вас ошибочное впечатление, что что-то изменилось. Единственная проблема в вашем playbook - become_user: david. 06.12.2016
  • Ну проблема была не доступной Вам нужно лучше понять, как работает sudo xD 06.12.2016

Ответы:


1

Почему мне отказали в разрешении?

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

По этим настройкам:

become: true
become_user: david
become_method: sudo

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


пользователь david на удаленном компьютере имеет привилегии sudo.

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

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

$ sudo whoami
root
$ sudo david whoami
david

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

sudo apt-get install sqlite3

нет:

sudo david apt-get install sqlite3

который завершится ошибкой с отображением очень точного сообщения Ansible.


Следующая инструкция по умолчанию будет расширена до пользователя root:

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

  tasks:
    - name: Just want to install sqlite3 for example...
      apt: name=sqlite3 state=present
06.12.2016
  • Спасибо @techraf за объяснение. Если я использую remote_user: david с become: true, похоже, все работает нормально. Верны ли эти настройки в данной ситуации? 06.12.2016
  • @DavB remote_user не имеет прямого отношения к параметрам, начинающимся с become. Это <user>, который вы используете в команде ssh <user>@<server>. В одном из своих комментариев вы сказали, что используете одного и того же пользователя david как на клиенте, так и на сервере, поэтому вы подключаетесь к ssh <server>. В этой ситуации remote_user: david не имеет никакого эффекта. Можешь включить, можешь убрать. Ничего не изменить. Проблема была с become_user: david. Только. 06.12.2016
  • Вам понадобится remote_user: david , если вы используете Ansible на своем (клиентском) компьютере, используя учетную запись с именем davb (или любую другую, кроме david). 06.12.2016
  • @DavB Я уже ответил на это в первом предложении жирным шрифтом. Если вы запустите диспетчер пакетов APT под другим пользователем, отличным от root, вы получите сообщение об ошибке. Так был написан APT. Не используйте его, если он вам не нравится. Вы можете установить программное обеспечение без APT, хотя вам придется все делать вручную. 06.12.2016
  • пользователь david имеет привилегии root. 06.12.2016
  • Вы читали ответ, который комментируете? В Unix нет такой вещи, как привилегии root. Либо процесс запущен от имени пользователя root, либо от имени другого пользователя. 06.12.2016
  • извините, наконец-то упала копейка. Большое спасибо за вашу помощь (и терпение)! 06.12.2016
  • Это очень неинтуитивно, если исходить из обычного пользовательского пространства, где sudo - для префикса всех команд управления, а sudo su или su root - для переключения на root. Спасибо за объяснение, я часами пытался найти причину этого, поскольку доступная документация не упоминает об этом. 01.04.2018

  • 2

    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
    
    05.12.2016
  • спасибо, но я не понимаю о чем вы. Я уже указал become: truebecome_method: sudo). Не могли бы вы уточнить? 06.12.2016
  • @helloV У меня также есть аналогичный вопрос по ansible здесь, где я не уверен, что делаю неправильно с become или become_user. Хотели посмотреть, сможете ли вы помочь? 11.02.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..