■ はじめに
Ansible には 環境変数を取得するための方法として、ansible_env 配下の変数を参照する方法と、 lookup("env", "hoge") のように loopkup プラグインを利用する方法があります。これらは性質が大きく異なります。
この記事では簡単な例で動作を確認します。
■ 違いは?
ansible_env.hoge |
lookup("env", "hoge") |
|
|---|---|---|
| 取得場所 | リモートホスト(ターゲット) | ローカルホスト(ansible-playbookコマンド実行ホスト) |
| 取得タイミング | gather_facts: yes (デフォルト)などによる setup 実行時 |
参照時(のはず) |
| 取得可能な環境変数 | setup モジュールに依存 |
すべて |
■ 動作確認
環境
Ansible 2.7.8
Playbook
- hosts: linux # taget1 、target2 定義済みグループ gather_facts: yes # デフォルトはyes。no の場合は ansible_env 自体が定義されない tasks: - name: debug lookup("env", "PWD") debug: var: lookup("env", "PWD") - name: debug ansible_env.PWD debug: var: ansible_env.PWD - name: debug ansible_env debug: var: ansible_env # ansible_env 全体を表示
実行
$ echo $PWD # ローカルホスト上の 環境変数 `PWD` をあらかじめ確認。
/vagrant/blog/env
$ ansible-playbook -i inventory env.yml # Playbook 実行
PLAY [linux] *************************************************************************************
TASK [Gathering Facts] ***************************************************************************
ok: [target2]
ok: [target1]
TASK [debug lookup("env", "PWD")] ****************************************************************
ok: [target1] => {
"lookup(\"env\", \"PWD\")": "/vagrant/blog/env"
}
ok: [target2] => {
"lookup(\"env\", \"PWD\")": "/vagrant/blog/env"
}
TASK [debug ansible_env.PWD] *********************************************************************
ok: [target1] => {
"ansible_env.PWD": "/home/vagrant"
}
ok: [target2] => {
"ansible_env.PWD": "/home/testuser"
}
TASK [debug ansible_env] *************************************************************************
ok: [target1] => {
"ansible_env": {
"HOME": "/home/vagrant",
"LANG": "C",
"LC_ALL": "C",
"LC_MESSAGES": "C",
"LESSOPEN": "||/usr/bin/lesspipe.sh %s",
"LOGNAME": "vagrant",
"LS_COLORS": "rs=0:di=38;(...略...)",
"MAIL": "/var/mail/vagrant",
"PATH": "/usr/local/bin:/usr/bin",
"PWD": "/home/vagrant",
"SELINUX_LEVEL_REQUESTED": "",
"SELINUX_ROLE_REQUESTED": "",
"SELINUX_USE_CURRENT_RANGE": "",
"SHELL": "/bin/bash",
"SHLVL": "2",
"SSH_CLIENT": "172.16.0.9 53026 22",
"SSH_CONNECTION": "172.16.0.9 53026 172.16.0.11 22",
"SSH_TTY": "/dev/pts/5",
"TERM": "xterm-256color",
"USER": "vagrant",
"XDG_RUNTIME_DIR": "/run/user/1000",
"XDG_SESSION_ID": "18",
"_": "/usr/bin/python"
}
}
ok: [target2] => {
"ansible_env": {
"HOME": "/home/testuser",
"LANG": "ja_JP.UTF-8",
"LESSOPEN": "||/usr/bin/lesspipe.sh %s",
"LOGNAME": "testuser",
"LS_COLORS": "rs=0:di=38;(...略...)",
"MAIL": "/var/mail/testuser",
"PATH": "/usr/local/bin:/usr/bin",
"PWD": "/home/testuser",
"SELINUX_LEVEL_REQUESTED": "",
"SELINUX_ROLE_REQUESTED": "",
"SELINUX_USE_CURRENT_RANGE": "",
"SHELL": "/bin/bash",
"SHLVL": "2",
"SSH_CLIENT": "172.16.0.9 49312 22",
"SSH_CONNECTION": "172.16.0.9 49312 172.16.0.12 22",
"SSH_TTY": "/dev/pts/1",
"TERM": "xterm-256color",
"USER": "testuser",
"XDG_RUNTIME_DIR": "/run/user/1001",
"XDG_SESSION_ID": "20",
"_": "/usr/bin/python"
}
}
PLAY RECAP ***************************************************************************************
target1 : ok=4 changed=0 unreachable=0 failed=0
target2 : ok=4 changed=0 unreachable=0 failed=0
確認できたこと
上記の Playbook 実行結果から以下のことが分かります。
lookup("env", "PWD")の値は、target1、target2向けのいずれのタスクでも/vagrant/blog/envになっています。- これらはローカルホスト上の環境変数
PWDの値です。
- これらはローカルホスト上の環境変数
ansible_env.PWDの値は、target1では/home/vagrant、target2では/home/testuserとなっています。これは各ターゲットに異なるユーザーでログインしたため、ログイン先でのPWDも異なっている、という状態です。リモートホストのPWDである/vagrant/blog/envとも異なっています。ansible_env配下には、すべてのローカル環境変数が入るわけではない- たとえば、
HOSTNAMEがない
- たとえば、
■ まとめ
環境変数を取得する方法である、ansible_env.hoge と lookup("env", "hoge") の違いについて確認しました。
主な違いは、リモートのものなのか、ローカルのものなのかでした、