如何有效使用Ansible Gathering Facts

我以前对Ansible的Gathering Facts并不熟悉,但是通过了解它的内容,我觉得可以制作出高质量的playbook。

    • これだけ知っておけば便利

 

    結構ハマったこと

主要内容包括但不限于以下方面的描述。

我想要传达的事情

搜集事实是

    • 対象ホストの情報をansible_facts変数というものに格納し、tasks内の変数で使用することができる。

格納された変数一覧はdebug/setupモジュールを使用することで確認できる。

playbook実行時の初回に1度だけ実行される。

デフォルトで実行される。

実行時の状態を格納する。

実行しない場合はplaybookにgather_facts: noと記載する。

playbookの実行時間が少し短くなる。

あるタスクで内で実行したい場合は、タスクとして記載する。

tasks内で実行すると、実行時の環境で変数を取得する。

become: yesなどを指定している場合は、実行ユーザなどの環境変数が異なる。

対象ホストが正常な状態でない場合にエラーになる可能性がある。

Ansible Facts变量指的是什么?

这是一个存储着Ansible目标主机系统信息的变量。

当您想要使用playbook中的目标主机信息(如操作系统、主机名、IP地址等)时,您可以使用这个变量来进行定义。

举个例子,当使用不同的RHEL/Ubuntu操作系统执行不同的任务时,
通过使用Facts变量,我们可以在playbook中定义是否执行任务。

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

您可以通过使用debug/setup模块来查看ansible_facts变量的列表。

在playbook中使用debug模块。

debug: var=ansible_facts

使用Ansible(CLI)的setup模块。

ansible ${target_host} -m setup

在使用Playbook时收集事实。

Gathering Facts会在playbook执行时仅执行一次,且仅在第一次执行时。

如果不执行的话,默认会执行,对于不执行的情况,在playbook中需要写上gather_facts: no。
(这可以稍微减少playbook的执行时间。)

- hosts: all
  gather_facts: no
  roles:
    - common

需要注意的是,要存储执行时的状态。
例如,在任务中使用become: yes切换执行用户时,存储的变量将保持在切换之前的用户,而不会更新为切换后的用户。

如果想在执行任务后覆盖fact变量,可以按如下方式编写任务。

- name: 'Gathering Facts'
  gather_facts:

如果“Gathering Facts”发生错误的情况下

如果无法从目标主机获取facts变量,则会出现错误。
同样,setup模块也会发生错误。
这意味着目标主机发生了某种错误。

让我们试一试,在目标主机的 /etc/sudoers 文件中添加一个拼写错误。

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

如果在这种状态下执行playbook会导致错误。

切割的方法 (Qiē de

通过执行以下命令并筛选gather_subset,去查看相应的源代码,似乎可以确定出错所在。

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

gather_fact 的处理已经使用以下的源代码。

ansible/ansible 仓库中的 ansible/lib/ansible/module_utils/facts 分支

参考

    • Ansible チュートリアル | Ansible Tutorial in Japanese

 

    • 変数の使用 — Ansible Documentation

 

    • gather_facts – Gathers facts about remote hosts — Ansible Documentation

 

    • Ansible実行が”GATHERING FACTS”で止まる – Qiita

 

    OSによって処理を変えるPlaybookディレクトリの作成 – Qiita
广告
将在 10 秒后关闭
bannerAds