SaltStack宏和环境变量

时间:2017-01-29 21:15:30

标签: macros environment-variables salt-stack

我正在尝试创建一个公式来管理多个数据库服务器上的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: "%"
      [...]
      ---

2 个答案:

答案 0 :(得分:1)

我相信你应该做的是将变量作为参数传递给marco,如下所示:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="SearchLink" />
<h4><a href="#" id="Trig5">General Information</a></h4>
<div class="slider" id="Slide5">
  <ul>
    <li><a href="www.test1.com" target="_blank">Test1</a>
    </li>
    <li><a href="www.test2.com" target="_blank">Test2</a>
    </li>
    <li><a href="www.test3.com" target="_blank">Test3</a>
    </li>
    <li><a href="www.test4.com" target="_blank">Test4</a>
    </li>
    <li><a href="www.test5.com" target="_blank">Test5</a>
    </li>
    <li><a href="www.test6.com" target="_blank">Test6</a>
    </li>
    <li><a href="www.test7.com" target="_blank">Test7</a>
    </li>
    <li><a href="www.test8.com" target="_blank">Test8</a>
    </li>
  </ul>
</div>

然后像这样调用一个宏:

{%- 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 %}

我是从头开始编写这段代码的 - 所以语法上可能会有一些错误,但逻辑应该是正确的。

答案 1 :(得分: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 %}

最后相同的事情。再次感谢!