自动化批量导入机器到Jumpserver:提高效率与一致性的关键步骤

Ansible批量主机机器到Jumpserver

1、背景

在现代 IT 环境中,随着机器数量的增加和复杂性的提高,手动管理和配置机器变得越来越困难和耗时。为了提高效率并确保一致性,自动化工具成为了不可或缺的一部分。Jumpserver 是一个功能强大的堡垒机和服务器管理平台,可以帮助管理员更好地管理和控制远程机器。

最近,我们面临着一个挑战:需要将一批新的机器(约 K 台)导入到 Jumpserver 中,并按照预定义的分组进行组织。手动逐个导入这些机器将是一项繁琐且容易出错的任务。为了解决这个问题,我们决定使用自动化脚本来批量导入机器到 Jumpserver,并根据分组进行组织

2、环境准备

Ansible

root@wq-1:~/file# ansible --version
ansible 2.10.8
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]

Jumpserver 版本(3.8.1)

3、操作流程

jumpserverAPI 文档 ⚓︎ https://docs.jumpserver.org/zh/master/dev/rest_api/

1、获取 Jumpserver 的 token

需要替换 网站地址 和 用户 账号 和 密码。

(注意):Jumpserver 的版本不一样,接口文档的参数也会变得,请依照自己的版本接口调试。

curl -X POST https://jms.网站.top/api/v1/authentication/auth/      -H 'Content-Type: application/json'      -d '{"username": "admin", "password": "xxxx"}'

在这里插入图片描述

2、创建所有机器的模板账号

所有的机器可以统一使用同一 账号来管理。账号可以使用 ,密码或秘钥。根据自己情况来操作,我们这边需要这个模板账号的 id 进行绑定,这样就可以在 Jumpserver 中远程访问机器。

步骤 1
在这里插入图片描述

步骤 2
在这里插入图片描述

​​

步骤 3
在这里插入图片描述

​​

我们需要这个 id 号。

3、自动创建分组和机器脚本

add_jms_hosts.sh (会参入三个参数 分组名称 IP 地址 主机名称) 注意:这个脚本必选 配合 jq 。请先安装完成使用

yum install -y jq

主机名称作为 id 来的,所以值必选唯一,请注意


#!/bin/bash

# JumpServer API 相关信息
JUMPSERVER_URL="http://10.1.10.3/api/v1"
JUMPSERVER_TOKEN="8j85rhlicQ8Mjxxxxx"

# 传入的参数
GROUP_NAME="$1"
IP="$2"
HOST_NAME="$3"

# 检查分组是否存在,不存在则创建
check_and_create_group() {
    echo "检查分组是否存在..."
    group_id=$(curl -s -H "Authorization: Bearer $JUMPSERVER_TOKEN" "$JUMPSERVER_URL/assets/nodes/" | jq -r --arg GROUP_NAME "$GROUP_NAME" '.[] | select(.name==$GROUP_NAME) | .id')
  
    if [ -z "$group_id" ]; then
        echo "分组不存在,创建分组..."
        group_id=$(curl -s -X POST -H "Authorization: Bearer $JUMPSERVER_TOKEN" -H "Content-Type: application/json" -d '{"value": "'$GROUP_NAME'"}' "$JUMPSERVER_URL/assets/nodes/" | jq -r '.id')
        echo "创建后的分组ID: $group_id"
    else
        echo "找到的分组ID: $group_id"
    fi
}

# 创建或更新资产
create_or_update_asset() {
    echo "创建或更新资产 $HOST_NAME ..."
    asset_data='{
        "name": "'$HOST_NAME'",
        "address": "'$IP'",
        "platform": "1",
        "protocols": [{"name": "ssh", "port": 22}],
        "is_active": true,
        "nodes": ["'$group_id'"],
        "accounts": [{"template": "f728c07f-003e-415e-a6be-d02e6fbf7f28"}] #此处的id,为模板账号 id
    }'

    response=$(curl -s -X POST -H "Authorization: Bearer $JUMPSERVER_TOKEN" -H "Content-Type: application/json" -d "$asset_data" "$JUMPSERVER_URL/assets/hosts/")
    echo "资产创建或更新响应: $response"
}

check_and_create_group
create_or_update_asset

执行 demo

root@wq-1:~/file# ./add_jms_hosts.sh ownit 192.168.16.16 ownit-16
检查分组是否存在...
分组不存在,创建分组...
创建后的分组ID: b939d606-e334-494f-8a87-b1b464a941ce
创建或更新资产 ownit-16 ...
资产创建或更新响应: {"id":"ec503228-77e8-4d44-9c5a-a322f45ad4ec","name":"ownit-16","address":"192.168.16.16","comment":"","domain":null,"platform":{"id":1,"name":"Linux"},"nodes":[{"id":"b939d606-e334-494f-8a87-b1b464a941ce","name":"ownit"}],"labels":[],"protocols":[{"name":"ssh","port":22}],"nodes_display":["/Default/ownit"],"category":{"value":"host","label":"主机"},"type":{"value":"linux","label":"Linux"},"connectivity":{"value":"-","label":"未知"},"auto_config":{"su_enabled":true,"domain_enabled":true,"ansible_enabled":true,"id":1,"ansible_config":{"ansible_connection":"smart"},"ping_enabled":true,"ping_method":"posix_ping","ping_params":{},"gather_facts_enabled":true,"gather_facts_method":"gather_facts_posix","gather_facts_params":{},"change_secret_enabled":true,"change_secret_method":"change_secret_posix","change_secret_params":{},"push_account_enabled":true,"push_account_method":"push_account_posix","push_account_params":{"sudo":"/bin/whoami","shell":"/bin/bash","home":"","groups":""},"verify_account_enabled":true,"verify_account_method":"verify_account_posix","verify_account_params":{},"gather_accounts_enabled":true,"gather_accounts_method":"gather_accounts_posix","gather_accounts_params":{},"remove_account_enabled":true,"remove_account_method":"remove_account_posix","remove_account_params":{},"platform":1},"created_by":"Administrator","gathered_info":{},"org_id":"00000000-0000-0000-0000-000000000002","org_name":"Default","spec_info":{},"is_active":true,"date_verified":null,"date_created":"2024/01/26 09:50:54 +0800"}

在这里插入图片描述

4、Ansible 批量跑脚本

上面的脚本已经实现,现在就批量跑数据。(注意,使用 Ansible 跑,但是有个问题,有些不成功) 最后使用 shell 脚本来处理 的

Ansible 的 hosts 定义

root@wq-1:~/ansible# cat hosts 
[all:vars]
ansible_ssh_user=root
ansible_ssh_pass=dgadxxx

[wq]
10.1.11.[1:90]
[li]
10.1.17.[1:46]

Ansible 的剧本文件(注意 hosts 的定义,我是按分组单个执行)

 {{ group_names[0] }} {{ inventory_hostname }}  这两个是Ansible的内置变量

ansible own  -m setup 可以使用 这个查询那个有内置变量
[root@bt ~]# ansible own  -m setup  | head -n  50
192.168.102.20 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.102.20", 
            "172.17.0.1", 
            "172.23.0.1", 
            "172.18.0.1", 
            "172.22.0.1", 
            "172.25.1.10", 
            "172.19.0.1"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::a095:f2ff:fe80:413b", 
            "fe80::42:b1ff:fe02:9e5f", 
            "fe80::42:20ff:fe5e:7cfd", 
            "fe80::6c19:a7ff:fe5e:a4f", 
            "fe80::ac72:32ff:feaa:3ef", 
            "fe80::c0a1:c1ff:fea2:63b9"
        ], 
        "ansible_apparmor": {
            "status": "disabled"
        }, 


root@wq-1:~/ansible# cat add_jms_host.yml 
- hosts: wq
  remote_user: root
  gather_facts: no
  tasks:
    - name: 复制 jq 到远程主机
      copy:
        src: /usr/bin/jq
        dest: /usr/bin/jq
        mode: '0755'

    - name: 获取系统的主机名称
      shell: hostname
      register: result

    - name: 打印变量
      debug:
        msg:
          - "Group Name: {{ group_names[0] }}"
          - "Ansible Host: {{ inventory_hostname  }}"
          - "Inventory Hostname: {{ result.stdout }}"

    - name: "执行添加到 JumpServer 的脚本"
      script: /root/file/add_jms_hosts.sh {{ group_names[0] }} {{ inventory_hostname }} {{ result.stdout }}
      args:
        executable: /bin/bash

执行的 demo

 ansible-playbook add_jms_host.yml -i ./hosts

上执行完毕,但是有问题,我 90 台机器,但实际添加的只有 30 台,其余是执行正常的,但是没有添加。

或者使用下面的

- hosts: wq
  remote_user: root
  gather_facts: no
  tasks:
    - name: 复制 jq 到远程主机
      copy:
        src: /usr/bin/jq
        dest: /usr/bin/jq
        mode: '0755'

    - name: 复制 add_jms_hosts.sh 到远程主机
      copy:
        src: /root/file/add_jms_hosts.sh
        dest: /root/add_jms_hosts.sh
        mode: '0755'

    - name: 获取系统的主机名称
      shell: hostname
      register: result

    - name: 打印变量
      debug:
        msg:
          - "Group Name: {{ group_names[0] }}"
          - "Ansible Host: {{ inventory_hostname  }}"
          - "Inventory Hostname: {{ result.stdout }}"

    - name: 执行添加到 JumpServer 的脚本
      command: /bin/bash /root/add_jms_hosts.sh {{ group_names[0] }} {{ inventory_hostname }} {{ result.stdout }}

5、shell 执行批量数据

如果上面的执行还是不行,那就使用 下方的方式 100 % 可以。

我先使用 ansible 跑出 分组 ip 和 主机名称

- hosts: li
  remote_user: root
  gather_facts: no
  tasks:
    - name: 获取系统的主机名称
      shell: hostname
      register: result

    - name: 打印变量
      debug:
        msg:
          - "{{ group_names[0] }}  {{ inventory_hostname  }}  {{ result.stdout }} "

执行

ansible-playbook test.yml -i ./hosts  >> 1.txt

cat 1.txt | grep wq > /root/file/host  (编辑host 删除 第一行 非 ip的)

sed 's/. *"(.* \)".*/\1/'  host  > 1.txt   (出去 双引号)



过滤后的数据格式 



root@wq-1:~/file# cat 1.txt 
li  10.1.17.1  li-1 
li  10.1.17.2  li-2 
li  10.1.17.3  li-3 
li  10.1.17.4  li-4 
li  10.1.17.5  li-5 
li  10.1.17.6  li-6 
li  10.1.17.7  li-7 
li  10.1.17.8  li-8 
li  10.1.17.9  li-9 
root@wq-1:~/file# cat star_add.sh 
#!/bin/bash

while IFS= read -r line; do
  group=$(echo "$line" | awk '{print $1}')
  ip=$(echo "$line" | awk '{print $2}')
  name=$(echo "$line" | awk '{print $3}')
  echo "Group: $group, IP: $ip, Name: $name"
  # 在这里执行您的操作,例如调用其他脚本并传递这三个变量
  ./add_jms_hosts.sh "$group" "$ip" "$name"
done < 1.txt

bash star_add.sh 注册到 jumpserver 上

在这里插入图片描述

4、总结

我们的解决方案是编写一个脚本,该脚本可以读取包含机器信息的文本文件,并使用 Jumpserver 提供的 API 进行自动导入。脚本首先通过逐行读取文本文件来获取每台机器的相关信息,例如 IP 地址、主机名和分组。然后,它使用 Jumpserver 的 API 调用来创建新的机器对象,并将其分配到相应的分组中。

通过使用这个自动化脚本,我们可以大大减少手动操作的工作量,并确保导入的机器被正确地组织到 Jumpserver 中的相应分组中。这不仅提高了操作效率,还降低了出错的风险,并提供了一致性和可追溯性。

总结起来,通过编写自动化脚本来批量导入机器到 Jumpserver,并根据预定义的分组进行组织,我们能够提高工作效率、降低错误率,并确保一致性和可追溯性。这个解决方案为我们节省了宝贵的时间和精力,使我们能够更好地管理和控制远程机器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/349536.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux之系统安全与应用

Linux系统提供了多种机制来确保用户账号的正当&#xff0c;安全使用。 系统安全措施 一. 清理系统账号 1.1 将用户设置为无法登录 Linux系统中除手动创建的各种账号外&#xff0c;还包括随系统或程序安装过程而生成的其他大量账号。除了超级用户root以外&#xff0c;其他的…

企业能源消耗监测管理系统是否可以做好能源计量与能耗分析?

能源消耗与分析是能源科学管理的基础&#xff0c;也可促进能源管理工作的改善&#xff0c;在企业中能源管理系统的作用也愈加重要。 首先&#xff0c;能源计量是能源管理的基础&#xff0c;通过能源精准计老化&#xff0c;容易出现测量设备不准确以及其他一些人为因素原因导致…

NC65中间件能启动,前端客户端启动失败,加载异常,卡住(org.owasp.esapi)

控制台输出错误 ESAPI.properties could not be loaded by any means. Fail.SecurityConfiguration class(org.owasp.esapi.reference.DefaultSecurityConfiguration) CTOR threw exception.效果图&#xff1a; 解决方案 添加如下参数&#xff1a; -Dorg.owasp.esapi.resou…

金融帝国实验室(Capitalism Lab)V10版本推出新招高管待命选项

金融帝国实验室&#xff08;Capitalism Lab&#xff09;V10版本推出新招高管待命选项 ————————————— 【全新V10版本开发播报】 即将发布的V10版本&#xff0c;在“分配管理器”菜单上将引入一个名为“暂时待命”的新功能。启用此选项后&#xff0c;分配给公司的高…

docker 网络及如何资源(CPU/内存/磁盘)控制

安装Docker时&#xff0c;它会自动创建三个网络&#xff0c;bridge&#xff08;创建容器默认连接到此网络&#xff09;、 none 、host docker网络模式 Host 容器与宿主机共享网络namespace&#xff0c;即容器和宿主机使用同一个IP、端口范围&#xff08;容器与宿主机或其他使…

Vulnhub靶场DC-6

攻击机192.168.223.128 靶机192.168.223.134 主机发现:nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.134 开启了22 80端口&#xff0c;80是apache 2.4.25 先进入web界面看一下 用ip进不去&#xff0c;应该被重定向到wordy.com vim /etc/hosts 加上 19…

【医学图像隐私保护】联邦学习:密码学 + 机器学习 + 分布式 实现隐私计算,破解医学界数据孤岛的长期难题

联邦学习&#xff1a;密码学 机器学习 分布式 提出背景&#xff1a;数据不出本地&#xff0c;又能合力干大事联邦学习的问题 分布式机器学习&#xff1a;解决大数据量处理的问题横向联邦学习&#xff1a;解决跨多个数据源学习的问题纵向联邦学习&#xff1a;解决数据分散在多…

某马头条——day11+day12

实时计算和定时计算 流式计算 kafkaStream 入门案例 导入依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusions><exclusion><artifactId>connect-json</artifactId&…

NOIP2003提高组T1:神经网络

题目链接 [NOIP2003 提高组] 神经网络 题目背景 人工神经网络&#xff08;Artificial Neural Network&#xff09;是一种新兴的具有自我学习能力的计算系统&#xff0c;在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向&am…

MSB30M-ASEMI小功率开关电源MSB30M

编辑&#xff1a;ll MSB30M-ASEMI小功率开关电源MSB30M 型号&#xff1a;MSB30M 品牌&#xff1a;ASEMI 正向电流&#xff08;Id&#xff09;&#xff1a;3A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1000V 正向浪涌电流&#xff1a;50A 正向电压&#xff08;…

电影《花千骨》成开年第一烂,新派系当家IP滑铁卢

2024电影市场“开年第一烂”落到了《花千骨》头上。 在整个行业都在为春节档蓄势的情况下&#xff0c;电影市场显得有些沉寂&#xff0c;票房表现也不太出彩&#xff0c;其中最大的输家莫过于新派系文化出品的电影版《花千骨》。 从1月20日上映至今&#xff0c;5天累计票房仅…

带头 + 双向 + 循环链表增删查改实现

目录 源码&#xff1a; List.c文件&#xff1a; List.h文件&#xff1a; 简单的测试&#xff1a; 很简单&#xff0c;没什么好说的&#xff0c;直接上源码。 源码&#xff1a; List.c文件&#xff1a; #include"DLList.h"ListNode* creadNode(LTDataType x) {L…

10.Elasticsearch应用(十)

Elasticsearch应用&#xff08;十&#xff09; 1.为什么需要聚合操作 聚合可以让我们极其方便的实现对数据的统计、分析、运算&#xff0c;例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f;这些手机的平均价格、最高价格、最低价格&#xff1f;这些手机每月的销售情况如…

【Linux】Linux任务管理与守护进程

Linux任务管理与守护进程 一、任务管理1、进程组概念2、作业概念3、会话概念4、相关操作&#xff08;1&#xff09;前台进程&后台进程&#xff08;2&#xff09;jobs、fg、bg、kill 5、ps命令查看指定的选项 二、守护进程1、守护进程的概念2、守护进程的查看3、守护进程的创…

支付宝AES如何加密

继之前给大家介绍了 V3 加密解密的方法之后&#xff0c;今天给大家介绍下支付宝的 AES 加密。 注意&#xff1a;以下说明均在使用支付宝 SDK 集成的基础上&#xff0c;未使用支付宝 SDK 的小伙伴要使用的话老老实实从 AES 加密原理开始研究吧。 什么是AES密钥 AES 是一种高级加…

2.依附弹窗(AttachListPopup)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7 基于基础的Popup对象实现的依附于某个控件的弹窗&#xff0c;弹窗可呈现数组对象&#xff0c;达到较好的选择交互效果。 1.布局 通过Border实现圆角边框轮廓&#xff0c;然后通过内部的ListView实现列表展示。…

Cesium数据加载

文章目录 0.引言1.影像加载1.1Bing地图1.2天地图1.3ArcGIS在线地图1.4高德地图1.5OSM影像1.6MapBox影像 2.OGC地图服务2.1WMS2.2WMTS2.3TMS 3.GeoJSON数据加载4.KML数据加载5.TIFF数据加载6.点云数据加载7.地形数据加载7.1在线地形数据加载7.2本地地形数据加载 8.倾斜摄影模型数…

xcode 设置 ios苹果图标,为Flutter应用程序配置iOS图标

图标设置 1,根据图片构建各类尺寸的图标2.xcode打开ios文件3.xcode设置图标4.打包提交审核,即可(打包教程可通过我的主页查找) 1,根据图片构建各类尺寸的图标 工具网址:https://icon.wuruihong.com/ 下载之后文件目录如下 拷贝到项目的ios\Runner\Assets.xcassets\AppIcon.ap…

没有外网Nginx如何配置如何开启https

判断是否支持open-ssl 在服务器执行如下命令 openssl version没有则安装open-ssl&#xff0c;由于服务器没有外网&#xff0c;可以离线安装openssl-3.0.1.tar.gz&#xff0c;我是在有网的服务器直接下载的&#xff0c;然后再上传到这台无网的服务器上 wget https://www.open…

HttpClient的使用与封装

HttpClient的使用与封装 配置 首先,我们要引入maven依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>这里可以单独引入,如果我…