【Ansible】Ansible今日ググったこと(小ネタ集)
■はじめに
Ansible関連の今日ググったことをまとめました。
目次
- ■はじめに
- ■インベントリに書いたホスト名を変数として使いたい
- ■shellモジュールで実行したコマンドの標準出力、標準エラー出力、リターンコードを使いたい
- ■fetchモジュール(flat=yes)で、複数ファイルを取得できていない
- ■日付時刻情報を使いたい
- まとめ
動作環境
■インベントリに書いたホスト名を変数として使いたい
- マジック変数
inventory_hostname
を使用します。 - 実ホスト名(ターゲットホストで
hostname
実行したときに返ってくるホスト名)を使う場合は、ansible_hostname
を使います。 ansible_hostname
を使うにはgather_factsが有効になっていることが前提です。
参考
■shellモジュールで実行したコマンドの標準出力、標準エラー出力、リターンコードを使いたい
- register変数に入れれば、以降のタスクで使えます。
- name: exec command shell: {{ command }} register: result
- result.stdout:標準出力
- result.stdout_lines:標準出力(1行毎にリスト化されてる)
- result.stderr:標準エラー出力
- result.rc:リターンコード
例えばこんな風に使えますね。
コマンド実行結果をファイルに書き出すPlaybookを書いてみました。
- name: create empty file file: path: /tmp/command_result.txt state: touch - name: exec command shell: {{ command }} register: result ignore_errors: yes - name: output command result lineinfile: path: /tmp/command_result.txt line: "{{ item }}" with_items: "{{ result.stdout_lines }}" when: result.rc == 0 - name: output command result(error) lineinfile: path: /tmp/command_result.txt line: "{{ result.stderr }}" when: result.rc != 0
ignore_errors: yes
にしとかないと、
コマンドが正常終了しなかった場合、exec command
タスクで止まります。
やっていることは、以下のPlaybookと同じです。
- name: redirect command result shell: "{{ command }} > /tmp/command_result.txt 2&>1
参考
■fetchモジュール(flat=yes)で、複数ファイルを取得できていない
fetchモジュールでdest
に指定したディレクトリに指定したファイルを取得するつもりが、
dest
で指定したディレクトリ名の、ファイルが生成されている!?
- 事象
- name: fetch: src: "{{ item }}" dest: ./fetch_files flat: yes with_items: "{{ file_list }}"
ansible実行ディレクトリにfetch_filesというファイル(NOT ディレクトリ)が生成される。
複数のファイルをfetch_filesディレクトリにfetchしてくるはずだったのに…!?
- 原因
dest:
の値の末尾に/
がないだけでした。
あと、flatつけると、複数ホストから同名ファイルをとってくるときに、
中身を上書きします。
別ものとしてとってきたい場合は、
フォルダ分けるとかしましょう。
- 解決例
- name: fetch: src: "{{ item }}" dest: .fetch_files/{{ inventory_hostname }}/ flat: yes with_items: "{{ file_list }}"
これで、ansible実行ディレクトリには、
fetch_filesディレクトリ、その配下にホスト名のディレクトリが作成され、
その中にfetchしてきたファイルが格納される。
参考
■日付時刻情報を使いたい
gather_factsが有効になっていること前提です。
- 日付:
ansible_facts.date_time.date
- 時刻:
ansible_facts.date_time.time
- タイムゾーン:
ansible_facts.date_time.tz
上記の記法で使います。
参考
まとめ
今日ググったこと+ググった結果をいかにして活用したか
を、まとめて書いちゃいました。