• Ansible_管理事实(Fact)


    一、Ansible管理事实(fact)

    1、Ansible事实描述

    1️⃣:Ansible事实是Ansible在受管主机上自动检测到的变量

    2️⃣:事实(fact)中包含有与主机相关的信息,可以像play中的常规变量、条件、循环或依赖于从受管主机收集的值的任何其他语句那样使用

    3️⃣:一些事实可能包括:

    主机名称、内核版本、网络接口、IP地址、操作系统版本、各种环境变量、CPU数量、提供的或可用的内存、可用磁盘空间等等

    4️⃣:借助事实,可以方便地检索受管主机的状态,并根据该状态确定要执行的操作

    例如:

    • 可以根据含有受管主机当前内核版本的事实运行条件任务,以此来重启服务器
    • 可以根据通过事实报告的可用内存来自定义MySQL配置文件
    • 可以根据事实的值设置配置文件中使用的IPv4地址

    5️⃣:每个play在执行第一个任务之前会先自动运行setup模块来收集事实

    • 演示实例:使用debug模块显示ansible_facts变量值为受管主机收集事实
       //查看playbook文件
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        tasks:
          - name: 收集事实
            debug:
              var: ansible_facts
      
       //执行play收集事实
      [root@localhost project]# ansible-playbook playbook.yaml
      PLAY [all] ****************************************************************************************************************************************************************
      
      TASK [Gathering Facts] **************************************************************************************************************************************************** ok: [client.example.com]
      TASK [收集事实] *************************************************************************************************************************************************************** ok: [client.example.com] => { "ansible_facts": { "all_ipv4_addresses": [ "192.168.121.81" ], "all_ipv6_addresses": [ "fe80::63e7:778f:ba5b:fa1d" ], ............
    • PlaybookJSON格式显示ansible_facts变量的内容
    • Ansible事实的示例:
      事实变量
      短主机名 ansible_facts['hostname']
      完全限定域名 ansible_facts['fqdn']
      IPv4地址 ansible_facts['default_ipv4']['address']
      所有网络接口的名称列表 ansible_facts['interfaces']
      /dev/vda1磁盘分区的大小 ansible_facts['devices']['vda']['partitions']['vda1']['size']
      DNS服务器列表 ansible_facts['dns']['nameservers']
      当前运行的内核版本 ansible_facts['kernel']

    6️⃣:在playbook中使用事实时,Ansible将事实的变量名动态替换为对应的值

    • 演示实例:
       //查看playbook文件
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        tasks:
          - name: 收集事实
            debug:
              msg: >     // >:表示换行的意思
                this host ip is {{ ansible_facts['default_ipv4']['address'] }}
                this hostname is {{ ansible_facts['hostname']}}
      
       //执行playbook文件
      [root@localhost project]# ansible-playbook playbook.yaml 
      PLAY [all] ****************************************************************************************************************************************************************
      
      TASK [Gathering Facts] ****************************************************************************************************************************************************
      ok: [client.example.com]
      
      TASK [收集事实] ***************************************************************************************************************************************************************
      ok: [client.example.com] => {
          "msg": "this host ip is 192.168.121.81 this hostname is client
      "
      }
      PLAY RECAP ****************************************************************************************************************************************************************
      client.example.com         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

    2、Ansible事实作为变量注入

    1️⃣:较早的变量注入:

    • Ansible2.5之前,事实是作为前缀为字符串ansible_的单个变量注入,而不是作为ansible_facts变量的一部分注入
      • ansible_facts['distribution']事实会被称为ansible_distribution
    • 可以使用临时命令来运行setup模块,以此形式显示所有事实的值:
      • 演示实例:
        [root@localhost project]# ansible all -m setup
        client.example.com | SUCCESS => {
            "ansible_facts": {
                "ansible_all_ipv4_addresses": [
                    "192.168.121.81"
                ],
                "ansible_all_ipv6_addresses": [
                    "fe80::63e7:778f:ba5b:fa1d"
                ],
                "ansible_apparmor": {
                    "status": "disabled"
                },
        ............

    2️⃣:选定的Ansible事实名称比较

    ansible_facts形式旧事实变量形式
    ansible_facts['hostname'] ansible_hostname
    ansible_facts['fqdn'] ansible_fqdn
    ansible_facts['default_ipv4']['address'] ansible_default_ipv4['address']
    ansible_facts['interfaces'] ansible_interfaces
    ansible_facts['devices']['vda']['partitions']['vda1']['size'] ansible_devices['vda']['partitions']['vda1']['size']
    ansible_facts['dns']['nameservers'] ansible_dns['nameservers']
    ansible_facts['kernel'] ansible_kernel

    3️⃣:将Ansible配置文件的[default]部分中inject_facts_as_vars参数设置为False,可关闭旧命名系统。默认设置为True

    4️⃣:inject_facts_as_vars的默认值在Ansible的未来版本中可能会更改为False

    • 如果设置为False,则只能使用新的ansible_facts.*命名系统引用Ansible事实

    3、关闭事实收集

    1️⃣:要为play禁用事实收集功能,可将gather_facts关键字设置为no

    • 演示实例:
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        gather_facts: no
        tasks:
          - name: test file
            debug:
                var: anisble_facts

    2️⃣:即使play设置了gather_facts: no,也可以随时通过运行使用setup模块的任务来手动收集事实

    • 演示实例:
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        gather_facts: no
        tasks:
          - name: get ansible_facts
            setup:
      
          - name: test debug
            debug:
              var: ansible_facts

    4、创建自定义事实

    1️⃣:除了使用系统捕获的事实外,我们还可以自定义事实,并将其本地存储在每个受管主机上;

    2️⃣:默认情况下,setup模块从各受管主机的/etc/ansible/facts.d目录下的文件和脚本中加载自定义事实

    3️⃣:各个文件或脚本的名称必须.fact结尾才能被使用;动态自定义事实脚本必须输出JSON格式的事实,而且必须是可执行文件

    4️⃣:演示实例:

    • 方式一采用INI格式编写的静态自定义事实文件
       //在受管主机上创建自定义文件
      [root@client ~]# mkdir -p /etc/ansible/facts.d
      [root@client ~]# cd /etc/ansible/facts.d/
      [root@client facts.d]# cat example.fact 
      [users]
      user_one: zhangsan
      user_two: lisi
      
      [servers]
      service_one: httpd
      service_two: mariadb
      
       //在控制节点上查看
      [root@localhost project]# ansible all -m setup |less
      ..............
      "ansible_local": {
                  "example": {
                      "servers": {
                          "service_one": "httpd",
                          "service_two": "mariadb"
                      },
                      "users": {
                          "user_one": "zhangsan",
                          "user_two": "lisi"
                      }
                  }
              },
      ...............
    • 方式二JSON格式提供事实,JSON事实等同于INI格式指定的事实,JSON数据可以存储在静态文本文件中
       //查看用JSON格式写对fact文件
      [root@client facts.d]# pwd
      /etc/ansible/facts.d
      [root@client facts.d]# cat test.fact 
      {
         "users": {
            "user_one": "zhangsan",
            "user_two": "lisi"
         },
         "servers": {
            "service_one": "httpd",
            "service_two": "vsftpd"
         }
      }
      
      
       //在控制节点上查看
      [root@localhost project]# ansible all -m setup |less
      .............
      "ansible_local": {
                  "test": {
                      "servers": {
                          "service_one": "httpd",
                          "service_two": "vsftpd"
                      },
                      "users": {
                          "user_one": "zhangsan",
                          "user_two": "lisi"
                      }
                  }
              },
      .............

    5️⃣:自定义事实由setup模块存储在ansible_facts['ansible_local']变量中

    • 事实按照定义它们的文件的名称来整理;例如:自定义事实由受管主机上保存为/etc/ansible/facts.d/example.fact的文件,在这种情况下,ansible_facts['ansible_local']['example']['users']['user_two']的值为lisi
    • 演示实例:
       //在控制节点编写playbook
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        tasks:
          - name: 输出某个用户
            debug:
              msg: 该用户是:{{ ansible_facts['ansible_local']['example']['users']['user_one'] }}
      
       //执行playbook
      [root@localhost project]# ansible-playbook playbook.yaml 
      
      PLAY [all] ****************************************************************************************************************************************************************
      
      TASK [Gathering Facts] ****************************************************************************************************************************************************
      ok: [client.example.com]
      
      TASK [输出某个用户] *************************************************************************************************************************************************************
      ok: [client.example.com] => {
          "msg": "该用户是:zhangsan"
      }
      
      PLAY RECAP ****************************************************************************************************************************************************************
      client.example.com         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
      
       //查看与anisble_local上的信息是否正确
      [root@localhost project]# ansible all -m setup |less
      ..............
      "ansible_local": {
                  "example": {
                      "servers": {
                          "service_one": "httpd",
                          "service_two": "vsftpd"
                      },
                      "users": {
                          "user_one": "zhangsan",
                          "user_two": "lisi"
                      }
                  }
              },
      .............
    •  //查看playbook文件内容
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        tasks:
          - name: 输出某个用户
            debug:
              var:  ansible_facts['ansible_local']['example']['users']['user_one'] }}
      
       //执行playbook
      [root@localhost project]# ansible-playbook playbook.yaml 
      
      PLAY [all] ****************************************************************************************************************************************************************
      
      TASK [Gathering Facts] ****************************************************************************************************************************************************
      ok: [client.example.com]
      
      TASK [输出某个用户] *************************************************************************************************************************************************************
      ok: [client.example.com] => {
          "ansible_facts['ansible_local']['example']['users']['user_one'] }}": "zhangsan}}"
      }
      
      PLAY RECAP ****************************************************************************************************************************************************************
      client.example.com         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
      执行playbook另外一种方式 

    5、使用魔法(magic)变量

    1️⃣:一些变量并非事实或通过setup模块配置,但也由Ansible自动设置。这些魔法变量也可用于获取与特定受管主机相关的信息

    2️⃣:常用的魔法变量

    魔法变量说明
    hostvars 包含受管主机的变量,可以用于获取另一台受管主机的变量的值。
    如果还没有为受管主机收集事实,则它不会包含该主机的事实。
    group_names 列出当前受管主机所属的所有组
    groups 列出清单中的所有组和主机
    inventory_hostname 包含清单中配置的当前受管主机的主机名称。
    因为各种原因有可能与事实报告的主机名称不同

    3️⃣:更多魔法变量,请参考官方文档:https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html#special-variables

  • 相关阅读:
    2015-SH项目总结
    2015年总结
    [css]我要用css画幅画(七)
    [css]我要用css画幅画(六)
    [css]我要用css画幅画(五)
    [css]我要用css画幅画(四)
    [css]我要用css画幅画(三)
    程序遇到问题需要关闭
    ASP.NET Core 验证:(二)介绍ASP.NET Core的 Indentity
    ASP.NET Core 验证:(一)概述
  • 原文地址:https://www.cnblogs.com/itwangqiang/p/13603640.html
Copyright © 2020-2023  润新知