使用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)