Сбой сборки Packer из-за того, что для sudo требуется tty

Моя сборка упаковщика завершается со следующим сообщением:

sudo: sorry, you must have a tty to run sudo.

Мой хост — Windows 8 с vagrant и virtualbox, мой гость — centos7. При исследовании я понимаю, что причиной сообщения является отсутствие tty для sudo. Но у меня есть следующее в ks.cfg:

sed -i 's/^.*requiretty/#Defaults requiretty/' /etc/sudoers

Может ли проблема заключаться в том, что мне нужно что-то установить на стороне Windows vagrant ssh, чтобы был создан псевдо-терминал?

Это мой первый опыт работы с упаковщиком.

Я использую сборку упаковщика, которую скачал.

packer.json ниже:

{
  "variables": {
    "version": "{{env `VERSION`}}"
  },
  "provisioners": [
    {
      "type": "shell",
      "execute_command": "sudo {{.Vars}} sh {{.Path}}",
      "scripts": [
        "scripts/vagrant.sh",
        "scripts/vmtools.sh",
        "scripts/cleanup.sh",
        "scripts/zerodisk.sh"
      ]
    }
  ],
  "post-processors": [
    {
      "type": "vagrant",
      "output": "INSANEWORKS-CentOS-7.0-x86_64-{{user `version`}}-{{.Provider}}.box"
    }
  ],
  "builders": [
    {
      "type": "virtualbox-iso",
      "iso_url": "http://ftp.iij.ad.jp/pub/linux/centos/7/isos/x86_64/CentOS-7-x86_64-NetInstall-1503.iso",
      "iso_checksum": "498bb78789ddc7973fe14358822eb1b48521bbaca91c17bd132c7f8c903d79b3",
      "iso_checksum_type": "sha256",
      "ssh_username": "vagrant",
      "ssh_password": "vagrant",
      "ssh_wait_timeout": "45m",
      "ssh_disable_agent": "true",
      "boot_command": [
        "<tab> text ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks.cfg<enter><wait>"
      ],
      "disk_size": "40000",
      "hard_drive_interface": "sata",
      "guest_additions_path": "VBoxGuestAdditions_{{.Version}}.iso",
      "guest_additions_sha256": "7b61f523db7ba75aebc4c7bb0cae2da92674fa72299e4a006c5c67517f7d786b",
      "guest_os_type": "RedHat_64",
      "headless": "true",
      "http_directory": "http",
      "shutdown_command": "sudo /sbin/halt -p",
      "vboxmanage": [
        [ "modifyvm", "{{.Name}}", "--memory", "1024" ],
        [ "modifyvm", "{{.Name}}", "--cpus", "1" ]
      ]
    }
  ]
}

Заранее спасибо.


person Harris.Atlarge    schedule 03.08.2015    source источник


Ответы (2)


Вы должны включить PTY в вашем ssh-соединении. Добавьте в свой раздел билдеров следующий элемент конфигурации:

"ssh_pty" : "true"

См. также https://packer.io/docs/templates/communicator.html#ssh_pty.

Ваша «execute_command» в разделе «Provisioner» должна быть "execute_command" : "echo 'vagrant' | {{ .Vars }} sudo -E -S sh '{{ .Path }}'"

person Sandra Parsick    schedule 04.08.2015
comment
Спасибо! Я попытаюсь и сообщу, если это решит проблему - person Harris.Atlarge; 05.08.2015
comment
Это правильный ответ. Жаль, что я не видел это вчера, потому что это сэкономило бы мне много времени. Просто чтобы немного уточнить, что вам нужно сделать, вы хотите что-то вроде этого "builders" : [ { "type" : "virtualbox-iso", "communicator": "ssh", "ssh_pty": "true", - person Dan Finucane; 11.08.2015
comment
В предыдущей версии ssh_pty=true было значением по умолчанию. Начиная с версии 0.8.0 он изменился. См. github.com/mitchellh/packer/issues/1804. - person Sandra Parsick; 11.08.2015
comment
Спасибо. Работал на меня. - person SBel; 11.08.2015
comment
Это было решением. Я действительно удивлен, что в различных репозиториях, использующих упаковщик, это не прояснено. Спасибо большое. - person LoganEtherton; 23.05.2018

Для аналогичного сообщения об ошибке — «sudo: нет tty и не указана программа askpass» — я нашел решение в этой статье:

http://blog.endpoint.com/2014/03/provisioning-development-environment_14.html

В дополнение к добавлению "ssh_pty" : "true" в раздел построителя добавьте следующий поставщик:

{
  "type": "shell",
  "execute_command": "echo '{{user `ssh_pass`}}' | {{ .Vars }} sudo -E -S sh '{{ .Path }}'",
  "inline": [
    "echo '%sudo    ALL=(ALL)  NOPASSWD:ALL' >> /etc/sudoers"
  ]
}

Куча:

  • Хост — Mac
  • Тип сборки упаковщика - virtualbox-iso
  • (используя бродягу)
person Yair Segal    schedule 10.01.2017