美文网首页Linux学习之路Linux我用 Linux
如何使用Ansible变量和Facts(8)

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

作者: 尘世不扰 | 来源:发表于2019-12-27 23:01 被阅读0次

    我们在这个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

    扫码关注

    相关文章

      网友评论

        本文标题:如何使用Ansible变量和Facts(8)

        本文链接:https://www.haomeiwen.com/subject/iveknctx.html