手当たり次第に書くんだ

飽きっぽいのは本能

Proxy 環境で「apt-key adv –recv-keys」がタイムアウト

1. 前提

  • インターネットへの直接的な通信は禁止しており、プロキシを経由する必要がある。
  • Ansible を使用している。

2. 問題

以下のように Ansible で PPA を追加するタスクを実行すると、

- name: Add Ansible PPA repository and update APT cache
  become: true
  ansible.builtin.apt_repository:
    repo: ppa:ansible/ansible
    state: present
    update_cache: true

次のエラーで停止。

fatal: [job-agent-v001]: FAILED! => {"cmd": "/usr/bin/apt-key adv --recv-keys ...", 
"msg": "gpg: keyserver receive failed: Connection timed out"}

apt-key コマンドが keyserver(hkp://keyserver.ubuntu.com:80)へ接続を試みるが、プロキシ環境では直接インターネットに出られず通信がタイムアウトしていた。

3. 原因

Ubuntu の apt-add-repository および apt-key adv は、内部で GnuPG の dirmngr を使用しており、dirmngr は APT の Proxy 設定を参照しない。そのため、Acquire::http::Proxy を設定していても keyserver への接続時ではその設定が無視される。

実際の通信経路はこうなっている:

apt-add-repository
  └─ apt-key adv
       └─ gpg
            └─ dirmngr → keyserver.ubuntu.com:80 (直接通信)

つまり、Proxy 配下の環境では dirmngr が外部に到達できず、「Connection timed out」となる。

4. 解決方法

dirmngr に直接 Proxy を教える設定を必要なホストに配布する。

sudo mkdir -p /etc/gnupg
sudo vi /etc/gnupg/dirmngr.conf

設定内容:

http-proxy http://proxy.example.com:8080

保存後、root の dirmngr を再起動。dirmngr は、Apt が呼び出すプログラムであり、次回の呼び出し時に設定が適用されるため、現在起動しているプロセスを停止する必要がある。

sudo gpgconf --kill dirmngr

次回 apt-key adv が実行されると、この設定を読んだ dirmngr が Proxy 経由で通信し、正常に鍵を取得できるようになる。

5. Ansible での展開例

- name: Ensure /etc/gnupg exists
  become: true
  ansible.builtin.file:
    path: /etc/gnupg
    state: directory
    mode: '0755'

- name: Configure dirmngr proxy for root
  become: true
  ansible.builtin.copy:
    dest: /etc/gnupg/dirmngr.conf
    mode: '0644'
    content: |
      http-proxy http://proxy.example.com:8080

- name: Restart dirmngr for root
  become: true
  ansible.builtin.command: gpgconf --kill dirmngr
  changed_when: false

Proxy 環境で「apt-key adv –recv-keys」がタイムアウト

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る