Передача переменных в Ansible из скрипта Py - PullRequest
0 голосов
/ 10 января 2020

Я не могу передать переменные в ansible

Вот мой python скрипт

import csv
import json
data=
file = 'splunkapps.csv'
json_file = 'output_file_name.json'

def read_CSV(file, json_file):
    csv_rows = []
    with open(file) as csvfile:
        reader = csv.DictReader(csvfile)
        field = reader.fieldnames
        for row in reader:
            csv_rows.extend([{field[i]:row[field[i]] for i in range(len(field))}])
        convert_write_json(csv_rows, json_file)

def convert_write_json(data, json_file):
    with open(json_file, "w") as f:
        f.write(json.dumps(data, sort_keys=False, indent=4, separators=(',', ': '))) 

read_CSV(file,json_file)
with open('output_file_name.json') as json_file:
    data = json.load(json_file)
    for p in data:
        print('AppName: ' + p['AppName'])
        print('Host: ' + p['Host'])
        print('SealID: ' + p['SealID'])
        print('')

И мой Ansible скрипт

Yaml файл :

---
- name: Onboard app
  hosts: localhost
  gather_facts: false
  tasks:
  - name:
    script: spl.py
    register: result
  - debug:
      msg: "{{ result.stdout_lines }}"
    with_items: "{{ modules }}"

  - name: print user name and password
    shell: |
      echo {{ modules['AppName'] }}
      echo {{ modules['Host'] }}

Я должен использовать 2.3 версию ansible, и в настоящее время я использую 2.7 версию py

1 Ответ

0 голосов
/ 10 января 2020

Q: "Передача переменных в Ansible из сценария Py"

A: Можно использовать lookup, pipe, from_yaml и назначить вывод сценария переменной. Например, со сценарием

$ cat my_script
#!/bin/sh
printf 'AppName: my_AppName\n'
printf 'Host: my_Host\n'
printf 'SealID: my_SealID\n'

, книга воспроизведения

- hosts: localhost
  vars:
    my_var: "{{ lookup('pipe', 'my_script')|from_yaml }}"
  tasks:
    - debug:
        var: my_var
    - debug:
        msg: "AppName [{{ my_var.AppName }}]"

дает

ok: [localhost] => 
  my_var:
    AppName: my_AppName
    Host: my_Host
    SealID: my_SealID

ok: [localhost] => 
  msg: AppName [my_AppName]

Q: "Ansible 2.3 не имеет плагина lookup. Какой будет альтернативный способ для этого? "

A: можно зарегистрировать выходные данные скрипта и объединить в словарь with_items . Например, игра ниже дает тот же результат

- hosts: localhost
  tasks:
    - script: my_script
      register: result
    - set_fact:
        my_var: "{{ my_var|default({})|combine(item|from_yaml) }}"
      with_items: "{{ result.stdout_lines }}"
    - debug:
        var: my_var
    - debug:
        msg: "AppName [{{ my_var.AppName }}]"

Примечания

Нет переменной modules. Вероятно, это ошибка

  - debug:
      msg: "{{ result.stdout_lines }}"
    with_items: "{{ modules }}"

Зарегистрированный вывод должен быть просто напечатан

  - debug:
      msg: "{{ result.stdout_lines }}"
...