使用Ansible获取服务器信息

首先

因为之前学习了Ansible的基础,所以这次我打算使用Ansible来获取服务器信息。
我试了很多方法,但在结果的整理等方面遇到了困扰,最终尝试了在每个服务器上执行命令并使用Python来整理信息的方法。

Ansible的配置

目录结构如下所示。

ansible
├── inventory
│   └── hosts
│   
├── json_ansible.cfg
├── json_change.py
├── server_info_get.yml
└── result.json

hosts文件的内容如下。

[targets]
192.168.163.130
192.168.163.131

接下来是Play-book(server_info_get.yml)的内容如下。

- hosts: targets
  user: root
  gather_facts: false
  tasks:
        - command: "{{ item }}"
          with_items:
            - 'hostname'
            - 'cat /etc/redhat-release'
            - 'uname -a'
            - 'yum list installed'

在with_items下写出要获取的服务器信息。虽然本次目标是CentOS服务器,但如果想在一个play-book中执行包括Windows服务器在内的多个目标,可能需要做一些额外的调整。

接下来,我们想要使用Ansible获取的信息以JSON格式保存,因此需要创建配置文件(json_ansible.cfg)。

[defaults]
stdout_callback = json

這樣一來,Ansible 的設定就完成了。

使用Ansible

那么让我们尝试运行Ansible吧。读取之前创建的配置文件并进行执行。

[root@server ansible]# ANSIBLE_CONFIG=/ansible/json_ansible.cfg ansible-playbook -i inventory/hosts server_info_get.yml > result.json

使用ANSIBLE_CONFIG来指定配置文件,并执行Ansible,将执行结果导出到result.json中。

那么让我们来查看一下内容吧。因为内容很多,所以我们可以使用less来浏览。

[root@server ansible]# less result.json
{
    "plays": [
        {
            "play": {
                "id": "000c29a4-5724-73ef-251b-000000000008",
                "name": "targets"
            },
            "tasks": [
                {
                    "hosts": {
                        "192.168.163.130": {
                            "changed": true,
                            "msg": "All items completed",
                            "results": [
                                {
                                    "_ansible_ignore_errors": null,
                                    "_ansible_item_result": true,
                                    "_ansible_no_log": false,
                                    "_ansible_parsed": true,
                                    "changed": true,
                                    "cmd": [
                                        "hostname"
                                    ],
                                    "delta": "0:00:00.008092",
                                    "end": "2019-10-28 16:38:35.390429",
                                    "failed": false,
                                    "invocation": {
                                        "module_args": {
                                            "_raw_params": "hostname",
                                            "_uses_shell": false,
                                            "chdir": null,
                                            "creates": null,
                                            "executable": null,
                                            "removes": null,
                                            "stdin": null,
                                            "warn": true
                                        }
                                    },
                                    "item": "hostname",
                                    "rc": 0,
                                    "start": "2019-10-28 16:38:35.382337",
                                    "stderr": "",
                                    "stderr_lines": [],
                                    "stdout": "test1",
                                    "stdout_lines": [
                                        "test1"
~~~~~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~~~~
                                    ]
                                }
                            ],
                            "warnings": [
                                "Consider using yum module rather than running yum"
                            ]
                        }
                    },
                    "task": {
                        "id": "000c29a4-5724-73ef-251b-00000000000a",
                        "name": ""
                    }
                }
            ]
        }
    ],
    "stats": {
        "192.168.163.130": {
            "changed": 1,
            "failures": 0,
            "ok": 1,
            "skipped": 0,
            "unreachable": 0
        },
        "192.168.163.131": {
            "changed": 1,
            "failures": 0,
            "ok": 1,
            "skipped": 0,
            "unreachable": 0
        }
    }
}

看起来执行得很顺利。

JSON文件的格式化

虽然可以通过JSON格式获取信息,但多数信息多余且难以阅读。因此,我打算使用Python将JSON文件信息转化为人眼更易读的形式。

我创建了一个类似以下的程序。

#coding:utf-8
import json
import sys
import pprint

# コマンドライン引数を取り込む。
args = sys.argv
# コマンドライン引数の2番目を取得。
jsonfile = args[1]

f = open(jsonfile,'r')
jsonfile = json.load(f)

for i in json_dict['plays']:
    for j in i['tasks']:
        for m in j['hosts'].items():
          print(m[0])
          data=m[1]["results"]
          print(data[0]["stdout"])
          print(data[1]["stdout"])
          print(data[2]["stdout"])
          print(data[3]["stdout"])

执行这个。

[root@server ansible]# python3 json_change.py result.json

192.168.163.130
test1
CentOS Linux release 7.6.1810 (Core)
Linux test1 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
読み込んだプラグイン:fastestmirror
インストール済みパッケージ
GeoIP.x86_64                          1.5.0-13.el7                     @anaconda
NetworkManager.x86_64                 1:1.12.0-6.el7                   @anaconda
NetworkManager-libnm.x86_64           1:1.12.0-6.el7                   @anaconda
~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~
xz-libs.x86_64                        5.2.2-1.el7                      @anaconda
yum.noarch                            3.4.3-161.el7.centos             @anaconda
yum-metadata-parser.x86_64            1.1.4-10.el7                     @anaconda
yum-plugin-fastestmirror.noarch       1.1.31-50.el7                    @anaconda
zlib.x86_64                           1.2.7-18.el7                     @anaconda
192.168.163.131
test2
CentOS Linux release 7.6.1810 (Core)
Linux jtf-docker 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
読み込んだプラグイン:fastestmirror
インストール済みパッケージ
GeoIP.x86_64                         1.5.0-13.el7                   @anaconda
NetworkManager.x86_64                1:1.12.0-10.el7_6              @updates
NetworkManager-libnm.x86_64          1:1.12.0-10.el7_6              @updates
~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~
yum-metadata-parser.x86_64           1.1.4-10.el7                   @anaconda
yum-plugin-fastestmirror.noarch      1.1.31-50.el7                  @anaconda
yum-utils.noarch                     1.1.31-50.el7                  @base
zlib.x86_64                          1.2.7-18.el7                   @anaconda

哦!有点难看,但只显示了我想要的信息!

下一个任务

情報已经获取并且已经格式化成json文件了,但是还是有点难看。说实话,python的嵌套太深了,我个人觉得有点麻烦。。。
所以下次我打算用工具将获取到的信息可视化。(虽然会离开ansible)

请提供更多上下文以便我准确地为您提供翻译。这可以是原始句子的上下文、使用该短语的句子、或将这个短语放入句子中的方式。感谢您的配合!

广告
将在 10 秒后关闭
bannerAds