首页 > 其他分享 >八、fact变量和魔法变量

八、fact变量和魔法变量

时间:2023-12-14 09:46:54浏览次数:29  
标签:变量 主机 魔法 ansible facts fact name

八、fact变量和魔法变量

8.1 fact简介

​ Ansible在执行playbook的时候,第一个任务会自动执行setup模块,该模块用于获取远程主机的系统信息,并将这些信息存储在facts变量中,在playbook中可以随时调用这些变量。

我们可以执行adhoc获取一下fact变量,看看都有什么。

ansible node1 -m setup

image-20230919225641351

setup模块用法

# 收集主机node1的fact信息
ansible node1 -m setup

# 过滤fact变量,查看网卡的信息
ansible test -m setup -a 'filter=ansible_ens160'

# 过滤fact变量,查看主机内存信息
ansible test -m setup -a 'filter=ansible_*_mb

# 将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中 (/etc/ansible/hosts里的主机名)
ansible all -m setup --tree /tmp/facts

8.2 fact变量

​ facts变量是一个嵌套类型的数据格式,facts数据的顶级key为ansible_facts,往下一级的变量名都是以ansible_开头的,常用的facts变量如下:

key 说明
ansible_python_version python版本
ansible_distribution 显示系统发行版
ansible_distribution_major_version 显示系统主版本号
ansible_distribution_version 显示系统版本号
ansible_devices 显示磁盘设备信息
ansible_lvm 显示逻辑卷信息
ansible_memtotal_mb 显示内存总大小
ansible_kernel 显示内核版本
ansible_hostname 显示主机名
ansible_fqdn 显示完整的主机名信息
ansible_default_ipv4 显示主机默认的ip地址

playbook中应该如何调用fact变量?

下面举例,通过调用facts变量去打印被控端的主机名、ip地址。

- name: test var
  hosts: all
  tasks:
        - name: print vars
          debug:
                  msg: "{{ ansible_hostname }} {{ ansible_default_ipv4.address }}"

注意:调用facts变量时,ansible_facts可以不写,直接写下一个层级的key,可以提前将fact变量导出,以便查询自己所需要的变量名。导出方法ansible node1 -m setup > /tmp/facts

image-20230919230508820

8.3 开启和关闭fact

​ ansible默认开启fact,在每一个play的时候,会自动获取playbookhosts清单的所有主机信息。由于fact变量收集的信息比较多,所以开启fact变量后,ansible执行任务会特别慢。

关闭fact方法

fact默认是开启的,要关闭fact,我们需要在play中添加gather_facts: False

- name: test var
  hosts: all
  gather_facts: False
  tasks:
        - name: print vars
          debug:
                  msg: "not use fact"

image-20230924224852321

8.4 set_fact模块

set_fact模块可以自定义facts,这些自定义的facts可以被jinjia2或者playbook调用。如果你想要引用已有的facts变量定义新的变量,则必须通过set_fact来定义,并将其值在playbook中引用。简单理解,set_fact就是变量拼接。

示例:将操作系统发行版和主版本号拼接到新的变量中

- name: test var
  hosts: all
  tasks:
        - name: set_facts
          set_fact:
                  os_version: "{{ ansible_distribution }} - {{ ansible_distribution_major_version }}"
        - name: print vars
          debug:
                  msg: "{{ os_version }}"

image-20230924230056667

8.5 lookup生成变量

​ 在通常情况下,所有的配置信息都会被作为ansible的变量保存了,而且可以保存在ansible允许定义变量的各种地方,诸如vars区段,vars_files加载的文件中,以及host_vars和group_vars目录中。

​ 但在有些时候,我们希望从诸如文本文件或者.csv文件中收集数据作为ansible的变量,或者直接获取某些命令的输出作为ansible的变量,这个时候,我们就需要通过ansible的lookup插件来从这些数据源中读取配置数据,传递给ansbile变量,并在playbook或者模板中使用这些数据。

注意:lookup获取的变量来自于主控端。

ansible支持一套从不同数据源获取数据的lookup,包括file, password, pipe, env, template, csvfile, dnstxt, redis kv, etcd等。

  • file:file可以将文件读取的内容作为变量。
[root@master ansible]# echo hello world >> /tmp/test.txt
[root@master ansible]# cat /tmp/test.txt 
hello world
[root@master ansible]# cat test.yml 
- name: test var
  hosts: all
  tasks:
        - name: set_facts
          set_fact:
                  file_content: "{{ lookup('file','/tmp/test.txt')}}"
        - name: print vars
          debug:
                  msg: "{{ file_content }}"

image-20230924231341149

  • pipe:pipe可以将命令执行的结果作为ansible变量使用。
- name: test var
  hosts: all
  tasks:
        - name: set_facts
          set_fact:
                  date: "{{ lookup('pipe','date \"+%F %T\"')}}"
        - name: print vars
          debug:
                  msg: "{{ date }}"

image-20230924231740327

  • env:env可以将主机上环境变量的值作为ansible变量使用。
- name: test var
  hosts: all
  tasks:
        - name: set_facts
          set_fact:
                  env_hostname: "{{ lookup('env','HOSTNAME')}}"
        - name: print vars
          debug:
                  msg: "{{ env_hostname }}"

image-20230924232124421

8.6 ansible魔法变量

​ Ansible默认会提供一些内置的变量以实现一些特定的功能,我们称之为魔法变量。下面列举一些常用的魔法变量。

  • hostvars:获取指定主机的相关变量,hostvars是一个对象,他存放着所有主机的相关变量,可以通过hostvars['主机']来获取指定主机的相关变量。
- name: test var
  hosts: all
  tasks:
        - name: print node1 vars
          debug:
                  msg: "{{ hostvars['node1'].ansible_default_ipv4.address }}"

image-20230928145246754

注意:主机是指主机清单中定义的主机信息,可以使域名、可以是ip。

  • inventory_hostname:当前正在运行主机的主机名。
- name: test var
  hosts: all
  tasks:
        - name: print node2 vars
          debug:
                  msg: "{{ hostvars[inventory_hostname].ansible_hostname }}"

image-20230928150139592

  • groups:groups用于获取主机清单中所有主机组的信息。
- name: test var
  hosts: all
  tasks:
        - name: print node2 vars
          debug:
                  msg: "{{ groups }}"

image-20230928150821803

groups.all:获取所有主机,包括未加入主机组的主机

groups.test:获取指定组下面的主机

groups.ungrouped:获取所有不属于主机组的主机

  • group_name:当前正在运行主机所属的主机组。

标签:变量,主机,魔法,ansible,facts,fact,name
From: https://www.cnblogs.com/xxth/p/17900484.html

相关文章

  • 变量a的数据和b的数据进行交换
    用第三方变量#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ inta=3; intb=4; inttmp=0; printf("交换前a=%d\n",a); printf("交换前b=%d\n",b); tmp=a; a=b; b=tmp; printf("交换后a=%d\n",a); p......
  • [20231213]tmux与环境变量PTAH.txt
    [20231213]tmux与环境变量PTAH.txt--//昨天给一台机器安装配置tmux,发现登陆tmux后环境变量PATH特别长,问题在于tmux登陆后要重复执行.bash_profile的内容.--//以前遇到过,主要问题在于.bash_profile在配置PATH时写法不合理.exportPATH=$PATH;...exportPATH=$PATH;...exportPAT......
  • Java变量
    JAVA变量局部变量:必须声明和初始化值作用域在方法体内类变量:也叫静态变量static作用域:在整个类中实例变量:作用域:在整个类中常量:publicclassDemo01{​  //常量final  staticfinaldoublePI=3.14;​  //类变量也叫静态变量static作用域:在整个类中......
  • 1.变量的声明-原始类型
    变量的声明-基础类型/*前言:如果变量的声明和赋值是同时进行的,TS可以自动对变量进行类型检测这里ts自动将variable推断为boolean类型----类型推断机制*/letvariable=false;variable=true;1.number数字类型/*注意:TypeScript里的所有数字都是浮点数,没有......
  • 关于影子变量 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/livepatch/shadow-vars.html关于影子变量影子变量是一种简单的方法,用于让livepatch模块将额外的“影子”数据与现有数据结构关联起来。影子数据是单独分配的,而父数据结构保持不变。本文档描述的影子变量API用于为它们的父对象分配/......
  • mysql安装及环境变量配置
    1.把下载的压缩包放到安装目录下后解压2.环境变量中path里添加mysql安装文件下bin目录的路径3.在mysql中bin的同级目录下新建my.ini配置文件4.编辑my.ini[mysqld]basedir=C:\mysql\mysql-5.7.19-winx64\datadir=C:\mysql\mysql-5.7.19-winx64\data\port=3306skip-grant-tables5.管......
  • (C语言)关于printf的新发现: 可以用字符串变量替代第一个字符串参数
    chara[]="hello%d\n%dworld";printf(a,2,3);//输出://hello2//2world事情的起因是使用printf("\033[0;47;30m");改变命令行字体背景和颜色的时候,室友提起能否让用户改变字体颜色。因为那需要改变printf("");里双引号中的内容,我就下意识觉得不行,但又转念一想,想到了这种......
  • vue2环境变量配置开发环境和生产环境
    在项目根目录下新建.env文件写入变量比如本地链接VUE_APP_BASE_API=http://127.0.0.1:5000/在读取的时候使用process.env.VUE_APP_BASE_API就可以读到这个全局变量process.env.NODE_ENV有两个值开发环境:development,部署环境:production都为Srting字符串下面示例给baseurl添......
  • ChatGPT叫你如何在centos中配置javapath变量
    当使用vim编辑器时,你可以按照以下步骤来编辑bash配置文件:打开~/.bashrc文件:bashvim~/.bashrc或者,如果你选择在系统级别配置,可以使用:bashsudovim/etc/environment在vim中编辑文件:移动光标到文件末尾,按下i进入插入模式,然后添加以下行:bashexportJ......
  • 1.1 从问题背景中理解变量与关系
    在学习数学建模的过程中,最核心的问题就是从题目当中抽象出变量与关系。这是非常重要的一点。但在我指导数学建模竞赛的过程中,这一点往往也成为了学生们的痛点、难点。尤其是在美国COMAP公司举办的一些比赛(HIMCM,IMMC,MCM/ICM)当中问题变得更加隐晦,学生往往难以从题目当中发现问题......