ansible sudo: извините, у вас должен быть tty для запуска sudo

Мне нужно запускать плейбуки на коробках Vagrant и на aws, когда я настраиваю среду с формированием облака.

В файле Vagrant я использую ansible-local, и все работает нормально.

name: Setup Unified Catalog Webserver  
    hosts: 127.0.0.1  
    connection: local  
  become: yes  
  become_user: root
  roles: generic

Однако, когда я создаю экземпляр в AWS, ansible playbook завершается с ошибкой:
sudo: sorry, you must have a tty to run sudo
Это происходит потому, что он запускается от имени пользователя root и не имеет tty. Но я не знаю, как это исправить, не внося изменения в /etc/sudoers, чтобы разрешить !requiretty

Есть ли какие-либо флаги, которые я могу установить в файле ansible.cfg или в моем шаблоне Cloud Formation?

  "#!/bin/bash\n", "\n", "   
 echo 'Installing Git'\n","  
  yum --nogpgcheck -y install git ansible htop nano wget\n",
 "wget https://s3.eu-central-1.amazonaws.com/XXX -O /root/.ssh/id_rsa\n", 
"chmod 600 /root/.ssh/id_rsa\n", 
"ssh-keyscan 172.31.7.235 >> /root/.ssh/known_hosts\n",
 "git clone [email protected]:something/repo.git /root/repo\n", 
"ansible-playbook /root/env/ansible/test.yml\n

person Kate    schedule 24.02.2016    source источник
comment
Почему его нужно запускать как root?   -  person ydaetskcoR    schedule 24.02.2016


Ответы (3)


Я смог исправить это, установив конфигурацию transport = paramiko в ansible.cfg.

person user8252064    schedule 04.07.2017
comment
Отличное решение. Это сработало и для меня и гораздо менее навязчиво, чем принятый ответ. - person Jontia; 18.05.2018

Я нашел для себя следующие решения:
1. Замените requiretty в /etc/sudoers на sed run playbooks и измените его обратно.

 "#!/bin/bash\n", "\n", "  
 echo 'Installing Git'\n"," 
 yum --nogpgcheck -y install git ansible htop nano wget\n",  
 "wget https://s3.eu-central-1.amazonaws.com/xx/ansible -O /root/.ssh/id_rsa\n",  
 "chmod 600 /root/.ssh/id_rsa\n",   
  "ssh-keyscan 172.31.9.231 >> /root/.ssh/known_hosts\n",   
  "git clone [email protected]:somerepo/dev.git /root/dev\n",   
  "sed -i 's/Defaults    requiretty/Defaults    !requiretty/g' /etc/sudoers\n", 
  "\n", 
  "ansible-playbook /root/dev/env/ansible/uk.yml\n",   
  "\n",   
  "sed -i 's/Defaults    !requiretty/Defaults    requiretty/g' /etc/sudoers\n"   

ИЛИ 2. В ansible playbook указать переменную:

 - name: Setup 
 hosts: 127.0.0.1
 connection: local
 sudo: {{ require_sudo }}
 roles:
    - generic

Запуск в шаблоне AWS Cloud Formation будет

   "ansible-playbook -e require_sudo=False /root/dev/env/ansible/uk.yml\n"  

А для Vagrant в ansible.cfg можно указать

  require_sudo=True
  1. Так же в шаблоне CF возможно определить кто работает и передать переменную

    ansible-playbook -e$(id -u |egrep '^0$' > /dev/null && require_sudo=False || require_sudo=True; echo "require_sudo=$require_sudo") /apps/ansible/uk.yml

person Kate    schedule 25.02.2016
comment
sudo устарел в ansible, become и become_user поддерживаются для использования. - person sorin; 09.03.2017

Если вам нужно конкретное соединение: paramiko только в одном плейбуке, а не в глобальной конфигурации в ansible.cfg, вы можете добавить connection: paramiko в плейбук, например:

- name: Run checks after deployments
  hosts: all
  # https://github.com/paramiko/paramiko/issues/1369
  connection: paramiko
  gather_facts: True
person hiccupatron    schedule 12.06.2020