2017-01-29 13 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 %} 

例マクロ

# 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>") }} 

を使用してDB-server1.sls状態ファイル...と出力し、私は、私は信じてい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

を実行しようあなたがするべきことは、変数を次のようにマーコにパラメータとして渡すことです:

{%- 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マップとして定義し、マクロがそれを対応する設定に分割するようにしました。

デシベル-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 %} 

同じこと。再度、感謝します!