ぴよ丸水産

週末ファゴッティストによる技術ブログ

【Ansible】Ansible今日ググったこと(小ネタ集)

■はじめに

Ansible関連の今日ググったことをまとめました。

目次

動作環境

■インベントリに書いたホスト名を変数として使いたい

  • マジック変数inventory_hostnameを使用します。
  • 実ホスト名(ターゲットホストでhostname実行したときに返ってくるホスト名)を使う場合は、ansible_hostnameを使います。
  • ansible_hostnameを使うにはgather_factsが有効になっていることが前提です。

参考

qiita.com

■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

参考

qiita.com

docs.ansible.com

■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してきたファイルが格納される。

参考

docs.ansible.com

■日付時刻情報を使いたい

gather_factsが有効になっていること前提です。

  • 日付:ansible_facts.date_time.date
  • 時刻:ansible_facts.date_time.time
  • タイムゾーンansible_facts.date_time.tz

上記の記法で使います。

参考

github.com

まとめ

今日ググったこと+ググった結果をいかにして活用したか
を、まとめて書いちゃいました。