Часом правильний часовий пояс сервера важливий для правильного функціонування сервісів, які на ньому біжать, і нещодавно переді мною постало завдання автоматично встановлювати правильний часовий пояс відповідно до місцезнаходження сервера у Azure Cloud. Мені необхідно було автоматично встановити правильний часовий пояс під час створення віртуальної машини за допомогою Тераформ. Я мав зробити це на серверах Ubuntu в Azure і ось просте й елегантне рішення яке я знайшов:
Визначаємо часовий пояс сервера по його місцезнаходженню з World Time API
Неймовірний ресурс, що дозволяє отримувати всю необхідну інформацію в JSON чи текстовому форматі.
Наприклад:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# curl "http://worldtimeapi.org/api/ip" { "abbreviation": "EEST", "client_ip": "99.168.22.12", "datetime": "2023-04-19T14:49:15.009388+03:00", "day_of_week": 3, "day_of_year": 109, "dst": true, "dst_from": "2023-03-26T01:00:00+00:00", "dst_offset": 3600, "dst_until": "2023-10-29T01:00:00+00:00", "raw_offset": 7200, "timezone": "Asia/Singapore", "unixtime": 1681904955, "utc_datetime": "2023-04-19T11:49:15.009388+00:00", "utc_offset": "+03:00", "week_number": 16 } |
Для отримання тієї ж інформації в текстовому форматі додаємо “.txt
” :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# curl "http://worldtimeapi.org/api/ip.txt" abbreviation: +08 client_ip: 4.188.111.99 datetime: 2023-04-19T20:24:33.870226+08:00 day_of_week: 3 day_of_year: 109 dst: false dst_from: dst_offset: 0 dst_until: raw_offset: 28800 timezone: Asia/Singapore unixtime: 1681907073 utc_datetime: 2023-04-19T12:24:33.870226+00:00 utc_offset: +08:00 |
І тепер часовий пояс можна легко отримати за допомогою стандартних bash
команд “grep
” та”cut
” як я демонструю нижче:
1 2 |
$ curl -s "http://worldtimeapi.org/api/ip.txt" | grep "timezone" | cut -d" " -f 2 Asia/Singapore |
В Ubuntu встановити часовий пояс можна як:
1 |
# timedatectl set-timezone {timezone} |
Тепер нам треба використати вивід від World Time API як аргумент до команди timedatectl
. Робимо це так:
1 |
sudo timedatectl set-timezone `curl -s "http://worldtimeapi.org/api/ip.txt" | grep "timezone" | cut -d" " -f 2` |
Зверніть увагу на зворотні одинарні лапки навколо curl… команди! Це означає “заповнити це місце результатом виконання команди”.
І нарешті останній шматочок мозаїки:
Задаємо часовий пояс автоматично в Тераформ
Команду вище використовуємо у remote-exec
провіженері відразу по створенню віртуальної машини:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
provisioner "remote-exec" { connection { host = self.public_ip_address type = "ssh" user = var.vm_user private_key = file(var.private_key) } inline = [ "some usefull stuff", "sudo timedatectl set-timezone `curl -s \"http://worldtimeapi.org/api/ip.txt\" | grep timezone | cut -d\" \" -f 2`", "sudo timedatectl set-ntp true", "timedatectl" ] } |
Останні три команди роблять наступне: встановлює часовий пояс сервера відповідно до його розташування, вмикає NTP синхронізацію, і, нарешті, виводить поточну інформацію про дату/час та часовий пояс на екран, щоб мати можливість упевнитись, що все правильно.
Ось і все! Успіхів!