SaltStack 宏和环境变量
SaltStack macros and environment variables
我正在尝试创建一个公式来管理多个数据库服务器上的 MySQL 帐户。我正在尝试重新使用 macro.sls
文件中的宏,并使用环境变量来指定连接设置。但是,将环境文件放入每个数据库服务器的状态文件中是行不通的;只有当我将它们放入 macro.sls
文件时它才有效。这是不需要的,因为我希望能够一次更新多个数据库服务器上的用户。见下文:
# 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 %}
示例 db-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: "%"
[...]
---
我相信你应该做的是像这样将变量作为参数传递给宏:
{%- 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"
) }}
这段代码是我脑子写的 - 所以语法上可能有一些错误,但逻辑应该是正确的。
@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 %}
最后还是一样。再次感谢!
我正在尝试创建一个公式来管理多个数据库服务器上的 MySQL 帐户。我正在尝试重新使用 macro.sls
文件中的宏,并使用环境变量来指定连接设置。但是,将环境文件放入每个数据库服务器的状态文件中是行不通的;只有当我将它们放入 macro.sls
文件时它才有效。这是不需要的,因为我希望能够一次更新多个数据库服务器上的用户。见下文:
# 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 %}
示例 db-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: "%"
[...]
---
我相信你应该做的是像这样将变量作为参数传递给宏:
{%- 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"
) }}
这段代码是我脑子写的 - 所以语法上可能有一些错误,但逻辑应该是正确的。
@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 %}
最后还是一样。再次感谢!