web-dev-qa-db-ja.com

Vagrantのシステムクロックを自動的に修正する方法

タイムゾーンを修正する方法

前回、迷惑サーバーでシステムクロックを調整する方法を見つけました。しかし、私が放浪者を停止して再開すると、システムクロックは常に9時間遅れます。 ntpコマンドを使用して手動で調整できますが、システムクロックを自動的に調整する方法を知りたいです。

以下を試しましたが、まだ機能しません。何か提案はありますか?

VirtualBox内のホストウェイクアップ時に時刻を同期する方法

19
Sho

私が使用する方法で、プロバイダー固有ではないはずですが、Vagrantfileに以下を追加します

  config.vm.provision :Shell, :inline => "Sudo rm /etc/localtime && Sudo ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime", run: "always"

「/ Europe/Paris」を設定したいタイムゾーンに置き換える必要があります

31

受け入れられた回答はタイムゾーン間を移動する人々を考慮に入れておらず、エンドユーザーがVagrantfileを変更するだけでなくvagrant up

スコットP.の回答を基に、VMタイムゾーンをホストのtzに自動的に一致させる、より柔軟なソリューションを示します。スニペットのEtc/GMTタイムゾーンの選択にタイプミス/ミスがあります。 POSIXのGMT + 7により、7時間遅れるが設定されます( Wikiの説明 を参照)。したがって、オフセットを交換する必要があります。

Vagrant.configure("2") do |config|
require 'time'
offset = ((Time.zone_offset(Time.now.zone) / 60) / 60)
timezone_suffix = offset >= 0 ? "-#{offset.to_s}" : "+#{offset.to_s}"
timezone = 'Etc/GMT' + timezone_suffix
config.vm.provision :Shell, :inline => "Sudo rm /etc/localtime && Sudo ln -s /usr/share/zoneinfo/" + timezone + " /etc/localtime", run: "always"
end
7
Benny K

タイムゾーンを自動検出するわずかに改善されたバージョン:

自動検出部分は here から取得されました。

Vagrant.configure("2") do |config|
  require 'time'
  offset = ((Time.zone_offset(Time.now.zone) / 60) / 60)
  timezone_suffix = offset >= 0 ? "+#{offset.to_s}" : "#{offset.to_s}"
  timezone = 'Etc/GMT' + timezone_suffix
  config.vm.provision :Shell, :inline => "Sudo rm /etc/localtime && Sudo ln -s /usr/share/zoneinfo/" + timezone + " /etc/localtime", run: "always"
end
3
Scott P.

Vagrant Guest OSの時刻が7日間ずれていました。ゲストの追加とntpがゲストマシンにインストールされていなかったため、上記の方法は私にはうまくいきませんでした。

https://askubuntu.com/a/683136/119371 のハックを使用して問題を解決しました

cfg.vm.provision "Shell", inline: "date -s \"$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z\"", run: "always", privileged: true, upload_path: "/home/vagrant/tmp/vagrant-Shell"

上記の方法は、ゲストOSの時刻をホストマシンや他のNTPサーバー)と同期しません。HTTPリクエストをgoogle.comに送信し、システム時刻をHTTP応答ヘッダーの時刻で更新しますフィールド。

したがって、インターネット接続の速度と待ち時間によっては、更新された時間が数ミリ秒から数秒(通常<100ms)ずれる可能性があります。しかし、ほとんどの場合それは問題になりません。

何らかの理由でcurlを使用したくない場合は、以下がwgetバージョンです。

cfg.vm.provision "Shell", inline: "date -s \"$(curl -I google.com 2>&1 | grep Date: | cut -d' ' -f3-6)Z\""
2
Joyce Babu

私は得ました:

[vagrant@ansiblecontrol ~]$ date -s \"$(curl -I google.com 2>&1 | grep Date: | cut -d' ' -f3-6)Z\"
date: extra operand ‘2018’
Try 'date --help' for more information.

これは私にとってはうまくいきます:

Sudo date -s "$(curl -I google.com 2>&1 | grep Date: | cut -d' ' -f3-6)Z"
Sun Apr  1 16:36:59 CEST 2018

したがって、「\」エスケープ文字を削除しました。

2
Peter de Zwart

@Benny K.の回答( https://stackoverflow.com/a/46778032/3194807 )に基づいて、夏時間を考慮に入れます:

require "time"
offset = ((Time.zone_offset(Time.now.zone) / 60) / 60) + (Time.now.dst? ? 1 : 0)
timezone_suffix = offset >= 0 ? "-#{offset.to_s}" : "+#{offset.to_s}"
timezone = 'Etc/GMT' + timezone_suffix

tzShellProvision = <<_Shell_
    ln -fs /usr/share/zoneinfo/#{timezone} /etc/localtime
    dpkg-reconfigure -f noninteractive tzdata
_Shell_

default.vm.provision :Shell, inline: tzShellProvision, run: "always"