使用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中对数组进行处理

广告
将在 10 秒后关闭
bannerAds