使用Ansible在远程主机上执行命令并以JSON格式返回结果
虽然在Ansible中执行远程命令也不错,但是
你是否希望能获取命令的执行结果呢?尽管读取并执行playbook,可以执行命令,但无法预知结果有点遗憾。所以,如果能以JSON格式返回结果,可以用于很多事情。
创建主机清单
主机
[本地主机]
192.168.1.202
【虚拟主机】
192.168.33.11
因为不太漂亮,所以不必参考太多。
创建playbook
---
- name: virtual #お好きな名前
hosts: all #hostsに対して指定あれば特にないならallで
remote_user: hoge #ログイン先のユーザ名
gather_facts: no
tasks: #実際の操作
- name: ping #お好きな名前
command: "free -m" #コマンド実行
请执行命令并以JSON格式输出
[neruneru@localhost playbooks]$ ANSIBLE_CONFIG=/home/neruneru/ansible/examp
son_ansible.cfg ansible-playbook --ask-pass -i /home/neruneru/ansible/examples/hosts virtual.yml
SSH password:
{
"plays": [
{
"play": {
"id": "00199976-cf1f-a591-0634-000000000007",
"name": "virtual"
},
"tasks": [
{
"hosts": {
"192.168.1.202": {
"_ansible_no_log": false,
"_ansible_parsed": true,
"changed": true,
"cmd": [
"free",
"-m"
],
"delta": "0:00:00.007026",
"end": "2018-03-01 00:22:32.043448",
"invocation": {
"module_args": {
"_raw_params": "free -m",
"_uses_shell": false,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"warn": true
}
},
"rc": 0,
"start": "2018-03-01 00:22:32.036422",
"stderr": "",
"stderr_lines": [],
"stdout": " total used fr buff/cache available\nMem: 3951 1126 234 46 2496\nSwap: 4093 7 4086",
"stdout_lines": [
" total used free cache available",
"Mem: 3951 1126 234 2589 2496",
"Swap: 4093 7 4086"
]
},
"192.168.33.11": {
"_ansible_no_log": false,
"_ansible_parsed": true,
"changed": true,
"cmd": [
"free",
"-m"
],
"delta": "0:00:00.029999",
"end": "2018-02-28 15:22:32.312896",
"invocation": {
"module_args": {
"_raw_params": "free -m",
"_uses_shell": false,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"warn": true
}
},
"rc": 0,
"start": "2018-02-28 15:22:32.282897",
"stderr": "",
"stderr_lines": [],
"stdout": " total used fr buff/cache available\nMem: 993 90 658 13 749\nSwap: 2047 0 2047",
"stdout_lines": [
" total used free cache available",
"Mem: 993 90 658 243 749",
"Swap: 2047 0 2047"
]
}
},
"task": {
"id": "00199976-cf1f-a591-0634-000000000009",
"name": "ping"
}
}
]
}
],
"stats": {
"192.168.1.202": {
"changed": 1,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"192.168.33.11": {
"changed": 1,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
}
}
}
让我们逐个查看执行命令吧。
■ANSIBLE_CONFIG=/home/neruneru/ansible/examp
son_ansible.cfg
⇒将按以下顺序优先执行cfg文件
以下是ansible.cfg的读取顺序。配置会按照以下顺序读取,首先读取存在的配置并生效,后续的配置文件将被忽略。
1. ANSIBLE_CONFIG(环境变量)指定
2. ./ansible.cfg
3. ~/ansible.cfg
4. /etc/ansible/ansible.cfg
★本次我们指定了ANSIBLE_CONFIG。
顺便提一下,json_ansible.cfg的内容是什么。
[defaults]
stdout_callback = json
●使用ansible-playbook –ask-pass -i /home/neruneru/ansible/examples/hosts virtual.yml。
使用-ask-pass选项可以防止SSH访问被拒绝的命令。
-i用于指定hosts。
使用virtual.yml来指定playbook。
运行后,会询问 SSH 密码并输出。
【参考文献】
–有关 ask-pass
使用 JSON 格式进行输出
playbook,inventry
往后
・由于现在每次都需要键入SSH命令,所以希望能够自动执行
・hosts文件的内容有问题
・希望能从JSON中对数组进行处理