---
- hosts: webservers
user: root
vars:
name: dpkg Tom
tasks:
- name: Verify that apt-show-versions is installed and install it if it is not present
action: apt pkg=apt-show-versions state=present
- name: Launch a custom dpkg-show-versions module
action: dpkg_tom
# DEFINITION DE LA FONCTION PRINCIPALE
main()
{
# parseArguments $1
echo -n "{\"changed\": \"False\", \"name\": \"dpkg_tom\", \"packages\": ["
nombre_lignes=$(apt-show-versions --upgradeable | wc -l)
compteur=1
apt-show-versions --upgradeable | while read line
do
echo "$line" | sed 's@^\(.*\?\)/\(.*\?\) \(.*\?\) from \(.*\?\) to \(.*\)@{\"\1\":{\"distribution\": \"\2\",\"status\": \"\3\",\"installed_version\": \"\4\",\"available_version\": \"\5\"@';
echo -ne "}}"
if [ $compteur -lt $nombre_lignes ]
then
echo -ne ","
fi
compteur=$[$compteur + 1]
done
# echo -ne "\"\":{";
echo -n "]}"
}
######################################################
main
import os
import time
import sqlite3
dbname = '/etc/ansible/cmdb.db'
TIME_FORMAT='%Y-%m-%d %H:%M:%S'
try:
con = sqlite3.connect(dbname)
cur = con.cursor()
except:
pass
def log(host, data):
if type(data) == dict:
invocation = data.pop('invocation', None)
if invocation.get('module_name', None) != 'setup':
return
facts = data.get('ansible_facts', None)
now = time.strftime(TIME_FORMAT, time.localtime())
try:
# `host` is a unique index
cur.execute("REPLACE INTO inventory (now, host, arch, dist, distvers, sys,kernel) VALUES(?,?,?,?,?,?,?);",
(
now,
facts.get('ansible_hostname', None),
facts.get('ansible_architecture', None),
facts.get('ansible_distribution', None),
facts.get('ansible_distribution_version', None),
facts.get('ansible_system', None),
facts.get('ansible_kernel', None),
))
con.commit()
except:
pass
class CallbackModule(object):
def runner_on_ok(self, host, res):
log(host, res)
fatal: [127.0.0.1] => Traceback (most recent call last):
File "/usr/lib/pymodules/python2.6/ansible/runner/__init__.py", line 236, in _executor
exec_rc = self._executor_internal(host)
File "/usr/lib/pymodules/python2.6/ansible/runner/__init__.py", line 292, in _executor_internal
return self._executor_internal_inner(host, self.module_name, self.module_args, inject, port)
File "/usr/lib/pymodules/python2.6/ansible/runner/__init__.py", line 435, in _executor_internal_inner
self.callbacks.on_ok(host, data)
File "/usr/lib/pymodules/python2.6/ansible/callbacks.py", line 363, in on_ok
super(PlaybookRunnerCallbacks, self).on_ok(host, host_result)
File "/usr/lib/pymodules/python2.6/ansible/callbacks.py", line 191, in on_ok
call_callback_module('runner_on_ok', host, res)
File "/usr/lib/pymodules/python2.6/ansible/callbacks.py", line 50, in call_callback_module
method(*args, **kwargs)
File "/usr/lib/pymodules/python2.6/ansible/callback_plugins/inventory.py", line 43, in runner_on_ok
log(host, res)
File "/usr/lib/pymodules/python2.6/ansible/callback_plugins/inventory.py", line 18, in log
if invocation.get('module_name', None) != 'setup':
AttributeError: 'NoneType' object has no attribute 'get'
FATAL: all hosts have already failed -- aborting
#!/usr/bin/perl8<---------------------------------------------------------------------------------------------------------------------------
use strict;
use warnings;
sub main
{
print "{\"changed\": \"False\", \"packages\": [";
my $nbrLignes=`apt-show-versions | wc -l`;
my $compteur=0;
for(`apt-show-versions`) {
$compteur++;
# Formats attendus :
# zlib1g/squeeze uptodate 1:1.2.3.4.dfsg-3
# libnss3-1d/squeeze upgradeable from 3.12.8-1+squeeze5 to 3.12.8-1+squeeze6
# ansible-provisioning 0.9 installed: No available version in archive
next if not $_ =~ /
^
([a-z0-9_-]*?) # package
\/ # slash
(.*?) # distribution
\s #
(.*?) # status
\s #
(?: # groupe non capturant
from # from
\s #
(.*?) # installed_version
\s #
to # to
\s #
)? # fin de groupe non capturant
(.+$) # available_version
/ix; # case Insensitive and eXtended spacing
my $package = $1;
my $distribution = $2;
my $status = $3;
my $installed_version = '';
my $available_version = '';
if(defined $4) {
$installed_version = $4;
$available_version = $5;
}
else {
$installed_version = $5;
}
print "{\"$package\":{\"distribution\": \"$distribution\",\"status\": \"$status\",\"installed_version\": \"$installed_version\",\"available_version\": \"$available_version\"}}";
if($compteur < $nbrLignes) {
print ","
}
}
print "]}";
}
######################################################
main;
if type(data) == dict:
invocation = data.pop('invocation', None)
if invocation is None:
return
if invocation.get('module_name', None) != 'the_name_of_my_module':8<---------------------------------------------------------------------------------------------------------------------------
return