大家都知道ansible的playbook是不会显示标准输出的。
如何能让ansible像commands line 一样有标准输出呢?
ansible Boss+Merchant+Web -m shell -a "hostname;ip a" 192.168.6.210 | success | rc=0 >> Pay-Boss+Merchant+Web 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0c:29:96:06:4e brd ff:ff:ff:ff:ff:ff inet 192.168.6.210/24 brd 192.168.6.255 scope global eth0
我们使用playbook试试呢
[email protected]:/etc/ansible# ansible-playbook playbooks/ftp.yml PLAY [Ftp] ******************************************************************** GATHERING FACTS *************************************************************** ok: [192.168.6.11] TASK: [Make Sure ProFtp is running] ******************************************* ok: [192.168.6.11] TASK: [show hostname] ********************************************************* changed: [192.168.6.11] TASK: [show ip] *************************************************************** changed: [192.168.6.11] PLAY RECAP ******************************************************************** 192.168.6.11 : ok=4 changed=2 unreachable=0 failed=0 [email protected]:/etc/ansible# cat playbooks/ftp.yml - hosts : Ftp remote_user : root tasks : - name : Make Sure ProFtp is running service: name=proftpd state=running - name : show hostname shell : cat /etc/issue || /bin/true - name : show ip command : ip a
通过上图明显看到只会返回OK 失败 返回FAILED
我们可以通过callbacks pulgin 来让playbook返回stdout
如何做呢?
- 首先确认ansible.cfg的路径,pip 安装的ansible是默认没有ansible.cfg这个文件,应该是这样,我们到github上下载这个配置文件到本地,
[email protected]:/etc/ansible# tree . ├── ansible.cfg ├── callbacks │ ├── jastme.py │ └── jastme.pyc ├── hosts └── playbooks ├── boss.yml └── ftp.yml 2 directories, 6 files [email protected]:/etc/ansible# pwd /etc/ansible
修改ansible.cfg,让callbacks的路径定位到你自己的路径下
#callback_plugins = /usr/share/ansible_plugins/callback_plugins callback_plugins = /etc/ansible/callbacks
编写
class CallbackModule(object): #if foo: # self.disabled = True pass def runner_on_ok(self, host, res): # pass if ‘stdout‘ in res.keys(): print res[‘stdout‘] if ‘state‘ in res.keys(): print res[‘state‘] if ‘invocation‘ in res.keys(): print res[‘invocation‘]
其实这个callbacks很简单,不明白的朋友打印一下res即可
我们来看看效果
[email protected]:/etc/ansible# ansible-playbook playbooks/ftp.yml PLAY [Ftp] ******************************************************************** GATHERING FACTS *************************************************************** ok: [192.168.6.11] {‘module_name‘: ‘setup‘, ‘module_args‘: ‘‘} TASK: [Make Sure ProFtp is running] ******************************************* ok: [192.168.6.11] started {‘module_name‘: u‘service‘, ‘module_args‘: u‘name=proftpd state=running‘} TASK: [show hostname] ********************************************************* changed: [192.168.6.11] Ubuntu 14.04.2 LTS \n \l {‘module_name‘: u‘shell‘, ‘module_args‘: u‘cat /etc/issue || /bin/true‘} TASK: [show ip] *************************************************************** changed: [192.168.6.11] 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:75:aa:92 brd ff:ff:ff:ff:ff:ff inet 192.168.6.11/24 brd 192.168.6.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe75:aa92/64 scope link valid_lft forever preferred_lft forever {‘module_name‘: u‘command‘, ‘module_args‘: u‘ip a‘} PLAY RECAP ******************************************************************** 192.168.6.11 : ok=4 changed=2 unreachable=0 failed=0
结果,调用的方法,状态 都有输出了,是不是很OK?这样就更白自己在做什么了。
时间: 2024-10-13 09:47:10