tl;dr
import ast
desired_dict = ast.literal_eval(module.params['json_str'])
Faisons le.
Lors de l'écriture d'un playbook Ansible, Dans de nombreux cas, un fichier JSON est lu et transmis sous forme de chaîne de caractères.
tasks:
- name: Update
spam_module:
state: present
json_str: "{{ lookup('file', 'ham.json') }}"
Pour lire ceci dans le module
argument_spec.update(
dict(
json_str=dict(type='str', required=True),
state=dict(default='present', type='str', choices=['present', 'absent']),
)
)
module = AnsibleModule(argument_spec=argument_spec)
print(module.params['json_str'])
Je peux le lire en faisant quelque chose comme
Les guillemets doubles sont convertis en guillemets simples dans module.params
.
À ce stade, la tentative de conversion en JSON échoue facilement.
desire_dict = json.loads(module.params['json_str'])
# Fail!!!
Les chaînes de caractères entre guillemets simples peuvent être gérées comme Arborescence de syntaxe abstraite en Python.
desired_dict = ast.literal_eval(module.params['json_str'])
Utilisez ʻast.literal_eval` pour le convertir en dictionnaire.
Je veux comparer deux JSON pour vérifier l'égalité Je l'ai déposé dans un dictionnaire et l'ai comparé.
Cependant, JSON ne garantit pas l'ordre des listes, mais les dictionnaires garantissent l'ordre, il ne s'agit donc pas d'une comparaison stricte. Quelque chose comme ça est courant dans Ansible, alors faisons de notre mieux.
Recommended Posts