Ansible задача для генерации и выполнения файла с использованием dict, шаблона

Я не могу понять, как сказать Ansible сделать следующее:

  1. Перебрать словарь 'users', определенный в /vars/main.yml
  2. Заполните шаблон, определенный в /templates/sql_template.j2
  3. Выполнить команду с сгенерированным файлом в качестве аргумента

Когда я запускаю playbook, я вижу в выводе, что каждый элемент в словаре используется. Когда это будет сделано, файл будет содержать последний элемент.

На данный момент у меня есть два варианта:

  1. выполнить мою команду sql, используя сгенерированный файл для каждой итерации.
  2. как-то заставить каждую итерацию добавлять в файл вместо его перезаписи, а затем выполнять команду sql, используя завершенный файл, когда цикл завершен

Вариант 1 выглядел бы примерно так, но он не работает из-за дополнительной команды в задаче

---
- name: Insert web app users
  template:
    src: sql_template.j2
    dest: /tmp/sql_template
  with_dict: users
  command: cat /tmp/sql_template

Я понятия не имею, как решить вариант 2.

Это файлы, которые у меня есть в настоящее время, которые записывают каждую итерацию в файл на целевом сервере. Не совсем то, что мне нужно, но близко.

задачи / main.yml

---
- name: Insert web app users
  template:
    src: sql_template.j2
    dest: /tmp/sql_template
  with_dict: users

vars / main.yml

users:
  test1:
    user_nbr: 500
    user_name: "test1"
    user_desc: "developer"
    password: "f0dd960681eca16f0f5c1cda8d83e72c"
    display_name: "Test1"
    email: "[email protected]"
  test2:
    user_nbr: 501
    user_name: "test2"
    user_desc: "developer"
    password: "f0dd960681eca16f0f5c1cda8d83e72c"
    display_name: "Test2"
    email: "[email protected]"

шаблоны / sql_template.j2

INSERT INTO cbcommon:users (user_nbr, user_name, user_desc, password, user_timeout, suspended, change_password, no_password_expiry, display_name, email) VALUES ({{item.value.user_nbr}}, '{{item.value.user_name}}', '{{item.value.user_desc}}', '{{ item.value.password}}', 60, 0, 0, 1, '{{ item.value.display_name}}', '{{ item.value.email}}' );
INSERT INTO cbcommon:users_orgs (user_nbr, org_nbr, class_nbr, primary_org) VALUES({{item.value.user_nbr}}, 1000, -1, 1);
INSERT INTO cbcommon:users_orgs (user_nbr, org_nbr, class_nbr, primary_org) SELECT {{ item.value.user_nbr}}, org_nbr, -1, 0 FROM orgs WHERE org_nbr != 1000;

person RhythmicDevil    schedule 18.12.2016    source источник


Ответы (1)


Решение - сделать петлю внутри шаблона. Переменные, определенные в файле vars / main.yml, автоматически доступны в шаблоне. Теперь файлы выглядят так, и создается весь файл:

задачи / main.yml

---
- name: Insert web app users
  template:
    src: sql_template.j2
    dest: /tmp/sql_template

шаблоны / sql_template.j2

{% for item in users %}
INSERT INTO cbcommon:users (user_nbr, user_name, user_desc, password, user_timeout, suspended, change_password, no_password_expiry, display_name, email) VALUES ({{users[item].user_nbr}}, '{{users[item].user_name}}', '{{users[item].user_desc}}', '{{ users[item].password}}', 60, 0, 0, 1, '{{ users[item].display_name}}', '{{ users[item].email}}' );
INSERT INTO cbcommon:users_orgs (user_nbr, org_nbr, class_nbr, primary_org) VALUES({{users[item].user_nbr}}, 1000, -1, 1);
INSERT INTO cbcommon:users_orgs (user_nbr, org_nbr, class_nbr, primary_org) SELECT {{ users[item].user_nbr}}, org_nbr, -1, 0 FROM orgs WHERE org_nbr != 1000;
{% endfor %}
person RhythmicDevil    schedule 18.12.2016