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」がタイムアウト

