Удалить клиента с новой строкой в ​​имени

Итак, это началось, потому что я пытался заставить автоматически масштабируемые узлы самостоятельно регистрироваться в Chef. У меня было следующее в моем файле client.rb:

node_name "some_prefix-#{`hostname`}"

идея заключалась в том, что каждый узел будет иметь один и тот же префикс, но суффикс на основе имени хоста. К сожалению, hostname возвращает строку с \n в конце. Chef с радостью разрешил мне создать этот клиент, но он никак не может получить к нему доступ.

knife client show some_prefix-myHostname
knife client show "some_prefix-myHostname\n"
knife client show "some_prefix-myHostname%0A"

все три приводят к 404

knife client list

показывает клиента и пустую новую строку после него.

Я исправил свой шаблон client.rb, но не могу избавиться от узлов, которые я создал с новой строкой в ​​их именах. Я пробовал использовать нож, webui и даже вручную использовать библиотеку Chef::REST в irb, но все приводит к ошибке 404.

Любые идеи?

РЕДАКТИРОВАТЬ: я также пробовал knife client bulk delete, но это тоже не удается. Похоже, что библиотека REST очищает URL-адрес и удаляет новую строку перед попыткой отправить запрос.


person Tejay Cardon    schedule 14.04.2015    source источник
comment
Идеи из головы: knife client show 'some_prefix-myHostname\n' (одинарная кавычка, чтобы избежать интерполяции в библиотеке). Или пытаетесь дважды избежать этого, как knife client show 'some_prefix-myHostname\\n' ?   -  person Tensibai    schedule 15.04.2015
comment
Не могли бы вы отключить что-то еще? Например, я считаю, что \s$ будет соответствовать всему, что заканчивается любым пробелом. У вас есть клиенты, которым вы хотите оставить этот конец пробелом?   -  person Josh Edwards    schedule 15.04.2015
comment
Нет, это были просто несчастные случаи, от которых я никак не могу избавиться. Но никакое совпадение не поможет. Код получит список, проверит соответствие, а затем попытается отправить запрос REST для удаления каждого узла. Сопоставление всех происходит на стороне клиента, и окончательный запрос на фактическое удаление завершается ошибкой. Я подозреваю, что это потому, что синтаксический анализатор URI удалит новую строку.   -  person Tejay Cardon    schedule 15.04.2015
comment
У меня была такая же проблема некоторое время назад. Забыл раздеть hostname. Единственное, что может сработать в этом случае, это самостоятельно зайти в базу и починить клиент. Я не хотел этого делать, мне было проще переустановить сервер Chef, потому что у меня есть вся конфигурация (включая узлы и клиенты) в репозитории.   -  person Draco Ater    schedule 16.04.2015


Ответы (2)


Вы можете попробовать использовать knife raw, который позволяет отправлять запросы непосредственно в API Chef Server.

knife raw /nodes/<node-name>
knife raw delete -m /nodes/<node-name>

Это сработало для меня по аналогичной проблеме с недопустимым именем роли.

person Ron L    schedule 29.05.2015

Это известная ошибка в шеф-сервере. Я не смог это проверить - на моей текущей версии сервера (12) возникает ошибка:

Chef::Exceptions::ValidationFailed: Option name's value test\n does not match regular expression /^[\-[:alnum:]_\.]+$/

Но вы можете использовать chef-API, чтобы отменить это вручную, как описано (наоборот) в отчете об ошибке выше:

chef > api.get("/clients").keys
=> ["acme-validator", "some_prefix-myHostname\n"]
chef > api.put("/clients/some_prefix-myHostname\n", name: "some_prefix-myHostname"); nil   
=> nil
chef > api.get("/clients").keys
=> ["acme-validator", "some_prefix-myHostname"]

Я уже мог изменить порядок операторов и заменить «foobar» на «some_prefix-myHostname».

Я также думаю, что использование API должно позволить вам удалить клиента вручную:

api.delete("/clients/some_prefix-myHostname\n")
person Florian Neumann    schedule 16.04.2015
comment
спасибо за идею. К сожалению, наоборот не получается. Остальная конечная точка не может содержать '/n', только данные json могут. :( - person Tejay Cardon; 17.04.2015
comment
Хм.. печально.. :( - person Florian Neumann; 17.04.2015
comment
@TejayCardon - единственная идея, которая у меня осталась, это: сделать knife download для резервного копирования всего, что вы хотите сохранить, сделать chef-server-ctl cleanse для удаления всех данных (для этого шага впоследствии потребуется reconfigure - я еще не использовал его), а затем поставить ваши вещи снова в сети с knife upload. Я использовал эти шаги, чтобы перейти от принятого шеф-повара к версии сообщества. - person Florian Neumann; 17.04.2015
comment
Да, это может сделать это. Я даже пытался вручную сгенерировать URI и передать его в пользовательский интерфейс, но затем сервер выдал ошибку. Я думаю, что мне придется зайти в базу данных, чтобы исправить это. Но мы, вероятно, начнем с чистого сервера для Chef 12 через месяц или два, так что я могу просто не беспокоиться. - person Tejay Cardon; 18.04.2015
comment
Мне жаль, что я не помог и удачи в настройке базы данных. - person Florian Neumann; 18.04.2015
comment
спасибо за попытку. Не ваша вина, что не было найдено правильного ответа. Ваши идеи были великолепны. - person Tejay Cardon; 18.04.2015