如何使用Ansible变量和Facts(8)

我们在这个Ansible系列文章中已经提到了变量,只是为了让您稍稍慢一点。与许多编程语言一样,变量本质上是表示值的键。

Working-with-Ansible-Variables-and-Facts-8

什么构成有效变量名?

变量名包括字母,数字,下划线或2个或全部的混合。但是,请记住,变量名必须始终以字母开头,并且不能包含空格。

让我们看一些有效和不可接受的变量名的示例:

有效的变量名示例:

football 
foot_ball
football20 
foot_ball20

无效的变量名称示例:

foot ball
20 
foot-ball

让我们讨论变量类型:

1.剧本变量

剧本变量非常简单明了。要在剧本中定义变量,只需在写入带有缩进的变量之前使用关键字vars。

要访问变量的值,请将其放在带引号的双大括号之间。

这是一个简单的剧本示例:

- host: all
  vars: 
      greeting: Hello World!
  tasks:
  - name: Ansible Basic Variable Example
     debug:
          msg: "{{ greeting }}"

在上述剧本中,greeting变量由值Hello world!代替。当剧本运行时,该剧本仅打印消息Hello world!


Ansible中的Playbook变量

此外,您可以具有一个列表或变量数组,如下所示:

下面的剧本显示了一个名为continents的变量。该变量包含5个不同的值-大洲名称。使用索引0作为第一个变量可以轻松访问这些值中的每一个。

以下剧本的示例检索并显示Asia(索引1)。

- hosts: all
  vars:
    continents:
      - Africa
      - Asia
      - South America
      - North America
      - Europe
      
  tasks:
  - name: Ansible List variable Example
    debug:
      msg: "{{ continents [1] }}"
Ansible中的变量数组

变量列表的结构类似,如下所示:

vars:
    Continents: [Africa, Asia, South America, North America, Europe]

要列出列表中的所有项目,请使用with_items 模块。这将遍历数组中的所有值。

- hosts: all
  vars:
    continents: [Africa, Asia, South America, North America, Europe]

  tasks:
  - name: Ansible array variables example
    debug: 
      msg: "{{ item }}"
    with_items:
      - "{{ continents }}"
列出Ansible所有数组变量

Ansible变量的另一种类型是dictionary (字典)变量。

剧本还支持dictionary 变量。要定义dictionary 变量,只需在dictionary 变量名称下方标识键值对即可。

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 10.200.50.1
   vlans:
       id: 10
       port: 2

在上面的示例中,vlans是字典变量,而id和port是键值对。

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 
   vlans:
      id: 10
      port: 20

 tasks:
   name: Configure default gateway
   system_configs:
   default_gateway_ip: “{{ default_gateway }}“


   name: Label port on vlan 10
   vlan_config:
    vlan_id: “{{ vlans[‘id’] }}“
     port_id: 1/1/ {{ vlans[‘port’] }}

对于port_id,因为我们以文本而不是变量开头,所以用花括号将引号引起来是没有必要的。

2.特殊变量

Ansible提供了可在Jinja2模板和剧本中引用但不能由用户更改或定义的预定义变量的列表。

总的来说,Ansible预定义变量的列表称为Ansible facts,并且在执行剧本时会收集这些** facts**。

要获取所有Ansible变量的列表,请使用Ansible ad-hoc命令中的setup模块,如下所示:

# ansible -m setup hostname

这将以JSON格式显示输出,如下所示:

# ansible -m setup localhost
列出Ansible变量

从输出中,我们可以看到Ansible特殊变量的一些示例包括:

ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux

还有许多其他Ansible特殊变量,这些只是一些示例。

这些变量可以在Jinja2模板中使用,如下所示:

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

3.Inventory变量

最后,在列表中,我们有Ansible Inventory变量。清单是INI格式的文件,其中包含要由Ansible管理的所有主机。

在清单中,您可以将变量分配给主机系统,然后在剧本中使用它。

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080

以上内容可以在Playbook YAML文件中表示,如下所示:

---
   web_servers:
     web_server_1:
        ansible_user=centos
       http_port=80

   web_server_2:
        ansible_user=ubuntu
       http_port=8080

如果主机系统共享相同的变量,则可以在清单文件中定义另一个组,以减少繁琐的工作并避免不必要的重复。

例如:

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80

上面的结构可以是:

[web_servers]
web_server_1
web_server_2


[web_servers:vars]
ansible_user=centos
http_port=80

在剧本YAML文件中,将按如下所示进行定义:

---
   web_servers:
    
     hosts: 
          web_server_1:
      web_server_2:

     vars: 
        ansible_user=centos
       http_port=80

Ansible Facts

在运行剧本时,Ansible要做的第一项任务是执行设置任务。我确定您一定遇到了这样的输出:

TASK:  [Gathering facts] *********

Ansible facts只不过是系统属性或有关您已连接到的远程节点的信息。这些信息包括系统架构,操作系统版本,BIOS信息,系统时间和日期,系统正常运行时间,IP地址以及硬件信息,仅举几例。

要获取有关任何系统的facts,只需使用安装模块,如下面的命令所示:

# ansible -m setup hostname

例如:

# ansible -m setup database_server

这将以JSON格式打印出大量数据,如下所示:


Ansible获取系统的facts

Ansible facts对于帮助系统管理员执行哪些操作非常方便,例如,取决于操作系统,他们能够知道需要安装哪些软件包以及如何配置它们,等等。

自定义facts

你是否也知道你可以创建自己的自定义facts,可以由Ansible收集?是的,你可以。那么你如何去做呢?让我们一起来看看。

第一步是在受管或远程节点上创建/etc/ansible/facts.d目录。

在此目录中,创建带有.fact扩展名的文件。当剧本在Ansible控制节点上运行时,此文件将返回JSON数据,其中包括在剧本运行后Ansible检索到的其他facts。

这是一个名为date_time.fact的自定义facts文件的示例,该文件检索日期和时间。

# mkdir -p /etc/ansible/facts.d
# vim /etc/ansible/facts.d/date_time.fact

在其中添加以下行。

#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"

保存并退出文件,现在分配执行权限:

# chmod +x /etc/ansible/facts.d/date_time.fact

现在,我在Ansible控制节点上创建了一个名为check_date.yml的剧本。

---

- hosts: webservers

  tasks:
  - name: Get custom facts
        debug:
             msg: The custom fact is {{ansible_local.date_time}}

将facts文件追加到ansible_local变量。该ansible_local存储所有自定义facts。

现在运行剧本,观察保存在facts文件中的Ansible检索信息:

# ansible_playbook check_date.yml
创建Ansible自定义facts

总结

在本教程中,我们学习了在Ansible中如何使用变量、facts,以及有效的变量名规范,常见的几种变量和自定义facts,结合变量的使用。

PS:本文来自翻译,文中内容有所改动,并非原文所译。
原文链接:https://www.tecmint.com/ansible-variables-and-facts

扫码关注
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269