Обновить имя хоста, подключившись к приложению Ruby on Rails?

СЦЕНАРИЙ:

Я хочу, чтобы при запуске Linux-бокс подключался к веб-сайту Ruby on Rails, на котором есть список имен хостов, добавленных в модель. Окно Linux обновляет свое собственное имя хоста из следующей доступной записи имени хоста в списке И регистрирует свой MAC-адрес и IP-адрес на сайте rails. Жестко, верно?

Приложение Ruby on Rails

Host.rb (модель) ip_address:string, mac_address:string, hostname:string, available:boolean

Жесткая часть:

Я пытаюсь выяснить, как заставить Linux-бокс подключиться к сайту RoRs, чтобы увидеть все мои записи хостов, в которых будут перечислены все имена хостов. То есть:

id:1 hostname: "hostname-1", ip_address: nil, mac_address: nil, available: true
id:2 hostname: "hostname-2", ip_address: nil, mac_address: nil, available: true
id:3 hostname: "hostname-3", ip_address: nil, mac_address: nil, available: true

.. затем посмотрите на следующее доступное имя хоста и обновите себя до этого имени хоста, записывая mac_address и ip_address в эту запись.

После того, как Linux-бокс «загрузит» имя хоста, запись будет выглядеть так:

id:1 hostname: "hostname-1", ip_address: "192.168.1.10", mac_address: "00:13:EF:35:GH:00":, available: false
id:2 hostname: "hostname-2", ip_address: nil, mac_address: nil, available: true
id:3 hostname: "hostname-3", ip_address: nil, mac_address: nil, available: true

ЧТО Я ПРОБОВАЛ:

Я поместил новый файл в /etc/init.d/selfconfig

#! /bin/sh
# /etc/init.d/selfconfig

USER=root
HOME=/root

export USER HOME

# download remote /zip file with hostname inside
/usr/bin/wget -o /home/admin/selfconfig.zip http://examplewebsite.com/selfconfig.zip
# unzip the .zip file
/usr/bin/unzip -o /home/admin/selfconfig.zip /home/admin
# copy the hostname file to the primary hostname location
cp /home/admin/hostname /etc/hostname

exit 0

Это работает именно так, как я хочу, чтобы обновить имя хоста после перезагрузки, но файл имени хоста находится внутри статического файла .zip. Мне нужно иметь возможность динамически обновлять файл .zip или каким-то образом заставить Linux-бокс подключиться к самому сайту и получить список json или что-то в этом роде. Вот где я застрял.

ОБОСНОВАНИЕ:

Я собираюсь настроить около 150 таких машин, и это устранит НАСТОЛЬКО хлопот.

У кого-нибудь есть идеи?


person Devin    schedule 30.10.2014    source источник


Ответы (1)


Создайте контроллер в приложении Rails с методом:

def hostname
  host = Host.where(available: true).order(:id).first
  if host.present?
    render :text => host.hostname
  else
    render :text => 'No hostname available'
  end
end

Допустим, вы настроили маршрут для доступа к этому как http://examplewebsite.com/hostname. Вы можете получить имя хоста из сценария оболочки инициализации следующим образом:

lwp-request http://examplewebsite.com/hostname > /etc/hostname

Конечно, вы должны проверить исчерпание имени хоста, проверив возвращаемое значение lwp-request. Вы можете использовать curl или другой http-клиент для запроса необходимой информации, но я думаю, что это выходит за рамки вопроса.

Отправку MAC- и IP-адреса можно выполнить, добавив их в качестве параметров запроса GET следующим образом:

lwp-request http://examplewebsite.com/hostname?mac=$mac&ip=$ip > /etc/hostname

при условии, что вы собрали MAC- и IP-адреса в соответствующих переменных.

Затем на стороне рельсов вы можете регистрировать их следующим образом:

def hostname
  host = Host.where(available: true).order(:id).first
  if host.present?
    host.update_attributes({
      ip_address: params[:ip],
      mac_address: params[:mac] 
    })
    render :text => host.hostname
  else
    render :text => 'No hostname available'
  end
end
person kroky    schedule 30.10.2014
comment
Спасибо, это имеет большой смысл. Я собираюсь попробовать и посмотреть, что произойдет. Я приму в качестве ответа, если это сработает! - person Devin; 30.10.2014
comment
Один быстрый вопрос… как контроллер определяет, что клиент получает к нему доступ, и когда он будет производить изменение с available:true на available:false? (думаю, это два вопроса) - person Devin; 30.10.2014
comment
Ах, вы можете аутентифицироваться, например, с помощью секретного токена, так что только ваш клиент сможет получить к нему доступ — просто передайте токен в качестве другого параметра get и проверьте его на стороне rails. - person kroky; 30.10.2014
comment
По поводу доступного, да, я про него забыл, просто прописал его вместе с ip_address и mac_address как еще строчку: available: false - person kroky; 30.10.2014
comment
Привет еще раз, все выглядит очень многообещающе! Когда я помещаю строку lwp-request в мой файл /etc/init.d/selfconfig, я получаю ошибку /usr/bin/sh: bad interpreter: No such file or directory. Любые идеи? Я знаю, что это perl.. но я не уверен, что изменить. - person Devin; 31.10.2014
comment
ответил на мой предыдущий вопрос в этом сообщении, если кто-то еще столкнется с тем же заголовком stackoverflow.com/questions/26664545/ - person Devin; 31.10.2014
comment
@Devin, вы правы, это программа / модуль Perl, который я видел установленным почти на любом сервере Linux, который я встречал. Если он не установлен, вы можете установить его с помощью диспетчера пакетов вашего дистрибутива (например, libwww-perl в Ubuntu, а затем вам просто нужно указать правильный путь к нему, например, /usr/bin/lwp-request. Извините, я не не сделал этого в ответе, но для работы /bin/sh требуются полные пути Я думаю, что /bin/bash использует переменную env PATH и работает без полных путей. - person kroky; 31.10.2014