Packerでパッケージ化するときにUbuntu 16.04で「apt-get upgrade -y」を実行するときに対話型ダイアログを回避するにはどうすればよいですか?


27

私が使用していパッカーを Ubuntuの16.04画像に基づいてAWS AMIを作成します。最初は、アップグレードを行っています。

sudo apt-get update
sudo apt-get upgrade -y

プロビジョニング担当者セクションの関連部分は次のとおりです。

"provisioners": [
  {
    "type": "shell",
    "inline": [
      "sudo apt-get update",
      "sudo apt-get upgrade -y"
    ]
  }
]

ただし、インタラクティブなダイアログがポップアップするため、自動化が中断されます。

amazon-ebs: Found kernel: /boot/vmlinuz-4.4.0-72-generic
amazon-ebs: A new version of /boot/grub/menu.lst is available, but the version installed
amazon-ebs: currently has been locally modified.
amazon-ebs:
amazon-ebs: 1. install the package maintainer's version
amazon-ebs: 2. keep the local version currently installed
amazon-ebs: 3. show the differences between the versions
amazon-ebs: 4. show a side-by-side difference between the versions
amazon-ebs: 5. show a 3-way difference between available versions
amazon-ebs: 6. do a 3-way merge between available versions (experimental)
amazon-ebs: 7. start a new shell to examine the situation

私もexport DEBIAN_FRONTEND=noninteractive前に設定しようとしました(この回答で推奨されています)。残念ながら、違いはありません。

質問:

  • 反復ダイアログを通過する方法はありますか(オプション1を選択することで問題ありません)。
  • 代わりに、アップグレードを避け、代わりにAMIが最新であり、重要なセキュリティパッチが含まれていることを信頼する方が良いでしょうか?

背景:これは「ビルダー」セクションの関連部分であり、利用可能な最新のAMIを使用するように構成しました。

"builders": [{
  "type": "amazon-ebs",
  "region": "eu-central-1",
    ...
    "source_ami_filter": {
        "filters": {
            "virtualization-type": "hvm",
            "name": "*ubuntu-xenial-16.04-amd64-server-*",
            "root-device-type": "ebs"
        },
        "owners": ["099720109477"],
        "most_recent": true
    },
  ...
}]

:とフラグのnoniteractive両方でapt-get updateを実行すると、モードが機能することがわかります。-y-q

回答:


21

コマンドのこのシーケンスは私のために働く:

apt-get update
DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq

ですから、DEBIAN_FRONTEND=noninteractive正しいですが、-qフラグも必要です。

ソース:https : //github.com/moby/moby/issues/4032


2
それを(おそらく?)単純化できapt-get update ; DEBIAN_FRONTEND=noninteractive apt-get upgrade -yqます。私は何もプロンプトを出さないと思う apt-get updateので、おそらく必要DEBIAN_FRONTENDではないので、あなたは本当に必要とせずexport DEBIAN_FRONTEND、あなたの環境の残りを通して存在し続ける必要があります。あなたにとって重要なあらゆる程度に。
マイケルモール

@MichaelMol正常に動作します。回答を更新しました。
フィリップクラッセン

FWIW、これはapt-getが対話を必要とするパッケージをスキップするだけで、アップグレードしないことにつながる可能性があります(「パッケージXの手動アップグレードが必要」に関するログに単語を残します)。パッチを当てたパッケージを入手することが目的である場合、それは進むべき道ではありません。
テンシバイ

11

あなたの問題は、grubファイルの変更がucfdebconfではなく付着することです。aptリストのこの事件ごとにあなたは一人ではありません。

回避策として、askunbuntuでこの答えを見つけました。menu.lstUCF構成システムからを削除するだけで十分です。

"provisioners": [
  {
    "type": "shell",
    "inline": [
      "sudo ucf --purge /boot/grub/menu.lst"
      "sudo apt-get update",
      "sudo UCF_FORCE_CONFFNEW=YES apt-get upgrade -y"
    ]
  }
]

これにより、grubの質問を回避できます。ucfを使用する他のパッケージもメンテナーパッケージバージョンを使用することに注意してください。ベースamiから作成する場合、これは問題になりませんが、注意する価値があります。


現在、私の回避策は安定しています。それでも、別の解決策があることを知っておくと良いでしょう。
フィリップクラッセン

私はUbuntuの18.04でGRUBと同様の問題があった、と私は信じている。このucf修正は、@PhilippClaßenで答え内のコマンドと一緒に完全なソリューションに含まれるべきである
RichVel

2

Philippの答え​​に追加するには、使用している場合は、次のように後で変数sudoを設定する必要がありますDEBIAN_FRONTEND

apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq

または、sudo -Eが必要ですが、これはまだ「ハング」を無効にし、パッケージをスキップするだけで、期待どおりにアップグレードされません。
テンシバイ

パッケージを確実にアップグレードするにはどうすればよいですか?
クリストスディミトルラス

私の答えを見てください。自動応答ダイアログとは異なるパッケージを扱う必要があるパッケージがあります。
テンシバイ

1

-yまたは-qを使用しても違いはありませんでした。たぶん、質問は「パッカー」の使用に関するものでしょうか?(私は裸のスクリプトを使用します)

とにかく、私の場合、apt upgrade次のsedコマンドを使用するためのダイアログを取り除きました。

sed -i "s/#\ conf_force_conffold=YES/conf_force_conffold=YES/g" /etc/ucf.conf
apt-get -y upgrade
sed -i "s/conf_force_conffold=YES/#conf_force_conffold=YES/g" /etc/ucf.conf

私の変更は、アップグレードの時間に制限されています。
技術的には、grubをアップグレードするときに既存の構成を保持するかどうかの質問を無効にしますが、副作用を避けるためにアップグレード時のみです。

OS:Ubuntu 16.04 LTS

お役に立てれば


最初の2つのコマンドを&&でリンクして、ucfファイルが別のプロセスによってロックされている場合、最初の参照の失敗によりapt-getが実行できないようにする必要があります
Tensibai

また、grubでコンフォールドを強制すると、システムが起動できなくなる可能性があります。grubの場合は避ける必要があります
-Tensibai

@Tensibai最初の答えはトリミングしましたが、以前は正確にこれを使用して新しいVMの展開を自動化していました。もちろん、grubをいじるのは非常に危険であり、重要なサーバーを操作するときにこれをいじるのはお勧めしませんが、その一方で... apt upgradeそのような場合だけでは非常に危険ではありませんか?数分で環境を再構築するスナップショットまたはその他の効率的な方法がない限り、試してみません。
バルミプール

1
apt-getのアップグレード自体は危険ではありません。しかし、古い構成を維持することを強制すると、これが可能になります。また、あなたが問題になる最後の希望の状態OKを(あなたのコードに障害が施行を残す)(このリストは可能性の高いバックラインのコメントはありません、apt-getの故障で停止します...)設定チェックしていません
テンシバイ

1
これは、ある明確に建設。そして、あなたは特にコメントされていない行を残すリスクを指摘するのが正しいです(私はそれを使用することをitし、それを防ぐためにチェックを追加することを検討します)。以下のために私のユースケース、私はリスクが無視できると確信している、誰かが盲目的に結果を知らなくても、これを使用することができます。(たとえそれらが何をするのか理解せずにランダムなコマンドを実行してはいけない場合でも)
バルミプール

0

コマンド-yからパラメーターを省略していますapt-get update。それを含めると、プロンプトは消えます。

PackerでUbuntuイメージも作成しました。更新の実行に使用するシェルスクリプトは次のとおりです。

https://github.com/devopskatas/learningvm/blob/master/script/update.sh

これは、Ubuntu Packerビルドの優れた、よく管理されたライブラリから派生しています。

https://github.com/boxcutter/ubuntu


2
apt-get update リモートリポジトリからパッケージのリストのみを更新するため、-yを設定する理由はありません
...-Tensibai

@Tensibaiはい、違いもありません。同じエラー。
フィリップクラッセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.