CUBE SUGAR CONTAINER

技術系のこと書きます。

Ansible が対象ホストで生成する実行可能ファイルを消さないようにする

Ansible は対象ファイルでモジュールを実行する場合、それを実行可能ファイルに加工して対象ホストに転送した上で実行する。 その際に生成される実行可能ファイルはデフォルトでは消去されてしまうため、Ansible の挙動を調べる際に都合が悪い。 今回はそのデフォルトでは消されてしまうファイルを残しておくための設定について。 結論から先に言ってしまうと、ANSIBLE_KEEP_REMOTE_FILES という環境変数を定義しておけば良い。

検証環境には OSX を使ったけど特にディストリビューションは関係ない。

$ uname -s
Darwin
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.5
BuildVersion:   14F27

Ansible をインストールする

何はともあれ Ansible をインストールしておく。 入れ方は特に問わない。

$ pip install ansible
$ ansible --version
ansible 1.9.3
  configured module search path = None

Ansible の内部的な挙動を確認する

Ansible のコマンドを実行する際に -vvv オプションを付けると内部で実行しているコマンドが表示される。 それを見ると、対象ホストに実行可能ファイルを作ってそれを実行していることがわかる。 また、実行後はそのファイルを rm で削除している。

$ ansible -i "localhost," -c local -m ping localhost -vvv
<localhost> REMOTE_MODULE ping
<localhost> EXEC ['/bin/sh', '-c', 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1442402490.36-20033635498736 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1442402490.36-20033635498736 && echo $HOME/.ansible/tmp/ansible-tmp-1442402490.36-20033635498736']
<localhost> PUT /var/folders/m2/61f0r8fs0cdgxh2ghx_rlf7r0000gn/T/tmpTHUo1x TO /Users/amedama/.ansible/tmp/ansible-tmp-1442402490.36-20033635498736/ping
<localhost> EXEC ['/bin/sh', '-c', u'LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /Users/amedama/.ansible/tmp/ansible-tmp-1442402490.36-20033635498736/ping; rm -rf /Users/amedama/.ansible/tmp/ansible-tmp-1442402490.36-20033635498736/ >/dev/null 2>&1']
localhost | success >> {
    "changed": false, 
    "ping": "pong"
}

削除されてしまっているので、上記で表示されたディレクトリを調べても何も残っていない。

$ ls ~/.ansible/tmp/

実行可能ファイルを消さないようにして実行する

今度は環境変数 ANSIBLE_KEEP_REMOTE_FILES を有効にした状態で実行してみよう。

$ ANSIBLE_KEEP_REMOTE_FILES=1 ansible -i "localhost," -c local -m ping localhost -vvv
<localhost> REMOTE_MODULE ping
<localhost> EXEC ['/bin/sh', '-c', 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1442402537.16-35809608484615 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1442402537.16-35809608484615 && echo $HOME/.ansible/tmp/ansible-tmp-1442402537.16-35809608484615']
<localhost> PUT /var/folders/m2/61f0r8fs0cdgxh2ghx_rlf7r0000gn/T/tmpcQ1LuF TO /Users/amedama/.ansible/tmp/ansible-tmp-1442402537.16-35809608484615/ping
<localhost> EXEC ['/bin/sh', '-c', u'LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /Users/amedama/.ansible/tmp/ansible-tmp-1442402537.16-35809608484615/ping']
localhost | success >> {
    "changed": false, 
    "ping": "pong"
}

今度は rm コマンドが発行されていないことがわかる。

先ほどのディレクトリを確認してもファイルがそのまま残っている。

$ find ~/.ansible/tmp/
/Users/amedama/.ansible/tmp/
/Users/amedama/.ansible/tmp//ansible-tmp-1442402537.16-35809608484615
/Users/amedama/.ansible/tmp//ansible-tmp-1442402537.16-35809608484615/ping

あとは何かあればこのファイルを調べれば良い。

めでたしめでたし。