Jan 29

Ansible and Windows Playbooks

Reading time: 3 – 5 minutes

Firstly let me introduce a Windows service called: “Windows Remote Manager” or “WinRM”. This is the Windows feature that allows remote control of Windows machines and many other remote functionalities. In my case I have a Windows 7 laptop with SP1 and PowerShell v3 installed.

Secondly don’t forget that Ansible is developed using Python then a Python library have to manage the WinRM protocol. I’m talking about “pywinrm“. Using this library it’s easy to create simple scripts like that:

#!/usr/bin/env python

import winrm

s = winrm.Session('', auth=('the_username', 'the_password'))
r = s.run_cmd('ipconfig', ['/all'])
print r.status_code
print r.std_out
print r.std_err

This is a remote call to the command “ipconfig /all” to see the Windows machine network configuration. The output is something like:

$ ./winrm_ipconfig.py 

Windows IP Configuration

   Host Name . . . . . . . . . . . . : mini7w
   Primary Dns Suffix  . . . . . . . : 
   Node Type . . . . . . . . . . . . : Hybrid
   IP Routing Enabled. . . . . . . . : No
   WINS Proxy Enabled. . . . . . . . : No
   DNS Suffix Search List. . . . . . : ymbi.net

Ethernet adapter GigaBit + HUB USB:

   Connection-specific DNS Suffix  . : ymbi.net
   Description . . . . . . . . . . . : ASIX AX88179 USB 3.0 to Gigabit Ethernet Adapter
   Physical Address. . . . . . . . . : 00-23-56-1C-XX-XX
   DHCP Enabled. . . . . . . . . . . : Yes
   Autoconfiguration Enabled . . . . : Yes
   Link-local IPv6 Address . . . . . : fe80::47e:c2c:8c25:xxxx%103(Preferred) 
   IPv4 Address. . . . . . . . . . . : 
   Subnet Mask . . . . . . . . . . . :
   Lease Obtained. . . . . . . . . . : mi�rcoles, 28 de enero de 2015 12:41:41
   Lease Expires . . . . . . . . . . : mi�rcoles, 28 de enero de 2015 19:17:56
   Default Gateway . . . . . . . . . :
   DHCP Server . . . . . . . . . . . :
   DHCPv6 IAID . . . . . . . . . . . : 2063606614
   DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-15-F7-BF-36-xx-C5-xx-03-xx-xx
   DNS Servers . . . . . . . . . . . :
   NetBIOS over Tcpip. . . . . . . . : Enabled

Of course, it’s possible to run Powershell scripts like the next one which shows the system memory:

$strComputer = $Host
$RAM = WmiObject Win32_ComputerSystem
$MB = 1048576

"Installed Memory: " + [int]($RAM.TotalPhysicalMemory /$MB) + " MB"

The Python code to run that script is:

#!/usr/bin/env python

import winrm

ps_script = open('scripts/mem.ps1','r').read()
s = winrm.Session('', auth=('the_username', 'the_password'))
r = s.run_ps(ps_script)
print r.status_code
print r.std_out
print r.std_err

and the output:

$ ./winrm_mem.py 
Installed Memory: 2217 MB

In the end it’s time to talk about how to create an Ansible Playbook to deploy anything in a Windows machine. As always the first thing that we need is a hosts file. In the next example there are several ansible variables needed to run Ansible Windows modules on WinRM, all of them are self-explanatory:


ansible_ssh_port=5985 #winrm (non-ssl) port

The first basic example could be a simple playbook that runs the ‘ipconfig’ command and registers the output in an Ansible variable to be showed later like a debug information:

- name: test raw module
  hosts: all
    - name: run ipconfig
      raw: ipconfig
      register: ipconfig
    - debug: var=ipconfig

The command and the output to run latest example:

$ ansible-playbook -i hosts ipconfig.yml 

PLAY [test raw module] ******************************************************** 

GATHERING FACTS *************************************************************** 
ok: []

TASK: [run ipconfig] ********************************************************** 
ok: []

TASK: [debug var=ipconfig] **************************************************** 
ok: [] => {
    "ipconfig": {
        "invocation": {
            "module_args": "ipconfig", 
            "module_name": "raw"
        "rc": 0, 
        "stderr": "", 
        "stdout": "\r\nWindows IP Configuration\r\n\r\n\r\nEthernet adapter GigaBit 

PLAY RECAP ********************************************************************                  : ok=3    changed=0    unreachable=0    failed=0 

As always Ansible have several modules, not only the ‘raw’ module. I committed two examples in my Github account using a module to download URLs and another one that runs Powershell scripts.

My examples are done using Ansible 1.8.2 installed in a Fedora 20. But main problems I’ve found are configuring Windows 7 to accept WinRM connections. Next I attach some references that helped me a lot:

If you want to use my tests code you can connect to my Github: Basic Ansible playbooks for Windows.

Jan 21

Using Ansible like library programming in Python

Reading time: 2 – 4 minutes

Ansible is a very powerful tool. Using playbooks, something like a cookbook, is very easy to automate maintenance tasks of systems. I used Puppet and other tools like that but IMHO Ansible is the best one.

In some cases you need to manage dynamic systems and take into advantage of Ansible like a Python library is a very good complement for your scripts. This is my last requirement and because of that I decided to share some simple Python snippets that help you to understand how to use Ansible as a Python library.

Firstly an example about how to call an Ansible module with just one host in the inventory (test_modules.py):

import ansible.runner
import ansible.playbook
import ansible.inventory
from ansible import callbacks
from ansible import utils
import json

# the fastest way to set up the inventory

# hosts list
hosts = [""]
# set up the inventory, if no group is defined then 'all' group is used by default
example_inventory = ansible.inventory.Inventory(hosts)

pm = ansible.runner.Runner(
    module_name = 'command',
    module_args = 'uname -a',
    timeout = 5,
    inventory = example_inventory,
    subset = 'all' # name of the hosts group 

out = pm.run()

print json.dumps(out, sort_keys=True, indent=4, separators=(',', ': '))

As a second example, we’re going to use a simple Ansible Playbook with that code (test.yml):

- hosts: sample_group_name
    - name: just an uname
      command: uname -a

The Python code which uses that playbook is (test_playbook.py):

import ansible.runner
import ansible.playbook
import ansible.inventory
from ansible import callbacks
from ansible import utils
import json

### setting up the inventory

## first of all, set up a host (or more)
example_host = ansible.inventory.host.Host(
    name = '',
    port = 22
# with its variables to modify the playbook
example_host.set_variable( 'var', 'foo')

## secondly set up the group where the host(s) has to be added
example_group = ansible.inventory.group.Group(
    name = 'sample_group_name'

## the last step is set up the invetory itself
example_inventory = ansible.inventory.Inventory()

# setting callbacks
stats = callbacks.AggregateStats()
playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY)
runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)

# creating the playbook instance to run, based on "test.yml" file
pb = ansible.playbook.PlayBook(
    playbook = "test.yml",
    stats = stats,
    callbacks = playbook_cb,
    runner_callbacks = runner_cb,
    inventory = example_inventory,

# running the playbook
pr = pb.run()  

# print the summary of results for each host
print json.dumps(pr, sort_keys=True, indent=4, separators=(',', ': '))

If you want to download example files you can go to my github account: github.com/oriolrius/programming-ansible-basics

I hope it was useful for you.

Dec 27

El meu 2014

Reading time: 8 – 14 minutes

Finalment s’acosta l’hora de tancar aquest 2014. Ha estat un any molt intens amb emocions de tots colors, un any amb grans oportunitats pel creixement com a persona. La vida m’ha posat grans obstacles i ara mateix estic content de poder dir que hem sento amb forces per seguir afrontant els reptes que hem depara el nou any que ja truca a la porta. Des de fa uns dies dedico totes les hores que esgarrapo als events familiars a rellegir totes les notes que he pres durant el dia a dia de l’any que deixem enrera.

Com molts ja sabeu tinc costum d’anotar cada matí després de la meditació quins són els objectius de creixement personal i professional que vull assolir i després a última hora del dia en faig un balanç. Aquesta practica ja fa una colla d’anys que la segueixo i poc a poc he anat refinant la metodologia per portar-la a terme, és a dir, que he anat seleccionant quines eren les preguntes i reflexions que més m’aportaven. No és objecte d’aquest article parlar d’això però si que després de rellegir-me tot el que he escrit durant aquest any volia compartir amb tots vosaltres el resum dels fets més importants que han esdeveningut aquest any. Sempre podria passar que hem deixés algún fet important però en tot cas aquest ha estat el meu 2014.

A principis d’any el Jaume, com a director general, i jo, com a director tècnic, varem començar oficialment l’aventura de posar en marxa M2M Cloud Factory després d’aconseguir una inversió força interessant. Així que a principis de Febrer ja teniem l’equip de programadors en marxa i desenvolupant MIIMETIQ, el primer producte de l’empresa en forma de “framework” per desenvolupar aplicacions per M2M i IoT de forma ràpida i àgil. No ens oblidem que el lideratge del Pau ha estat fonamental per aquest equip.

Al cap de poc l’Àlex em va convidar a participar a un dels events d’alumni de la FIB, on vaig portar a terme una conferència titulada: “Revolució dels mini-PCs: Raspberry PI, Arduin i més“. Gràcies a la conferència coneixo a molta gent nova i em va fer recordar el temps en que havia estat fent força conferències.

Mentre el meu cap començava a estar súper inmers en la creació de MIIMETIQ, un email de la gent de Google em va fer sentir reconeguda la meva carrera després de que m’oferessin feina com a TPM dels SRE i com a SE RSE. Finalment la cosa no va acabar de cuallar i l’event més important de l’any s’acostava.

Gran part de les decisions de l’any venien marcades perquè durant el maig l’Estefania i jo esperavem el nostre primer fill, el Pol. Li varem arreglar una de les habitacions de la casa i fins hi tot varem acondicionar tota la part exterior de la casa perquè quan arribés el Pol es trovés un jardí ben xulo i espaiós perquè hi pogués anar a jugar. Però abans d’acabar les obres el Pol va voler venir a aquest món, concretament el 26 d’Abril. Desgraciadament al cap de tres dies coincidint amb el segon aniversari de casament el Pol va decidir deixar-nos. Varen ser uns dies molt durs i dels que encara ara estem aprenent moltes coses, en el seu moment ho vaig intentar explicar a la història del Pol.

Són en aquests moments de la vida quan realment saps que ets realment afortunat de tenir a grans persones al teu voltant i pel que varem comprovar l’Estefania i jo en tenim de fantàstiques. Durant unes setmanes tot va ser realment confús però events tant calurosos i didactis com: poder assistir a l’event del Thich Nhat Hanh, recordar que fa 11 la vida hem va donar una segona oportunitat, la festa d’aniversari sorpresa que hem van preparar els mussols, fins hi tot l’escapada d’uns dies a l’Ametlla de Mar; tot això i molt més ens va ajudar a anar tornar a enganxar-nos a la vida poc a poc.

Al cap de poc temps i quasi sense pensar-ho en Dario, em va presentar l’Enric el qual després de 4 mesos de treball diari a casa va posar en marxa moltíssims automatistmes que tenia planejats instal·lar jo mateix. Així que com que les meves prioritats personals i professionals no hem deixaven atendre aquest projecte des de feia anys vaig decidir volcar el meu coneixement en aquest noi. Jo el vaig batejar com a projecte de “mentoring”. Així ell podia adquirir coneixements pràctics en la programació d’arduinos i similars i jo posava en marxa el projecte de domotitzar la casa. Obviament el Xavi va donar el suport clau per fer que tot plegat sigués una realitat.

En aquesta primera fase de domotització s’han automatitzat moltíssimes coses: s’ha integrat el sistema de calefacció que vaig montar l’any passat en l’aplicació mòbil de control de la casa, es poden controlar les persianes, el sistema de reg, la font del jardí, hi ha desplegada una xarxa de sensors de presència pel jardí per controlar quan entren gats al terreny i espantar-los activant els espersors, s’ha reinstal·lat el sistema de distribució de la TV per la casa, sistema de control d’obertures de portes del garatge i del jardí a través de comandaments a distància i de l’aplicació mòbil de control de la casa, porter automàtic ja esta apunt per ser integrat amb la resta de la casa, càmares de videovigilància i diria que ja no hem deixo res més. Això si, tot es pot controlar des del mòbil, la tablet o l’ordinador des de qualsevol lloc del món.

El dia 15 de Juliol, gràcies a l’esforç de tot l’equip de MIIMETIQ es va poder presentar la versió 1.0 del producte als inversos. 15 dies abans del previst i amb tot el que havia succeït. La presentació va ser un èxit i ben aviat ens varem posar a montar el primer pilot per Mediapro, de fet la primera setmana de setembre ja s’estava mostrant el primer pilot fet usant el nostre “framework” a dues fires d’Anglaterra.

Just abans de marxar de vacances hem va arribar un nou reconeixement, aquest cop en forma d’entrevista per un blog que es diu “Tu business Coach” on hem van fer una entrevista. Així que a mitjans d’agost l’Estefania i jo contra tot el que haviem planificat per aquest any varem agafar les maletes i ens en varem anar a visitar l’illa de Lanzarote a les Canaries.

A principis de setembre, com ja va passar l’any passat, vaig col·laborar amb Omitsis a posar en marxa el servidor web de la festa major de Barcelona, la Mercè. Cal dir que aquest any el repte va ser força senzill i va acabar sent un èxit com l’any passat. Això si, l’event del mes de setembre va ser el dia 11 amb la diada nacional de Catalunya. Participar en una manifestació d’uns 2 milions de persones posa la pell de gallina. Crec que poder compartir aquests moments de la història no té preu i tinc la sort d’haver-hi pogut participar diverses vegades.

Encara dins del mateix setembre vaig participar a la Python Meetup de Barcelona presentant el sistema de calefacció que tinc montat a casa. Aquesta conferència no hagués tingut res d’especial si no fos perquè ha estat la primera conferència que he fet en anglès. En la meva vida he fet forces reunions en anglès però mai havia tingut l’oporunitat de fer una conferència en anglès. Així que va tenir una motivació especial, algunes persones m’han dit que per ser la primera va estar molt bé i d’altres que perdo molt al no fer-ho amb una llengua que controli al 100%.

Durant els propers mesos encara vaig fer dues conferències més una anomenada: “IoT Low Cost” al Tecnocampus de Mataró; i l’altre una mini-presentació sobre “MIIMETIQ” a la PyConES de Saragossa. De fet, tornant de Saragossa vaig tenir temps d’arribar a la consulta popular sobre la independència de Catalunya el #9N, un altre fet històric pel que molts dels avant passats del meu país van morir. Un moment innoblidable.

A principis de desembre en nom d’M2M Cloud Factory vaig poder participar a una taula rodona dedicada a les plataformes d’IoT dins del marc del IoT forum 2014 organitzat pel BDigital. Gràcies a l’event he conegut persones realment interessants també. Tot i que no he d’oblidar que per divertit l’escapada que varem fer Sarai, Àlex, Estefania i jo a Madrid durant el pont de la puríssima. Una experiència que haurem de repetir. Mira que he anat cops a Madrid però pocs cops ho havia disfrutat tant.

Professionalment tampoc hem puc oblidar del projecte Empowering, el qual gràcies al Xavi i la resta de companys de CIMNE segueix en pas ferm aquest segon any. Aquest any la meva participació en el projecte ha estat més discreta perquè l’arquitectura ja estava molt definida i calia anar fent seguiment de la implantació i ajudant quan es podia. Si tecnològicament hagués de resaltar algunes tecnologies amb les que he treballat diria que ha estat l’any del: Raspberry PI, Arduino, AMQP (RabbitMQ), Docker, Ansible, Vagrant, VirtualBox, Celery, Kombu, Supervisor, Ambari, Hadoop, HBase, HIVE, etc.

A més degut a temes de feina també m’he mogut força: Cardiff (UK), Langen (DE), Saragossa, Sevilla i Madrid. Són alguns dels llocs més llunyans als que m’ha portat la feina aquest any. Però el capítol que realment posa la cirereta a tota la feina ha estat la notícia que varem rebre pocs dies abans de Nadal quan se’ns va comunicar des de la unió europea que hem guanyat l’Horizon 2020 al que ens hem presentat. És a dir, que tenim pressupost assegurat per seguir invertint els dos propers anys a MIIMETIQ.

Hem venen al cap d’altres temes més secundaris però fites igualment importants en l’ambit personal i professional. Com per exemple, que he aconseguit tenir dues sortides a internet més a part de l’ADSL a casa. Gràcies al Santi, al Jordi i al Joan. Entre totes dues rondem els quasi 20Mbps a part de l’ADSL cosa que m’assegura una bona qualitat de servei en un entorn hidílic per seguir treballant i creant.

Si tot va com tenim previst acomiadarem l’any des de Bernui un poblet del Pirineu català, molt aprop de Sort. On amb una companyia excel·lent direm adéu a aquest any que tantes emocions ens ha regalat un any al que li podriem trobar molts adjectius però que al final és un capítol més dins la vida. Un capítol que hem d’acceptar amb la millor cara possible en cada moment i per la que hem d’estar agraïts per tot allò que entenem com a bo i per tot el que ara ens sembla dolent però que amb la intel·ligència del temps segurament entendrem que també tenia el seu missatge constructiu.

Així que un any més acabo l’any tot dient: GRÀCIES!!!

Dec 22

Internet of Things Forum 2014 – Plataformas tras el ecosistema

Reading time: < 1 minute El pasado 23 de Noviembre participé en una mesa redonda sobre plataformas del IoT en el marco del IoT forum 2014. Esta jornada esta organizada por BDigital y me dieron la oportunidad de expresar mi opinión en una mesa redonda titulada “Plataformas tras el ecosistema”.

A continuación adjunto el video de la charla:

Si quereis ver el resto de videos de las ponenecias los teneis aquí: Videos de las ponencias del IoT forum 2014.

Dec 01

Short MIIMETIQ definition

Reading time: 2 – 3 minutes


Last months in M2M Cloud Factory we have been working on MIIMETIQ. Last weeks I’ve been thinking about how to define MIIMETIQ shortly and this is my definition, please tell if you can understand something. Of course, you have to know we’re focused in Internet of Things and M2M market.

  • MIIMETIQ is an IoT/M2M framework, so this is the first step to setup to develop your vertical solution.
  • Framework: With a well defined architecture a framework is a set of functions ready to create any application. Everything else is open and adaptable.
  • MIIMETIQ architecture is service oriented and it uses AMQP as a message broker to connect the services.
  • MIIMETIQ has several modules, we define a module as a set of services. Basicly MIIMETIQ have 5 modules:
    • Identity Manager: manage users, groups, roles and all kind of entities the project needs and its security.
    • Assets Manager: a data model manager, the integrator creates the business logics and data models here.
    • Distribution System: this is a set of agnostitc connectivity layers to different types of devices.
    • A E N M: several time series and other signals flow through the AMQP, this data are events and using rules those events could be converted in alarms and some alarms have to be notified to proper services, systems or people.
    • Control Panel UI: this is an administration dashboard, in form of a UI to setup and monitor the most common uses of MIIMETIQ.
  • Using those modules usually the integrators create their own user interface to satisfy customer requiremests. In M2MCF we create those UI using ADUX (Advanced Development User Experience).
  • After configuring MIIMETIQ the integrator has 2 customized APIs to connect their code with MIIMETIQ. One of them is an API REST and another one is AMQP.
  • Finally everything inside MIIMETIQ could be customized, because the flexibility is very important when you have an horizontal solution.
Nov 10

Charla sobre MIIMETIQ en la PyConES 2014 de Zaragoza

Reading time: 1 – 2 minutes

No son pocas las veces que me preguntan a que me dedico. Pues bien, la charla “light” que he dado este mediodia en Zaragonza en el marco de la PyConES 2014. Una charla de 10min más preguntas me ha permitido compartir con la comunidad cuál es la ocupación que me ha tenido ocupado la mayor parte de mi tiempo durante este año. Cómo CTO de M2M Cloud Factory, he tenido la suerte de poder proponer la arquitectura que con la ayuda de mis compañeros hemos desarrollado. Se trata de un framework para el desarrollo de aplicaciones M2M bautizado con el nombre de MIIMETIQ.

A continuación podeis ver el video de la charla y consultar los slides:

Oct 30

Conferència al Tecnocampus: Internet of Things (IoT) low cost

Reading time: 1 – 2 minutes

Després d’arribar corrent de Cardiff on era aquest dilluns el dimarts vaig arribar a temps per fer la presentació “Internet of Things low cost” als companys del Tecnocampus de Mataró; per cert, unes intal·lacions brutals res a veure amb la EUPMT on vaig estudiar jo fa una colla d’anys. Jo encara diria més, molt millor que no pas la gran Universitat de Cardiff on vaig ser el dilluns.

Pel que fa a la xerrada agraïr a tothom que hi va assistir, a continuació adjunto les transparències pels que vareu ser-hi i pels que no.

Properament pujaré el video, o la part, del video que es va poder gravar. El problema és que són diversos gigues i he de deixar l’ordinador renderitzant cosa que encara no he pogut fer.

El video no conté tota la presentació però té una part important del contingut, així que desitjo que ús sigui útil:

Per cert, una gran part de la presentació esta reciclada de la conferència: Conferència: La revolució dels mini-PC: Raspberry PI, Arduino i més

Oct 21

OpenAM: some ssoadm commands for reference

Reading time: 3 – 4 minutes

OpenAM is as much powerful as complicated sometimes. In this case I spent a lot of time understanding how to set simple settings because of that I decide to take note about that in this blog entry.

First of all don’t forget to set the environment variables and go to ssoadm path:

export JAVA_HOME="/usr/lib/jvm/java-6-openjdk-amd64/jre"
export CLASSPATH="/var/lib/tomcat7/webapps/openam/WEB-INF/lib/policy-plugins.jar::/var/lib/tomcat7/webapps/openam/WEB-INF/lib/openam-core-11.0.0.jar"

cd /opt/openam/ssoadmin/openam/bin

Getting the list of user identities:

./ssoadm list-identities -u amadmin -f /tmp/oam.pwd -e / -t User -x "*"

anonymous (id=anonymous,ou=user,dc=openam)
demo (id=demo,ou=user,dc=openam)
serviceusername (id=serviceusername,ou=user,dc=openam)
amAdmin (id=amAdmin,ou=user,dc=openam)
Search of Identities of type User in realm, / succeeded.

another useful query would be:

./ssoadm list-identities -u amadmin -f /tmp/oam.pwd -e / -t Role -x "*"

No plug-ins configured for this operation

But as you can see it doesn’t work and I don’t know how to solve it.

Taking a look to GUI get to identities list with: Access Control > / (Top Level Realm) > Privileges

In this webpage you have a list of role identities, in my case I have only this: “All Authenticated Users”. Inside this identity I can set different privileges:

  • REST calls for Policy Evaluation (EntitlementRestAccess)
  • Read and write access to all log files (LogAdmin)
  • REST calls for searching entitlements (PrivilegeRestReadAccess)
  • Read access to all log files (LogRead)
  • Read and write access to all federation metadata configurations (FederationAdmin)
  • Read and write access only for policy properties (PolicyAdmin)
  • Read and write access to all configured Agents (AgentAdmin)
  • Read and write access to all realm and policy properties (RealmAdmin)
  • REST calls for managing entitlements (PrivilegeRestAccess)
  • Write access to all log files (LogWrite)

If we want to remove a privilege:

root@vm:/opt/openam/ssoadmin/openam/bin# ./ssoadm remove-privileges -u amAdmin -f /tmp/oam.pwd -e / -g EntitlementRestAccess -i "All Authenticated Users" -t role

Privileges were removed from identity, All Authenticated Users of type, role in realm, /.

or adding a privilege:

root@vm:/opt/openam/ssoadmin/openam/bin# ./ssoadm add-privileges -u amAdmin -f /tmp/oam.pwd -e / -g EntitlementRestAccess -i "All Authenticated Users" -t role

Talking about policies, exporting:

./ssoadm list-policies -u amadmin -f /tmp/oam.pwd -e / -o /tmp/policies.xml

and if we want to import the policies:

./ssoadm create-policies -u amAdmin -f /tmp/oam.pwd -e / --xmlfile /tmp/policies.xml

creating a user:

./ssoadm create-identity -u amadmin -f /tmp/oam.pwd  -e / -i serviceusername -t User --attributevalues "userpassword=servicepassword"

Useful references:

Oct 09

La excelencia en el servicio

Reading time: 1 – 2 minutes

  • ATENCIÓN: compuesto por actitud, amabilidad, comprensión, disposición, saber escuchar, comunicación verbal y no verbal, educación y la imagen personal.
  • CALIDAD: se podría describir como los requirimientos del producto o servicio, información suministrada, instrucciones recibidas, de lo que se trata es de aportar el máximo beneficio al comprador y tener una buena relación calidad precio. Obviamente hay que cumplir con lo que se ha prometido. Para poder replicar esta calidad son fundamentales los procesos y procedimientos internos que deben estar claramente definidos y se deben cumplir por todos los empleados.
  • OPORTUNIDAD: es fundamental ofrecer el servicio o producto en el momento del tiempo que es requerido, nunca después porqué esto sería una perdida de oportunidad.
  • COMODIDAD: se trata de darle el máximo comfort al cliente cuando adquiere nuestros productos o servicios. Los típicos ejemplos son el ofrecer parking, pre-reserva de asientos, servicio a domicilio, ventas y atención a distancia, etc.