• Ansible Automation Platform - 导入外部主机清单


    OpenShift / RHEL / DevSecOps / Ansible 汇总目录


    Ansible 的 Playbook 执行目标是 “清单” 中的主机和分组。在 AAP 控制台中可以手工创建 “主机” 并通过 “清单” 关联主机和分组,也可从外部环境中批量导入“主机” 和 “清单” 信息。
    标准 “清单” 中包含哪些主机是静态的,因此必须手动向 “清单” 中添加或删除 “主机”,执行 Playbook 的目标 “清单” 才会有变化。而 AAP 的 “智能清单” 相当于 “主机视图”,可以通过更改 “智能清单” 的过滤条件来动态变更它包含的 “主机”。

    从外部向“清单”批量导入主机

    AAP 支持从 VMware vCenter、OpenStack、红帽虚拟化、AWS、AZure、Google Cloud、红帽卫星、外部文件等源头批量导入主机清单。

    从 VMware vCenter 导入主机清单

    1. 先创建一个 VMware vCenter 类型的 “凭证”。
      在这里插入图片描述
    2. 创建一个新的 “清单”。
      在这里插入图片描述
    3. 在新建的 “清单” 中创建一个新的 “源”。
      在这里插入图片描述
    4. 在 “源” 的编辑页面中按照下图选出 “源” 和 “凭证”,另外将使用在发现主机中包含的 processor_vcpus 变量作为主机选择条件,选出 processor_vcpus = 2 的主机。
      在这里插入图片描述
    5. 保存 “源” 后在详情页面中点击 “同步”,此时 AAP 会按照 “源” 的目标和过滤条件将符合条件的主机导入到 “清单” 中。
      在这里插入图片描述
    6. 再次查看刚刚创建 “清单” 中的 “主机” 页面,可以看到被导入的主机清单列表。
      在这里插入图片描述

    从外部文件导入主机清单

    通过 JSON + 脚本 导入外部主机清单

    1. 在一个 Git 的 Repository 中创建内容如下的 inventory_list 文件,它定义了主机和分组、以及变量。
    {
        "dyngroup":{
            "hosts":[
                "cloud1.cloud.example.com",
                "cloud2.cloud.example.com",
                "cloud3.cloud.example.com",
                "cloud4.cloud.example.com"
            ],
            "vars":{
                "var1": true
            }
        },
        "_meta":{
            "hostvars":{
                "cloud1.cloud.example.com":{
                    "type":"lb"
                },
                "cloud2.cloud.example.com":{
                    "type":"web"
                },
                "cloud3.cloud.example.com":{
                    "type":"web"
                },
                "cloud4.cloud.example.com":{
                    "type":"database"
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    1. 在 Git 的 Repository 中相同位置创建内容如下的 inventory-script 文件,注意需要替换curl 命令使用的 inventory_list 文件访问地址。
    #!/bin/bash
     
    if [ "$1" == "--list" ] ; then
        curl -sS https://gitee.com/dawnskyliu/playbooks_adv_summit2021/raw/master/inventory/inventory_list
    elif [ "$1" == "--host" ]; then
        echo '{"_meta": {"hostvars": {}}}'
    else
        echo "{ }"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 执行以下命令测试 inventory-script 脚本。
    $ ansible-navigator inventory -i inventory-script --list -m stdout
    。。。
    。。。
    {
        "_meta": {
            "hostvars": {
                "cloud1.cloud.example.com": {
                    "type": "lb",
                    "var1": true
                },
                "cloud2.cloud.example.com": {
                    "type": "web",
                    "var1": true
                },
                "cloud3.cloud.example.com": {
                    "type": "web",
                    "var1": true
                },
                "cloud4.cloud.example.com": {
                    "type": "database",
                    "var1": true
                }
            }
        },
        "all": {
            "children": [
                "dyngroup",
                "ungrouped"
            ]
        },
        "dyngroup": {
            "hosts": [
                "cloud1.cloud.example.com",
                "cloud2.cloud.example.com",
                "cloud3.cloud.example.com",
                "cloud4.cloud.example.com"
            ]
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    1. 执行以下命令测试 inventory-script 脚本。
    $ ansible-navigator inventory -i inventory-script --host cloud1.cloud.example.com -m stdout
    。。。
    。。。
    {
        "type": "lb",
        "var1": true
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 在 AAP 控制台上创建一个对应前面 Git Repository 的 “项目”。
      在这里插入图片描述
    2. 创建一个新的 “清单”,然后在其中创建一个新 “源”。然后按照下图将 “源”设为“源于项目”,将 “项目” 和 “清单文件” 设为前面创建的资源。
      在这里插入图片描述
    3. 在新建的 “源” 详情页面中点击 “同步”,AAP 将启动任务运行 Git Repository 中的 inventory-script 文件将 inventory_list 文件中的主机导入到 AAP。
      在这里插入图片描述
    4. 完成后可在 “清单” 中查看从外部文件导入的 “主机”。
      在这里插入图片描述

    通过 INI 清单文件导入外部主机清单

    参照上一节的方法,将清单 “源” 设为 Git 项目的 “inventory/inventory.ini” 文件。

    [group_a]
    server1 ansible_host=203.0.113.111 
    server2 ansible_host=203.0.113.112
    
    [group_b]
    server3 ansible_host=203.0.113.113 
    server4 ansible_host=server_hostname
    
    [group_a:vars]
    ansible_user=sammy
    
    [group_b:vars]
    ansible_user=myuser
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在同步后可以看到导入的主机列表:
    在这里插入图片描述

    通过 YAML 清单文件导入外部主机清单

    参照上一节的方法,将清单 “源” 设为 Git 项目的 “inventory/inventory.yaml” 文件,在同步后可以看到导入的主机列表。

    ll: # keys must be unique, i.e. only one 'hosts' per group
        hosts:
            test1:
            test2:
                host_var: value
        vars:
            group_all_var: value
        children:   # key order does not matter, indentation does
            other_group:
                children:
                    group_x:
                        hosts:
                            test5   # Note that one machine will work without a colon
                    group_y:
                        hosts:
                            test6:  # So always use a colon
                vars:
                    g2_var2: value3
                hosts:
                    test4:
                        ansible_host: 127.0.0.1
            last_group:
                hosts:
                    test1 # same host as above, additional group membership
                vars:
                    group_last_var: value
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    使用“智能清单”

    可以将 “智能清单” 看成是 “主机” 的视图,因此创建新的 “智能清单” 前需要 AAP 中至少先有一个 “主机”。

    1. 在 AAP 的清单中创建一个 “智能清单”。
      在这里插入图片描述

    2. 进入 “智能主机过滤器” 的 “放大镜” 图标,此时在对话框中应该显示当前 AAP 的所有主机。
      在这里插入图片描述

    3. 在弹出对话框中将 “名称” 改为 “高级”,然后按照下图查找 name,查找类型为 regex ,查找内容为 cloud[2-4].cloud.example.com,最后点击 “放大镜” 图标。
      在这里插入图片描述

    4. 此时对话框可之显示过滤后的主机,最后点击 “选择” 按钮。在这里插入图片描述

    5. 查看新创建的 “智能清单” 对应的 “主机”,即为上一步过滤出的主机。
      在这里插入图片描述

    视频

    导入外部主机清单和智能清动态清单
    使用 Playbook 向 Ansible 导入主机清单

    参考

    https://ansible-labs-crew.github.io/ansible-controller-advanced/7-advanced-inventories/
    https://www.digitalocean.com/community/tutorials/how-to-set-up-ansible-inventories

  • 相关阅读:
    【软件测试】一名医院的护士,带着梦追逐诗和远方,拿下测试岗14K......
    Springboot+vue的医药管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。
    博物馆网上展厅有哪些用途,如何搭建数字时代的文化宝库
    ES6的面向对象编程以及ES6中的类和对象
    NX二次开发-NX+VS写代码设断点调试技巧
    循环跨3天活动的一次思考
    VS五子棋大战
    VSCode 自动修改闭合标签
    SpringBoot 中使用自定义参数解析器修改请求对象
    【API篇】三、转换算子API(上)
  • 原文地址:https://blog.csdn.net/weixin_43902588/article/details/128028386