Ресурс Chef Bash не выполняется как указанный пользователь

11

Я пишу поваренную книгу шеф-повара для установки Hubot . В рецепте я делаю следующее:

bash "install hubot" do
  user hubot_user
  group hubot_group
  cwd install_dir
  code <<-EOH
    wget https://github.com/downloads/github/hubot/hubot-#{node['hubot']['version']}.tar.gz && \
    tar xzvf hubot-#{node['hubot']['version']}.tar.gz && \
    cd hubot && \
    npm install
  EOH
end

Однако, когда я пытаюсь запустить chef-client на сервере, устанавливающем поваренную книгу, я получаю разрешение на запись в каталог пользователя, который запускает chef-client, а не пользователя hubot. По какой-то причине npmпытается запустить не от того пользователя, который указан в ресурсе bash.

Я могу запустить sudo su - hubot -c "npm install /usr/local/hubot/hubot"вручную, и это приводит к желаемому результату (устанавливает hubot как пользователя hubot). Однако, кажется, что chef-client не выполняет команду как пользователь hubot. Ниже вы найдете выполнение chef-client. Заранее спасибо.

Saving to: `hubot-2.1.0.tar.gz'

     0K ......                                                100%  563K=0.01s

2012-01-23 12:32:55 (563 KB/s) - `hubot-2.1.0.tar.gz' saved [7115/7115]

npm ERR! Could not create /home/<user-chef-client-uses>/.npm/log/1.2.0/package.tgz
npm ERR! Failed creating the tarball.
npm ERR! couldn't pack /tmp/npm-1327339976597/1327339976597-0.13104878342710435/contents/package to /home/<user-chef-client-uses>/.npm/log/1.2.0/package.tgz
npm ERR! error installing hubot@2.1.0 Error: EACCES, permission denied '/home/<user-chef-client-uses>/.npm/log'

...

npm not ok
---- End output of "bash"  "/tmp/chef-script20120123-25024-u9nps2-0" ----
Ran "bash"  "/tmp/chef-script20120123-25024-u9nps2-0" returned 1
Артур Мальтсон
источник
Подожди, ты говоришь, что запускаешь chef-client как какой-то не пользователь root?
CJC
Это пользователь с правами sudo. Это тот же самый, который я использовал для начальной загрузки узла.
Артур Мальтсон
Но вы делаете "sudo chef-client", верно?
ЗАО
Вы, вероятно, должны запускать chef от имени пользователя root.
Майк Фидлер
Chef работает от имени пользователя root.
Артур Мальтсон

Ответы:

8

Проблема (скорее всего) не в том, что Chef запускает команду как неправильный пользователь, а в том, что оболочка, на которой выполняется ваш скрипт, не является оболочкой входа в систему. Это означает, что некоторые переменные окружения (например, HOME) не будут установлены так, как вы ожидаете, что приведет к тому, что npm попытается записать файлы в неправильном месте.

Проблема обсуждается в выпуске CHEF-2288 . Пока это остается выдающимся, вы можете попробовать добавить HOME=/home/hubot-userв свой блок кода до вызова npm.

ЗТС
источник
4

Взято из комментария в CHEF-2288 :

environment ({ 'HOME' => ::Dir.home('USERNAME'), 'USER' => 'USERNAME' })

Работал на меня!

В твоем случае:

environment ({ 'HOME' => ::Dir.home(hubot_user), 'USER' => hubot_user })

claptimes
источник
2
Предполагается, что hubot_userон уже был создан до запуска chef-client. Это потому, что Dir.homeкоманда запускается при загрузке файла, а не при выполнении рецепта. При создании новой машины это, скорее всего, произойдет до запуска любого из ваших пользовательских рецептов создания и приведет к сбою.
Расс Брэдберри
На заданный вопрос этот ответ работает отлично.
смотри
1
не на первой загрузке машины, это не так. это работает, только если пользователь уже существует на компьютере.
Расс Брэдберри
Во-вторых, это не решение проблемы, если chef также управляет данным пользователем, потому что этот код выполняется на этапе компиляции перед выполнением любого рецепта. вокруг него есть большие хаки, которые могут подтолкнуть его ко второму этапу, но ...... выполнение 'HOME' => "/ home / # {hubut_user}" будет работать, так как это просто передача строк - но, конечно, не хватает волшебное прикосновение.
острому
1

После: /server//a/432916/129232

Чтобы выполнить скрипт или команду от имени пользователя, вам нужно объединить su -l и bash -i , например:

 execute "npm_install" do
    command "su vagrant -l -c 'cd /shared-with-host/helperScripts/ && bash -i npm install -g q zombie should mocha coffee-script'" 
    action :run
  end

Из-за некоторых ошибок chef неправильно устанавливает среду для указанного пользователя при выполнении .

SKARAB
источник