首页 > 其他分享 >Ansible fact变量与魔法变量

Ansible fact变量与魔法变量

时间:2024-06-20 19:21:52浏览次数:26  
标签:变量 ip ansible 192.168 Ansible address fact

目录

fact变量

在常用模块里就提到过setup模块,这个模块会收集被控端的信息,而这个模块收集信息的方式就是依赖于fact,返回的是json格式的数据

[ansible@master ansible]$ ansible all -m setup >setup
[ansible@master ansible]$ vim setup
192.168.200.210 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.200.210",
            "172.17.0.1",
            "10.245.149.0"
        ],

这里面会有非常多的信息,同时这都都是变量,采用键值对的方式

1.1 fact变量的引用

fact变量的引用有个前提就是playbook里面的gather_facts一定要是开启状态

我们让节点输出一个IP地址

通过上面截取的ip地址信息可以得知ansible_all_ipv4_addresses这个变量的值是一个列表,那我们要取出这个列表里的值的话直接给出索引就好了

[ansible@master ansible]$ vim fact-ip.yaml 
[ansible@master ansible]$ cat fact-ip.yaml 
---
- name: print ip
  hosts: all
  tasks:
    - name: Print the first IPv4 address
      debug:
        msg: "{{ ansible_all_ipv4_addresses.0 }}"
        # 这里的写法还可以是 ansible_all_ipv4_addresses[0]

执行剧本

[ansible@master ansible]$ ansible-playbook fact-ip.yaml 
ok: [192.168.200.210] => {
    "msg": "192.168.200.210"
}

这个时候他就返回了一个ip地址

刚刚取出的是一个列表里的某个值,如果我们需要取出一个字典里的值呢?其实这个更加的简单

        "ansible_default_ipv4": {
            "address": "192.168.200.210",
            "alias": "ens33",
            "broadcast": "192.168.200.255",
            "gateway": "192.168.200.2",
            "interface": "ens33",
            "macaddress": "00:0c:29:2c:0d:98",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "192.168.200.0",
            "type": "ether"
        },

比如这一段内容,这些内容都是来自setup

我们需要取出address的话直接这样写

[ansible@master ansible]$ vim fact-ip.yaml 
---
- name: print ip
  hosts: all
  tasks:
    - name: Print the first IPv4 address
      debug:
        msg: "{{ ansible_default_ipv4.address }}"

直接用 **. ** 一直写到你想取出的值的key

[ansible@master ansible]$ ansible-playbook fact-ip.yaml 
ok: [192.168.200.210] => {
    "msg": "192.168.200.210"
}

这个也是没有问题的

我们将fact功能给关掉,看他还能不能正常输出

[ansible@master ansible]$ vim fact-ip.yaml 
---
- name: print ip
  hosts: all
  gather_facts: false
  tasks:
    - name: Print the first IPv4 address
      debug:
        msg: "{{ ansible_default_ipv4.address }}"

去执行他

[ansible@master ansible]$ ansible-playbook fact-ip.yaml
TASK [Print the first IPv4 address] ********************************************
fatal: [192.168.200.210]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'ansible_default_ipv4' is undefined\n\nThe error appears to be in '/home/ansible/ansible/fact-ip.yaml': line 6, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n  tasks:\n    - name: Print the first IPv4 address\n      ^ here\n"}

看到了吧,他直接就报错了,报错的原因是有一个没有被定义的变量

ansible的魔法变量

  1. hostvars:获取指定主机的相关变量格式为 {{ hostvars['主机名'].ansible_default_ipv4.address }},这样可以获取指定主机的IP地址
  2. inventory_hostname:识别当前正在运行task的主机名,可以与hostvars一起使用
    • {{ hostvars[inventory_hostname].ansible_default_ipv4.address }}
  3. groups:列出所有/指定主机组的列表
    • {{ groups }} 列出所有的主机
    • {{ groups.test}} 列出test主机组下的所有主机
    • {{ group_names }} 列出当前正在执行task的主机所在的主机组

1. 魔法变量的使用

现在我们将控制节点也加入到主机清单内

[ansible@master ansible]$ cat inventory 
[test]
192.168.200.210 os=euler
192.168.200.200 ansible_user=root

[test:vars]
ansible_user=ansible
ansible_ssh_pass=123
ansible_become=yes
websoft=nginx

1.1 魔法变量的实际使用

让每台主机输出自己的default IP地址

[ansible@master ansible]$ vim magic-vars.yaml
- name: print ip
  hosts: test
  tasks:
    - name: print
      debug:
        msg: "{{ hostvars[inventory_hostname].ansible_default_ipv4.address }}"

这里的意思是使用hostvars采集某台主机的变量,哪台主机呢?我们使用inventory_hostname 代表当前正在执行这个剧本的主机,然后后面的都是普通的变量了

标签:变量,ip,ansible,192.168,Ansible,address,fact
From: https://www.cnblogs.com/fsdstudy/p/18259349

相关文章

  • PDFFactory&FinePrint软件安装包下载+详细安装教程
    简介:pdfFactoryPro(虚拟打印机)是一个无须Acrobat创建AdobePDF文件的打印机驱动程序。pdffactorypro虚拟打印机提供了比其他程序提供得更简单、更有效率和更少的花费的创建PDF文件的解决方案。用于需要安全的PDF(法律文档、公司信息等)和其他高级功能的用户。安......
  • shell编程规范与变量(shell脚本)
    一、Shell的介绍二、Shell的概述三、Shell的作用在一些复杂的 Linux 维护工作中,大量重复性的输入和交互操作不仅费时费力,而且容易出错,而编写一个恰到好处的 Shell 脚本程序,可以批量处理、自动化地完成一系列维护任务,大大减轻管理员的负担。常见的 Shell 解释器程序......
  • Ansible的变量
    目录Ansible的变量1.在主机清单中定义1.1定义内置变量1.2定义内置变量使用提权1.3给主机组定义变量1.4定义自定义变量2.通过vars定义变量3.通过vars_files定义变量4.通过host_vars和group_vars定义变量5.注册变量Ansible的变量ansible支持变量,用于存储会在整个项目中重......
  • Ansible playbook
    目录Playbook(剧本)1.yaml1.1yaml的语法规则1.2yaml的数据类型1.3yaml的示例2.ansible-playbook2.1playbook入门2.2执行playbook2.3使用playbook安装软件3.更多示例Playbook(剧本)我们之前执行ansble是通过ad-hoc的方式来执行的,这样执行的好处就是我的任务只有1个的时......
  • Ansible的常用模块
    目录ansible常用模块1.file模块1.1file模块的选项1.2file模块的使用1.2.1使用file模块在远程主机创建文件1.2.2创建目录1.2.3删除文件/目录2.copy模块2.1copy模块的选项2.2copy模块的使用3.yum_repository模块3.1yum_repository的选项3.2yum_repository的使用4.yum......
  • Windows中在commond如何设置系统环境变量
    最近测试项目中需要配置一个python环境用来发workjob,配置过程中有一个步骤需要增加系统变量:addtwosystemenvvarsforthetestapplicationbydifferentenvironments(dev/stg/prod):FORGE_TEST_CLIENT_IDFORGE_TEST_CLIENT_SECRET处理方法:1、查看已经设置了哪......
  • Spring Environment 容器环境变量注入Spring属性不一致却能生效
    https://blog.csdn.net/fenglllle/article/details/126942480 前言最近使用容器部署应用,Spring应用,会注入一些环境变量,然而这些环境变量的大小写和真实的取值差异很大,而且也不是xxx.xxx,而是xxx_xxx,非常奇怪,代码里也没发现原因。通过分析Spring源码发现,原理就是Spring的特殊处理......
  • clion调试不显示qt变量值的问题
    用Clion做QT开发,调试时不能正常显示qt相关变量的值,只能显示地址,还要切换到qtcreator调试,很麻烦,就在网上找解决办法。搜了一圈,果然找到了,按照这篇文章中Clion调试QTQString看不到值问题处理_macosclion看不到qt变量内容-CSDN博客设置没用,又找到官方文档上一顿操作,还是不行。Q......
  • shell - 变量及数学计算
    变量声明#注意:以num=1为例,等号两边不能有空格#数字num=1#字符串str0=teststr1='test'str2="test"#字符串的三种声明方式是有区别的:#1.单引号中的内容回原样输出,不会转义,不会取值。#2.双引号中的内容输出,会转义,会取值。#3.没有引号和双引号效果一样。......
  • Bat中实现git和Maven环境变量检测,拉取git代码并打包maven项目,读取子目录差异性yml文件
    场景Docker+Jenkins+Pipline实现SpringBoot项目input选择不同差异性yml文件打包、执行sh打包压缩包、使用archiveArtifacts下载制品(jar包、压缩包):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/139748758上面实现打包后台jar包并选择不同的差异性yml文件打包成......