search
LoginSignup
2

More than 1 year has passed since last update.

posted at

Ansible Gathering Factsを上手く使う方法

AnsibleのGathering Factsについて、今まで熟知せずに使っていましたが、
内容を知ることで良質なplaybookが作れると感じました。

  • これだけ知っておけば便利
  • 結構ハマったこと

などを中心に記載します。

伝えたいこと

Gathering Factsとは

  • 対象ホストの情報をansible_facts変数というものに格納し、tasks内の変数で使用することができる。
    • 格納された変数一覧はdebug/setupモジュールを使用することで確認できる。
  • playbook実行時の初回に1度だけ実行される。
    • デフォルトで実行される。
      • 実行時の状態を格納する。
    • 実行しない場合はplaybookにgather_facts: noと記載する。
      • playbookの実行時間が少し短くなる。
    • あるタスクで内で実行したい場合は、タスクとして記載する。
  • tasks内で実行すると、実行時の環境で変数を取得する。
    • become: yesなどを指定している場合は、実行ユーザなどの環境変数が異なる。
  • 対象ホストが正常な状態でない場合にエラーになる可能性がある。

Ansible Facts変数とは

ansible対象ホストのシステム情報などが格納された変数です。

playbookで対象ホストの情報(OS,Hostname,IP Address...)を使いたい時、この変数を用いて定義することができます。

例えば、OSがRHEL/Ubuntuによって実行したいtaskが異なる時、
Facts変数を使用することで、タスクを実行するか否かをplaybookで定義できます。

- name: 'Install vim for CentOS 8'
  dnf:
    name: vim
    state: present
  when:
    - ansible_os_family == "Redhat"
    - ansible_distribution_major_version == "8"

ansible_facts変数一覧はdebug/setupモジュールを使用することで確認できます。

playbook内でdebugモジュールを使う

debug: var=ansible_facts

ansible(CLI)でsetupモジュールを使う

ansible ${target_host} -m setup

Playbook利用時のGathering Facts

Gathering Factsは、playbook実行時の初回に1度だけ実行されます。

デフォルトで実行されるため、実行しない場合はplaybookにgather_facts: noと記載します。
(playbook実行時間を少し減らすことができます。)

- hosts: all
  gather_facts: no
  roles:
    - common

注意しておきたい点は、実行時の状態を格納することです。
例えば、タスク内で become: yesで実行ユーザを切り替えた場合、格納されている変数は切り替え前のユーザのもので、切り替え後のユーザに更新されません。

task実行後にfact変数を上書きしたい場合は、以下のtaskを記載をします。

- name: 'Gathering Facts'
  gather_facts:

Gathering Factsがエラーになる場合

対象ホストからfacts変数を取得できない場合、エラーが発生します。
同様にsetupモジュールもエラーになります。
この時、対象ホストに何らかのエラーが発生しています。

試しに、対象ホストの /etc/sudoersにtypoを含ませてみます。

root        ALL = (ALL) ALL
%admin      ALL = (ALL) ALL
% typo      ALL = (ALL) ALL # わざとtypoさせた行

この状態でplaybookを実行するとエラーになります。

切り分け方法

以下のコマンドについて gather_subsetを絞りながら実行し、
該当となるソースコードを見にいくことで、該当エラー箇所が特定できそうです。

ansible -m setup -a 'gather_subset=network,virtual,ohai,facter,hardware'

gather_factの処理は以下のソースコードになってます。

ansible/lib/ansible/module_utils/facts at devel · ansible/ansible

Reference

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2