2017-01-29 9 views
0

Я пытаюсь создать формулу для управления учетными записями MySQL на нескольких серверах баз данных. Я пытаюсь повторно использовать макрос из файла macro.sls и использовать переменные среды для указания параметров подключения. Однако размещение файлов среды в файлах состояний для каждого сервера базы данных не работает; он работает только тогда, когда я помещаю их в файл macro.sls. Это нежелательно, так как я хочу иметь возможность одновременно обновлять пользователей на нескольких серверах баз данных. См ниже:Макросы SaltStack и переменные окружения

# Example of "db_user" macro in mysql_user-mgmt/macro.sls 
{%- macro db_user(user, password_hash, require_state="None") %} 
{{ user }}: 
    mysql_user.present: 
    - connection_charset: {{ db_charset }} 
    - connection_host: {{ db_host }} 
    - connection_pass: {{ db_pass }} 
    - connection_port: {{ db_port }} 
    - connection_user: {{ db_user }} 
    - host: "%" 
    - password_hash: "{{ password_hash }}" 
    {%- if require_state != "None" %} 
    - require: 
     - {{ require_state }} 
    {%- endif %} 
{%- endmacro %} 

Пример дб-server1.sls состояние файл с помощью макроса

# My mysql_user-mgmt/db-server1.sls file 
{%- import "mysql_user-mgmt/macro.sls" as macro -%} 
{%- set db_charset = salt['environ.get']('SERVER1_DB_CHAR') -%} 
{%- set db_host = salt['environ.get']('SERVER1_DB_HOST') -%} 
{%- set db_pass = salt['environ.get']('SERVER1_DB_PASS') -%} 
{%- set db_port = salt['environ.get']('SERVER1_DB_PORT') -%} 
{%- set db_user = salt['environ.get']('SERVER1_DB_USER') -%} 

{{ macro.db_user("someUser", "<MYSQL HASHED PASSWORD>") }} 

... и выходной, то я пытаюсь запустить salt-call state.sls mysql_user-mgmt.db-server1 команды

# Output of running `salt-call state.sls mysql_user-mgmt.db-server1` 
local: 
    - Rendering SLS 'base:mysql_user-mgmt.db-server1' failed: Jinja variable 'db_charset' is undefined 
     /var/cache/salt/minion/files/base/mysql_user-mgmt/macro.sls(4): 
     --- 
     {%- macro db_user(user, password_hash, require_state="None") %} 
     {{ user }}: 
     mysql_user.present: 
      - connection_charset: {{ db_charset }} <====================== 
      - connection_host: {{ db_host }} 
      - connection_pass: {{ db_pass }} 
      - connection_port: {{ db_port }} 
      - connection_user: {{ db_user }} 
      - host: "%" 
     [...] 
     --- 

ответ

1

I Believe вам следует передать переменные в качестве параметров для marco следующим образом:

{%- macro db_user(
    user, 
    password_hash, 
    db_charset, 
    db_host, 
    db_pass, 
    db_port, 
    db_user, 
    require_state="None" 
) %} 
{{ user }}: 
    mysql_user.present: 
    - connection_charset: {{ db_charset }} 
    - connection_host: {{ db_host }} 
    - connection_pass: {{ db_pass }} 
    - connection_port: {{ db_port }} 
    - connection_user: {{ db_user }} 
    - host: "%" 
    - password_hash: "{{ password_hash }}" 
    {%- if require_state != "None" %} 
    - require: 
     - {{ require_state }} 
    {%- endif %} 
{%- endmacro %} 

, а затем вызвать макрос так:

{%- import "mysql_user-mgmt/macro.sls" as macro -%} 
{%- set db_charset = salt['environ.get']('SERVER1_DB_CHAR') -%} 
{%- set db_host = salt['environ.get']('SERVER1_DB_HOST') -%} 
{%- set db_pass = salt['environ.get']('SERVER1_DB_PASS') -%} 
{%- set db_port = salt['environ.get']('SERVER1_DB_PORT') -%} 
{%- set db_user = salt['environ.get']('SERVER1_DB_USER') -%} 
{{ macro.db_user(
    "someUser", 
    "<MYSQL HASHED PASSWORD>", 
    "db_charset", 
    "db_host", 
    "db_pass", 
    "db_port", 
    "db_user" 
) }} 

Я пишу этот код из моей головы - так что могут быть некоторые ошибки в синтаксисе, но логика должна быть правильной.

1

@alexK Спасибо за ответ, который очень помог! В конце я определил connection как карту YAML, и пусть макрос разбил его на соответствующие настройки.

DB-server1.sls:

{%- import "mysql_user-mgmt/macro.sls" as macro -%} 

{%- load_yaml as connection -%} 
charset: {{ salt['environ.get']('PRODUCTION_DB_CHAR') }} 
host: {{ salt['environ.get']('PRODUCTION_DB_HOST') }} 
pass: {{ salt['environ.get']('PRODUCTION_DB_PASS') }} 
port: {{ salt['environ.get']('PRODUCTION_DB_PORT') }} 
user: {{ salt['environ.get']('PRODUCTION_DB_USER') }} 
{%- endload -%} 

{{ macro.db_user("someUser", "<MYSQL HASHED PASSWORD>", connection) }} 

macro.sls

{%- macro db_user(user, password_hash, connection, require_state=False) %} 
{{ user }}: 
    mysql_user.present: 
    - connection_charset: {{ connection.charset }} 
    - connection_host: {{ connection.host }} 
    - connection_pass: {{ connection.pass }} 
    - connection_port: {{ connection.port }} 
    - connection_user: {{ connection.user }} 
    - host: "%" 
    - password_hash: "{{ password_hash }}" 
    {%- if require_state %} 
    - require: 
     - {{ require_state }} 
    {%- endif %} 
{%- endmacro %} 

То же самое и в конце концов. Еще раз спасибо!