如何有效使用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