2017-08-31 4 views
0

J'essaye d'écrire un livre de jeu qui vérifie les fonctionnalités de Windows installées. Si elles sont installées, il devrait les ignorer, sinon les installer à partir de ma liste de vars.Ansible with_items vérification conditionnelle contre json

- name: win command 
    win_command: 'powershell.exe "Get-WindowsFeature | Where Installed | Select -exp Name | ConvertTo-Json"' 
    register: result 

- name: Register vars 
    set_fact: 
    featureinstalled: '{{ result.stdout | from_json }}' 

- name: Installing features 
    win_feature: 
    name: '{{ item }}' 
    state: Present 
    with_items: 
    '{{features_to_install}}' 
    when: '{{ item }} != {{ featureinstalled }}' 

Mon features_to_install vars dans un document distinct/vars/fichier:

--- 
features_to_install: [FileAndStorage-Services,File-Services,.....] 

Je veux que le PlayBook pour sauter l'installation de la fonction si la fonction est présente dans le JSON. L'erreur Im obtenir:

{ "a échoué": true, "msg":. « Le chèque conditionnel '{{item}} = {{featureinstalled}}' a échoué L'erreur est: erreur de modèle en chaîne de template: jeton attendu ',', 'chaîne': {% si FileAndStorage-Services! = [u'FileAndStorage-Services ', u'Storage-Services', u'FS-SMB1 ', u 'WoW64-Support']%} Vrai {% else%} False {% endif%} \ n \ nL'erreur semble avoir été dans '/tmp/worldengine/src/roles/webserver/tasks/windows_features.yml' : ligne 31, colonne 3, mais peut-être \ nêtre ailleurs dans le fichier en fonction du problème de syntaxe exacte . \ N \ nT il offenser ligne semble être: \ n \ n \ n- Nom: caractéristiques Installation \ n^

+0

Comment lire le document [docs on 'when'] (http://docs.ansible.com/ansible/latest/playbooks_conditionals.html#the-when-statement) avant d'écrire le code? De plus, l'opérateur '! =' Est carrément faux - "pas égal" n'est pas ce que vous avez l'intention de vérifier - dites l'expression à voix haute dans le langage humain et vous comprendrez. – techraf

+0

lol qui a fonctionné – firebolt

Répondre

0

Il y a handy filters disponibles pour manipuler des ensembles:

- name: Installing features 
    win_feature: 
    name: '{{ item }}' 
    state: Present 
    with_items: '{{ features_to_install | difference(featureinstalled) }}' 

Cela itérer sur les caractéristiques de features_to_install liste, mais qui ne sont pas dans la liste featureinstalled.

+0

Génial merci pour cela. Mon enregistrement conditionnel était erroné. J'ai fini par utiliser "in" et "not in", mais je testerai aussi votre approche. Merci! – firebolt