: O. Yuanying

Ansible で http_proxy

問題

Proxy 環境下で ansible を利用しようとするとたまにはまることがある。 具体的には以下のようなタスクで pip が失敗したり。

- hosts: all
  sudo: yes
  tasks:
    - pip: name=python-docker state=installed

ちょっとぐぐるとオフィシャルな解決方法が出てくる。 それによるとタスクごとに proxy の設定をしろと書いてある。

- hosts: all
  remote_user: root

  # here we make a variable named "proxy_env" that is a dictionary
  vars:
    proxy_env:
      http_proxy: http://proxy.example.com:8080

  tasks:

    - pip: name=python-docker state=installed
      environment: proxy_env

が、一個一個タスクに environment キーワードを使って環境変数を設定していくのはすごくだるい。

解決方法

playbook の最初の方で対象のホストの /etc/environment ファイルに、 proxy 関連の環境変数を一括で設定しまうことで解決した。

- hosts: all
  vars:
    proxy:
      http_proxy: http://proxy.example.com:8080

  tasks:
  - name: Add no_proxy to /etc/environment
    sudo: yes
    lineinfile:
      create: yes
      dest: '/etc/environment'
      state: present
      line: 'no_proxy="{{ proxy.no_proxy }}"'
    when: proxy.no_proxy | default(False)
    register: no_proxy_result

  - name: Add http_proxy to /etc/environment
    sudo: yes
    lineinfile:
      create: yes
      dest: '/etc/environment'
      state: present
      line: 'http_proxy="{{ proxy.http_proxy }}"'
    when: proxy.http_proxy | default(False)
    register: http_proxy_result

  - name: Add https_proxy to /etc/environment
    sudo: yes
    lineinfile:
      create: yes
      dest: '/etc/environment'
      state: present
      line: 'https_proxy="{{ proxy.https_proxy }}"'
    when: proxy.https_proxy | default(False)
    register: https_proxy_result

  - name: Restart sshd
    service: name=ssh state=restarted
    sudo: yes
    when: >
      no_proxy_result.changed == true or
      http_proxy_result.changed == true or
      https_proxy_result.changed == true

ただ、設定した後に対象ホストの sshd を再起動しないと、 環境変数が反映されないことがあったので注意。