在哪里定义Ansible全局范围变量

首先

在学习Ansible时,我对能够定义变量的地方如此之多感到惊讶。大约有20种模式,但是很难找到相关的信息…。

因此,我个人打算总结出适用于基础设施构建案例的 Ansible 变量定义的最佳实践。

这次我们将重点介绍“定义全节点、全playbook共享的全局变量的位置”。

前提 tí) – prerequisite

在中国,使用Ansible的情景

我們的重點是團隊使用而非個人使用。
因此,對於個人使用者來說,或許會感到「沒有那麼受限制」。

目录结构

本文中的Ansible目录结构是基于官方最佳实践的目录布局,我们将在接下来的讨论中沿用这样的结构。

执行环境

我在Windows终端上使用Vagrant启动了CentOS,并对localhost执行了Ansible。

SoftwareVersionWindows10(1709)VirtualBox5.2.4Vagrant2.0.1CentOSbento/centos-7.2Ansible2.3.0.1Python2.7.5

Ansible 在全局變數中

Ansible 中的变量作用域

作为参考,Ansible有三种变量作用域。以下是引用自《Ansible实战指南》的内容。

全球:
对整个Ansible执行进行定义。可以从任何playbook中引用。包括环境变量、额外变量等。

剧本:
在每个单独的剧本中定义。只能在剧本内部引用。包括play变量、task变量、role变量等。

主机:
与每个目标节点相关联的变量。包括清单变量、事实变量、注册变量等。

スコープ図.png

在接下来的文章中,我们将专注于全局范围的变量,就如前文所述。

全局变量的模式

全局變數可以以以下四種模式進行定義(參考:官方)。

パターン定義方法ローカル定義したファクト変数/etc/ansible/fact.d 配下の .fact 拡張子ファイル内で定義環境変数ターゲットノードより取得定義 (※)エクストラ変数ansible-playbook コマンド実行時に引数(-e)に指定グループ変数の応用group_vars/all.yml に定義 (※※)

(※) 环境变量的定义

环境变量包含在与Ansible执行时收集的每个目标节点相关的事实信息中。
(所以,我认为环境变量和事实变量一样,范围不是主机吗…)

在另一方面,可以使用environment指令来定义和引用自定义环境变量,如下所示。
在这种情况下,作用域将是Play(定义指令的Play或Task单位)。

- hosts: localhost
  environment:
    http_proxy: http://xxxx.xxx.xxx:8080
  tasks:
    - debug: var=ansible_env.http_proxy

由于作用域定义因使用方法而变化,因此在后续中将不包括环境变量的全局变量模式。

挪威群组在 group_vars/all.yml 文件中有定义。

出于以下原因,我们将“group_vars/all.yml”添加到全局变量模式中。严格来说,这是处理清单变量的方式,因此适用于上述范围的主机。

group_vars配下の${ノード毎のグループ名}.ymlはどのプレイブックからも参照できる

暗黙で全てのノードは「all」グループに属するため、all.ymlは全ノード共通定義を意味する

全球变量的最佳实践

归结

依据我的个人观点,在以下条件下定义全局变量是可取的。

■ 在哪里:「group_vars/all.yml」
■ 何时:预计定义值几乎不会发生更改,并持续广泛使用时。

定義

group_vars/all.yml
ntp_server: default-time.example.com

呼び出し

playbook.yml

– hosts: localhost
tasks:
– debug: msg=”{{ ntp_server }}”

## 実行結果 ##
# TASK [debug] *********************************************************************
# ok: [localhost] => {
# “msg”: “default-time.example.com”
# }

为什么

基于以下原因,我更倾向于通过排除法进行选择。

管理定义的容易性

パターン評価理由ローカル定義したファクト変数△Ansible の実行ディレクトリとは別のファイルで管理されているエクストラ変数✕Ansible の実行ディレクトリから定義を探せないgroup_vars/all.yml に定義◯Ansible の実行ディレクトリにあり、かつ1つのファイルに纏っている

在团队开发中,不推荐使用额外的变量,因为需要管理”将什么作为命令参数传递”的信息。但个人使用而言,我认为还是不错的。

符合原本的使用方式吗?

パターン評価理由ローカル定義したファクト変数✕本来はターゲットノード情報のことを指すエクストラ変数◯-group_vars/all.yml に定義◯-

事实变量不是全局变量,它们的本来作用是为每个目标节点获取定义,正如先前所述。虽然可以按以下方式定义并作为全局变量调用,但不建议这样做。

定義

/etc/ansible/facts.d/test.fact
[default]
hardware = x86_64

呼び出し

playbook.yml


– hosts: localhost
tasks:
– debug: var=ansible_local.test.default.hardware

## 実行結果 ##
# TASK [debug] *********************************************************************
# ok: [localhost] => {
# “ansible_local.test.default.hardware”: “x86_64”
# }

最后

我在上面介绍了「定义全节点和全Playbook共享的全局变量的地方」的定义模式,并作为个人最佳实践介绍了group_vars/all.yml文件。

根据个人或团队以及游戏规则的设计,如果有人认为”在这里进行定义更为合适”,请务必提出意见。

bannerAds