• ansible中的hostvars


    首先来看一个例子:假设我想得到主机IP为172.25.250.9的完全限定域名(FQDN),但是我无法登录该主机,那么就可以用本机里面的hostvars魔法变量(后面会分享我对魔法这个词的理解)这个字典里面的ansible_fact这个子字典(后面会补充解释)来得到。

    首先让我们来看看hostvars里面都是些啥,我们可以通过一下命令来查看hostvars这个字典:

    ansible locahost -m debug -a “var=hostvars"
    复制代码
    localhost | SUCCESS => {
        "hostvars": {
            "172.25.250.10": {
                "ansible_check_mode": false,
                "ansible_diff_mode": false,
                "ansible_facts": {},
                "ansible_forks": 5,
                "ansible_inventory_sources": [
                    "/home/greg/ansible/inventory"
                ],
                "ansible_password": "redhat",
                "ansible_playbook_python": "/usr/libexec/platform-python",
                "ansible_user": "root",
                "ansible_verbosity": 0,
                "ansible_version": {
                    "full": "2.8.0",
                    "major": 2,
                    "minor": 8,
                    "revision": 0,
                    "string": "2.8.0"
                },
                "group_names": [
                    "test"
                ],
                "groups": {
                    "all": [
                        "172.25.250.9",
                        "172.25.250.10",
                        "172.25.250.13",
                        "172.25.250.11",
                        "172.25.250.12"
                    ],
                    "balancers": [
                        "172.25.250.13"
                    ],
                    "dev": [
                        "172.25.250.9"
                    ],
                    "prod": [
                        "172.25.250.11",
                        "172.25.250.12"
                    ],
                    "test": [
                        "172.25.250.10"
                    ],
                    "ungrouped": [],
                    "webservers": [
                        "172.25.250.11",
                        "172.25.250.12"
                    ]
                },
                "inventory_dir": "/home/greg/ansible",
                "inventory_file": "/home/greg/ansible/inventory",
                "inventory_hostname": "172.25.250.10",
                "inventory_hostname_short": "172",
                "omit": "__omit_place_holder__24431a21232ab0a628ff5c537f472e6b49d1e14a",
                "playbook_dir": "/home/greg/ansible"
            }, "172.25.250.11": {
                "ansible_check_mode": false,
                "ansible_diff_mode": false,
                "ansible_facts": {},
                 ....................
            "172.25.250.12": {
                "ansible_check_mode": false,
                "ansible_diff_mode": false,
                "ansible_facts": {},
                "ansible_forks": 5,
                "ansible_inventory_sources": [
                    "/home/greg/ansible/inventory"
                ],
                ..........................
            "172.25.250.13": {
                "ansible_check_mode": false,
                "ansible_diff_mode": false,
                "ansible_facts": {},
                "ansible_forks": 5,
                "ansible_inventory_sources": [
                    "/home/greg/ansible/inventory"
                ],
                ............................
            "172.25.250.9": {
                "ansible_check_mode": false,
                "ansible_diff_mode": false,
                "ansible_facts": {},
                "ansible_forks": 5,
                "ansible_inventory_sources": [
                    "/home/greg/ansible/inventory"
                ],
         ......................
                "inventory_dir": "/home/greg/ansible",
                "inventory_file": "/home/greg/ansible/inventory",
                "inventory_hostname": "172.25.250.9",
                "inventory_hostname_short": "172",
                "omit": "__omit_place_holder__24431a21232ab0a628ff5c537f472e6b49d1e14a",
                "playbook_dir": "/home/greg/ansible"
            }
        }
    }
    复制代码

    从输出结果可以看到,在hostvars里面一共有5个键值对(‘172.25.250.9’:值1,‘172.25.250.13:值2这样的形式。因为我的环境里一共有5个受控节点,所以有五个键值对),每个键值对的值里面都有一个”ansible_facts“的键,这个键对应的值便是生成f的acts(有关远程主机节点的信息)。

    Tip: hostvars里面还有groups这个魔法变量(可以从最上面的输出看到),里面包含了5个节点的IP,也就是all这个组,(所有节点都会被自动划分到all组里面,相对应的,如果一个组没有加入了除all组之外的组,那么这个主机还会被自动划分到ungrouped组里面,也就是说,ungrouped组里面的主机都是没有加入别的组的(除了all组))

     

    好了,现在可以说:fqdn可以通过ansible_facts里面的某个元素来得到,既然我们知道hostvars里面有ansible_facts,那么现在让我们再来看看ansible_facts里面都有些啥。

    复制代码
    ansible localhost -m setup -a "filter=*fqdn*"
    # localhost: 执行节点为本机
    # -m: module
    # setup: 生成ansible_facts
    # -a: append
    # filter: 前面的参数组成的命令会一股脑的全部输出,filter参数用于过滤这些输出
    # *fqdn*: 正则表达式,含有fqdn的项
    复制代码

     

     

     Tip:可以直接执行“ansible localhost -m setup”来查看所有的ansible_facts,由于太冗余这里不再显示。

    从上图我们可以看到,ansible_facts里面的ansible_fqdn存储着localhost(左上角显示的是localhost)的fqdn。

    所以我们可以通过hostvars---->ansible_facts------->ansible_fqdn来得到fqdn,但是hostvars里面有很多不同主机的ansible_facts,所以我们要指定是哪台主机的ansible_facts,这样才能得到正确的fqdn,所以可以通过以下方式得到:

    hostvars["172.25.250.9"]["ansible_facts"]["ansible_fqdn"]

    
    

    对“魔法”的理解:

    If you want to configure your database server using the value of a ‘fact’ from another node, or the value of an inventory variable assigned to another node, you can use hostvars in a template or on an action line

    如果我们想用来自别的节点的信息,那么就可以在jinja或命令行中用hostvars这个魔法变量,我个人的理解是:其“魔法”体现在明明是本机,却可以得到别的主机的信息,所以就很神奇。

    With hostvars, you can access variables defined for any host in the play, at any point in a playbook. You can access Ansible facts using the hostvars variable too, but only after you have gathered (or cached) facts.

    我们还可以通过hostvars变量获取ansible_facts。

    文档链接:

    Discovering variables: facts and magic variables — Ansible Documentation

    在文档内搜索:“Information about Ansible”即可定位到。

     

    在这里问广大网友一个问题,本人刚接触ansible,不理解jinja模板中调用这些魔法变量时为什么可以不先定义的,就是说我想知道ansible是怎么调用jinja文件的,或者是jinja是怎么获取那些没有实现定义在jinja文件中的魔法变量(例如groups)的?恳请各位传道授业,本人不胜感激。

    更新:

      今天在看文章的时候突然看到了自己想要的答案,虽然这个答案很简单,但是就是这个简单的答案能够让我身心稍微有点舒畅。

     

      也就是说,这些魔法变量是ansible自动提供的,我们不需要定义,play-book在运行时,ansible会自动匹配魔法变量,然后赋值。

      原文链接:Ansible inventory_hostname | Examples of Ansible inventory_hostname (educba.com),这篇文章稍微看一下,可以理解inventory_hostname的值是从哪里来的。(就是你定义的主机清单里面的主机名,所以如果你把主机名直接定义为主机IP,那么inventory_name就可以是你的主机的IP)

      另外,ansible文档中说这些魔法变量是保留的,我们不能使用。 

  • 相关阅读:
    【docker安装Mysql并配置主从复制】
    蓝桥杯备战刷题five(自用)
    windows WSL学习笔记
    linux-4.19 内存
    Studio One6.5安装源码教程
    js控制图片在可视区域才展示,图片懒加载
    设计模式:单例、原型和生成器
    ObjectMapper
    一个来自内蒙 正式工作两年的攻城狮的独白以及总结
    [JavaScript][AJAX]axios拦截器,axios基地址,get与post区别;实现非空判断;e.preventDefault();事件委托
  • 原文地址:https://www.cnblogs.com/hisi-tech/p/15944923.html