一、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\n"
    }
    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

Ansible_管理事实(Fact)的更多相关文章

  1. Ansible_管理playbook实现配置并行

    一.使用forks在Ansible中配置并行 1.Aniable运行play机制 1️⃣:当Ansible处理playbook时,会按顺序运行每个play.确定play的主机列表之后,Ansible将 ...

  2. Ansible_管理机密

    一.Ansible Vault 1.什么是Ansible Vault Ansible提供的Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件 若要使用Ansible Va ...

  3. SQLite vs MySQL vs PostgreSQL:关系型数据库比较

    自1970年埃德加·科德提出关系模型之后,关系型数据库便开始出现,经过了40多年的演化,如今的关系型数据库种类繁多,功能强大,使用广泛.面对如此之多的关系型数据库,我们应该如何权衡找出适合自己应用场景 ...

  4. Ansible_变量管理与设置

    一.Ansible变量管理 1.变量概述 Ansible支持利用变量来存储值,并在Ansible项目的所有文件中重复使用这些值.这可以简化项目的创建和维护,并减少错误的数量 通过变量,可以轻松地在An ...

  5. 程序员必须要知道的Hadoop的一些事实

    程序员必须要知道的Hadoop的一些事实.现如今,Apache Hadoop已经无人不知无人不晓.当年雅虎搜索工程师Doug Cutting开发出这个用以创建分布式计算机环境的开源软...... 1: ...

  6. Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...

  7. .NET基础拾遗(1)类型语法基础和内存管理基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  8. 会议管理心得记录(非markdown版)

    前提 本文说的会议特指有开发团队成员参与的会议, 包括但不限于开发.设计.测试.运维.管理岗位的成员. 因为不同工种和行业都有其特殊性,我是一名程序员,并不太了解其他工种和行业的具体情况,不敢妄言. ...

  9. [翻译]用 Puppet 搭建易管理的服务器基础架构(3)

    我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第三部分. 本文由 伯乐在线 - Wing 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:Manuel Kiessling.欢迎加 ...

随机推荐

  1. [Fundamental of Power Electronics]-PART I-5.不连续导电模式-5.3 Boost变换器实例

    5.3 Boost变换器实例 作为第二个示例,考虑图5.12的Boost变换器.让我们来确定不同模式的边界并且求解DCM下的电压变换比.此前在2.3节中分析了在CCM工作的Boost变换器的特性,并确 ...

  2. OO第一单元作业——魔幻求导

    简介 本单元作业分为三次 第一次作业:需要完成的任务为简单多项式导函数的求解. 第二次作业:需要完成的任务为包含简单幂函数和简单正余弦函数的导函数的求解. 第三次作业:需要完成的任务为包含简单幂函数和 ...

  3. Python基础之:struct和格式化字符

    目录 简介 struct中的方法 格式字符串 字节顺序,大小和对齐方式 格式字符 格式数字 格式字符 格式字符串 填充的影响 复杂应用 简介 文件的存储内容有两种方式,一种是二进制,一种是文本的形式. ...

  4. Unity2D项目-平台、解谜、战斗! 0.2 序言:团队在线协作方案、基线控制

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 本文跟大家聊一下笔者团队中所使用的在线协作的诸多工具,以及使用这些工具的目的和所记录的内容,希望这些内容在大家团队工作中有所帮 ...

  5. (十三)Docker容器进入的4种方式

    简介 在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法. 进入Docker容器比较常见 ...

  6. 14. VUE 子组件修改父组件的值

    在 Vue 当中,父组件 -> 子组件 传值,都是通过属性的形式传递的. 子组件 修改 传递数据 直接操作父组件传递过来的值,用是可以用的,但是打开控制台后,会发现 Vue 有个警告:你不要直接 ...

  7. SpringBoot中的自动代码生成 - 基于Mybatis-Plus

    作者:汤圆 个人博客:javalover.cc 前言 大家好啊,我是汤圆,今天给大家带来的是<SpringBoot中的自动代码生成 - 基于Mybatis-Plus>,希望对大家有帮助,谢 ...

  8. JAVAEE_Servlet_16_HttpServletRequest中常用方法(三)

    HttpServletRequest中常用方法(三) * 回顾ServletContext对象,ServletContext对象是Servlet上下文对象 - 创建ServletContext对象 S ...

  9. Day03_16_递归

    Java递归 递归包含两个部分 递归头: 标明了什么时候结束递归调用,如果没有递归头,程序将陷入死循环. 递归体: 标明了什么时候需要继续调用自身. 实例 import java.util.Scann ...

  10. Mybatis一级缓存和结合Spring Framework后失效的源码探究

    1.在下面的案例中,执行两次查询控制台只会输出一次 SQL 查询: mybatis-config.xml <?xml version="1.0" encoding=" ...