{"id":34982,"date":"2024-09-17T15:06:20","date_gmt":"2024-09-17T08:06:20","guid":{"rendered":"http:\/\/jupitek.maudemo.vip\/index.php\/2024\/09\/17\/introduction-to-jinja-templates-for-salt\/"},"modified":"2024-09-17T15:06:20","modified_gmt":"2024-09-17T08:06:20","slug":"introduction-to-jinja-templates-for-salt","status":"publish","type":"post","link":"https:\/\/jupitek.maudemo.vip\/index.php\/2024\/09\/17\/introduction-to-jinja-templates-for-salt\/","title":{"rendered":"Gi\u1edbi thi\u1ec7u v\u1ec1 Jinja Templates trong Salt"},"content":{"rendered":"<h2 id=\"introduction-to-templating-languages\">Gi\u1edbi thi\u1ec7u v\u1ec1 Ng\u00f4n ng\u1eef M\u1eabu<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#introduction-to-templating-languages\"><\/a><\/h2>\n<p>Jinja l\u00e0 ng\u00f4n ng\u1eef m\u1eabu linh ho\u1ea1t cho Python c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o b\u1ea5t k\u1ef3 \u0111\u1ecbnh d\u1ea1ng d\u1ef1a tr\u00ean v\u0103n b\u1ea3n n\u00e0o nh\u01b0 HTML, XML v\u00e0 YAML. C\u00e1c ng\u00f4n ng\u1eef m\u1eabu nh\u01b0 Jinja cho ph\u00e9p b\u1ea1n ch\u00e8n d\u1eef li\u1ec7u v\u00e0o \u0111\u1ecbnh d\u1ea1ng c\u00f3 c\u1ea5u tr\u00fac. B\u1ea1n c\u0169ng c\u00f3 th\u1ec3 nh\u00fang c\u00e1c c\u00e2u l\u1ec7nh logic ho\u1eb7c lu\u1ed3ng \u0111i\u1ec1u khi\u1ec3n v\u00e0o c\u00e1c m\u1eabu \u0111\u1ec3 c\u00f3 kh\u1ea3 n\u0103ng t\u00e1i s\u1eed d\u1ee5ng v\u00e0 t\u00ednh m\u00f4-\u0111un cao h\u01a1n. C\u00f4ng c\u1ee5 m\u1eabu c\u1ee7a Jinja ch\u1ecbu tr\u00e1ch nhi\u1ec7m x\u1eed l\u00fd m\u00e3 trong c\u00e1c m\u1eabu v\u00e0 t\u1ea1o \u0111\u1ea7u ra cho t\u00e0i li\u1ec7u d\u1ef1a tr\u00ean v\u0103n b\u1ea3n cu\u1ed1i c\u00f9ng.<\/p>\n<p>Ng\u00f4n ng\u1eef m\u1eabu \u0111\u01b0\u1ee3c bi\u1ebft \u0111\u1ebfn r\u1ed9ng r\u00e3i trong b\u1ed1i c\u1ea3nh t\u1ea1o trang web trong ki\u1ebfn \u200b\u200btr\u00fac&nbsp;<em>Model View Controller<\/em>&nbsp;. Trong tr\u01b0\u1eddng h\u1ee3p n\u00e0y, c\u00f4ng c\u1ee5 m\u1eabu x\u1eed l\u00fd d\u1eef li\u1ec7u ngu\u1ed3n, nh\u01b0 d\u1eef li\u1ec7u t\u00ecm th\u1ea5y trong c\u01a1 s\u1edf d\u1eef li\u1ec7u v\u00e0 m\u1eabu web bao g\u1ed3m h\u1ed7n h\u1ee3p HTML v\u00e0 ng\u00f4n ng\u1eef m\u1eabu. Hai ph\u1ea7n n\u00e0y sau \u0111\u00f3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o trang web cu\u1ed1i c\u00f9ng \u0111\u1ec3 ng\u01b0\u1eddi d\u00f9ng s\u1eed d\u1ee5ng. Tuy nhi\u00ean, ng\u00f4n ng\u1eef m\u1eabu kh\u00f4ng gi\u1edbi h\u1ea1n \u1edf c\u00e1c trang web. Salt, m\u1ed9t ph\u1ea7n m\u1ec1m qu\u1ea3n l\u00fd c\u1ea5u h\u00ecnh ph\u1ed5 bi\u1ebfn d\u1ef1a tr\u00ean Python, h\u1ed7 tr\u1ee3 Jinja \u0111\u1ec3 cho ph\u00e9p tr\u1eebu t\u01b0\u1ee3ng h\u00f3a v\u00e0 t\u00e1i s\u1eed d\u1ee5ng trong c\u00e1c t\u1ec7p tr\u1ea1ng th\u00e1i Salt v\u00e0 c\u00e1c t\u1ec7p th\u00f4ng th\u01b0\u1eddng.<\/p>\n<p>H\u01b0\u1edbng d\u1eabn n\u00e0y s\u1ebd cung c\u1ea5p t\u1ed5ng quan v\u1ec1 ng\u00f4n ng\u1eef m\u1eabu Jinja \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng ch\u1ee7 y\u1ebfu trong Salt. N\u1ebfu b\u1ea1n ch\u01b0a quen v\u1edbi c\u00e1c kh\u00e1i ni\u1ec7m Salt, h\u00e3y xem l\u1ea1i H\u01b0\u1edbng&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/beginners-guide-to-salt\/\">d\u1eabn d\u00e0nh cho ng\u01b0\u1eddi m\u1edbi b\u1eaft \u0111\u1ea7u v\u1ec1 Salt<\/a>&nbsp;tr\u01b0\u1edbc khi ti\u1ebfp t\u1ee5c. M\u1eb7c d\u00f9 b\u1ea1n s\u1ebd kh\u00f4ng t\u1ea1o tr\u1ea1ng th\u00e1i Salt c\u1ee7a ri\u00eang m\u00ecnh trong h\u01b0\u1edbng d\u1eabn n\u00e0y, nh\u01b0ng c\u0169ng h\u1eefu \u00edch khi xem l\u1ea1i h\u01b0\u1edbng d\u1eabn&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/getting-started-with-salt-basic-installation-and-setup\/\">B\u1eaft \u0111\u1ea7u v\u1edbi Salt &#8211; C\u00e0i \u0111\u1eb7t v\u00e0 Thi\u1ebft l\u1eadp c\u01a1 b\u1ea3n<\/a>&nbsp;.<\/p>\n<h2 id=\"jinja-basics\">Ki\u1ebfn th\u1ee9c c\u01a1 b\u1ea3n v\u1ec1 Jinja<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#jinja-basics\"><\/a><\/h2>\n<p>Ph\u1ea7n n\u00e0y cung c\u1ea5p m\u00f4 t\u1ea3 gi\u1edbi thi\u1ec7u v\u1ec1 c\u00fa ph\u00e1p v\u00e0 kh\u00e1i ni\u1ec7m Jinja c\u00f9ng v\u1edbi c\u00e1c v\u00ed d\u1ee5 v\u1ec1 tr\u1ea1ng th\u00e1i Jinja v\u00e0 Salt. \u0110\u1ec3 t\u00ecm hi\u1ec3u s\u00e2u h\u01a1n v\u1ec1 Jinja, h\u00e3y tham kh\u1ea3o T\u00e0i&nbsp;<a href=\"http:\/\/jinja.pocoo.org\/docs\/2.10\/templates\/\" target=\"_blank\" rel=\"noreferrer noopener\">li\u1ec7u ch\u00ednh th\u1ee9c c\u1ee7a Jinja Template Designer<\/a>&nbsp;.<\/p>\n<p>C\u00e1c \u1ee9ng d\u1ee5ng nh\u01b0 Salt c\u00f3 th\u1ec3 x\u00e1c \u0111\u1ecbnh h\u00e0nh vi m\u1eb7c \u0111\u1ecbnh cho c\u00f4ng c\u1ee5 t\u1ea1o m\u1eabu Jinja. T\u1ea5t c\u1ea3 c\u00e1c v\u00ed d\u1ee5 trong h\u01b0\u1edbng d\u1eabn n\u00e0y \u0111\u1ec1u s\u1eed d\u1ee5ng c\u00e1c t\u00f9y ch\u1ecdn m\u00f4i tr\u01b0\u1eddng Jinja m\u1eb7c \u0111\u1ecbnh c\u1ee7a Salt. C\u00e1c thi\u1ebft l\u1eadp n\u00e0y c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c thay \u0111\u1ed5i trong t\u1ec7p c\u1ea5u h\u00ecnh ch\u00ednh Salt:<\/p>\n<pre class=\"wp-block-code\"><code># Default Jinja environment options for all templates except sls templates\n#jinja_env:\n#  block_start_string: '{%'\n#  block_end_string: '%}'\n#  variable_start_string: '{{'\n#  variable_end_string: '}}'\n#  comment_start_string: '{#'\n#  comment_end_string: '#}'\n#  line_statement_prefix:\n#  line_comment_prefix:\n#  trim_blocks: False\n#  lstrip_blocks: False\n#  newline_sequence: '\\n'\n#  keep_trailing_newline: False\n\n# Jinja environment options for sls templates\n#jinja_sls_env:\n#  block_start_string: '{%'\n#  block_end_string: '%}'\n#  variable_start_string: '{{'\n#  variable_end_string: '}}'\n#  comment_start_string: '{#'\n#  comment_end_string: '#}'\n#  line_statement_prefix:\n#  line_comment_prefix:\n#  trim_blocks: False\n#  lstrip_blocks: False<\/code><\/pre>\n<p class=\"has-background\" style=\"background-color:#74f78c33\">Ghi ch\u00fa: Tr\u01b0\u1edbc khi \u0111\u01b0a Jinja v\u00e0o tr\u1ea1ng th\u00e1i Salt c\u1ee7a b\u1ea1n, h\u00e3y \u0111\u1ea3m b\u1ea3o xem l\u1ea1i ph\u1ea7n&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#salt-and-jinja-best-practices\">Th\u1ef1c h\u00e0nh t\u1ed1t nh\u1ea5t v\u1ec1 Salt v\u00e0 Jinja<\/a>&nbsp;c\u1ee7a h\u01b0\u1edbng d\u1eabn n\u00e0y \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o r\u1eb1ng b\u1ea1n \u0111ang t\u1ea1o ra c\u00e1c tr\u1ea1ng th\u00e1i Salt c\u00f3 th\u1ec3 b\u1ea3o tr\u00ec v\u00e0 \u0111\u1ecdc \u0111\u01b0\u1ee3c. C\u00f3 th\u1ec3 s\u1eed d\u1ee5ng c\u00e1c c\u00f4ng c\u1ee5 v\u00e0 kh\u00e1i ni\u1ec7m Salt n\u00e2ng cao h\u01a1n \u0111\u1ec3 c\u1ea3i thi\u1ec7n t\u00ednh m\u00f4-\u0111un v\u00e0 kh\u1ea3 n\u0103ng t\u00e1i s\u1eed d\u1ee5ng c\u1ee7a m\u1ed9t s\u1ed1 v\u00ed d\u1ee5 v\u1ec1 tr\u1ea1ng th\u00e1i Jinja v\u00e0 Salt \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong h\u01b0\u1edbng d\u1eabn n\u00e0y.<\/p>\n<h3 id=\"delimiters\">D\u1ea5u ph\u00e2n c\u00e1ch<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#delimiters\"><\/a><\/h3>\n<p>C\u00e1c d\u1ea5u ph\u00e2n c\u00e1ch ng\u00f4n ng\u1eef m\u1eabu \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 bi\u1ec3u th\u1ecb ranh gi\u1edbi gi\u1eefa ng\u00f4n ng\u1eef m\u1eabu v\u00e0 m\u1ed9t lo\u1ea1i \u0111\u1ecbnh d\u1ea1ng d\u1eef li\u1ec7u kh\u00e1c nh\u01b0 HTML ho\u1eb7c YAML. Jinja s\u1eed d\u1ee5ng c\u00e1c d\u1ea5u ph\u00e2n c\u00e1ch sau:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>C\u00fa ph\u00e1p ph\u00e2n c\u00e1ch<\/th>\n<th>C\u00e1ch s\u1eed d\u1ee5ng<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>{% ... %}<\/code><\/td>\n<td>C\u1ea5u tr\u00fac \u0111i\u1ec1u khi\u1ec3n<\/td>\n<\/tr>\n<tr>\n<td><code>{{ ... }}<\/code><\/td>\n<td>C\u00e1c bi\u1ec3u th\u1ee9c \u0111\u01b0\u1ee3c \u0111\u00e1nh gi\u00e1 s\u1ebd in ra \u0111\u1ea7u ra m\u1eabu<\/td>\n<\/tr>\n<tr>\n<td><code>{# ... #}<\/code><\/td>\n<td>C\u00e1c b\u00ecnh lu\u1eadn s\u1ebd b\u1ecb b\u1ecf qua b\u1edfi c\u00f4ng c\u1ee5 t\u1ea1o m\u1eabu<\/td>\n<\/tr>\n<tr>\n<td><code># ... ##<\/code><\/td>\n<td>C\u00e1c c\u00e2u l\u1ec7nh d\u00f2ng<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Trong v\u00ed d\u1ee5 v\u1ec1 t\u1ec7p tr\u1ea1ng th\u00e1i Salt n\u00e0y, b\u1ea1n c\u00f3 th\u1ec3 ph\u00e2n bi\u1ec7t c\u00fa ph\u00e1p Jinja v\u1edbi YAML nh\u1edd c\u00e1c&nbsp;<code>{% ... %}<\/code>d\u1ea5u ph\u00e2n c\u00e1ch bao quanh c\u00e1c \u0111i\u1ec1u ki\u1ec7n if\/else:<\/p>\n<pre class=\"wp-block-code\"><code>{% if grains&#91;'group'] == 'admin' %}\n    America\/Denver:\n        timezone.system:\n{% else %}\n    Europe\/Minsk:\n        timezone.system:\n{% endif %}<\/code><\/pre>\n<p>Xem ph\u1ea7n&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#control-structures\">c\u1ea5u tr\u00fac \u0111i\u1ec1u khi\u1ec3n<\/a>&nbsp;\u0111\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin v\u1ec1 \u0111i\u1ec1u ki\u1ec7n.<\/p>\n<h3 id=\"template-variables\">Bi\u1ebfn m\u1eabu<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#template-variables\"><\/a><\/h3>\n<p>Bi\u1ebfn m\u1eabu c\u00f3 s\u1eb5n th\u00f4ng qua t\u1eeb \u0111i\u1ec3n ng\u1eef c\u1ea3nh c\u1ee7a m\u1eabu. T\u1eeb \u0111i\u1ec3n ng\u1eef c\u1ea3nh c\u1ee7a m\u1eabu \u0111\u01b0\u1ee3c t\u1ea1o t\u1ef1 \u0111\u1ed9ng trong c\u00e1c giai \u0111o\u1ea1n kh\u00e1c nhau c\u1ee7a qu\u00e1 tr\u00ecnh \u0111\u00e1nh gi\u00e1 m\u1eabu. C\u00e1c bi\u1ebfn n\u00e0y c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c truy c\u1eadp b\u1eb1ng k\u00fd hi\u1ec7u d\u1ea5u ch\u1ea5m:<\/p>\n<pre class=\"wp-block-code\"><code>{{ foo.bar }}\n<\/code><\/pre>\n<p>Ho\u1eb7c ch\u00fang c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c truy c\u1eadp b\u1eb1ng c\u00fa ph\u00e1p ch\u1ec9 s\u1ed1 d\u01b0\u1edbi:<\/p>\n<pre class=\"wp-block-code\"><code>{{ foo&#91;'bar'] }}\n<\/code><\/pre>\n<p>Salt cung c\u1ea5p m\u1ed9t s\u1ed1 bi\u1ebfn ng\u1eef c\u1ea3nh c\u00f3 s\u1eb5n theo m\u1eb7c \u0111\u1ecbnh cho b\u1ea5t k\u1ef3 t\u1ec7p tr\u1ea1ng th\u00e1i Salt ho\u1eb7c m\u1eabu t\u1ec7p n\u00e0o:<\/p>\n<p><strong>Salt<\/strong>&nbsp;:&nbsp;<code>salt<\/code>Bi\u1ebfn n\u00e0y cung c\u1ea5p m\u1ed9t t\u1eadp h\u1ee3p&nbsp;<a href=\"https:\/\/docs.saltproject.io\/en\/latest\/ref\/modules\/all\/index.html#all-salt-modules\" target=\"_blank\" rel=\"noreferrer noopener\">c\u00e1c h\u00e0m th\u01b0 vi\u1ec7n Salt<\/a>&nbsp;m\u1ea1nh m\u1ebd .<\/p>\n<pre class=\"wp-block-code\"><code><code>{{ salt&#91;'pw_user.list_groups']('jdoe') }} <\/code><\/code><\/pre>\n<p>B\u1ea1n c\u00f3 th\u1ec3 ch\u1ea1y&nbsp;<code>salt '*' sys.doc<\/code>t\u1eeb Salt master \u0111\u1ec3 xem danh s\u00e1ch t\u1ea5t c\u1ea3 c\u00e1c ch\u1ee9c n\u0103ng c\u00f3 s\u1eb5n.<\/p>\n<p><strong>Opts<\/strong>&nbsp;: Bi\u1ebfn l\u00e0 m\u1ed9t t\u1eeb \u0111i\u1ec3n cung c\u1ea5p quy\u1ec1n truy c\u1eadp v\u00e0o n\u1ed9i dung c\u1ee7a&nbsp;<a href=\"https:\/\/docs.saltproject.io\/en\/latest\/ref\/internals\/opts.html\" target=\"_blank\" rel=\"noreferrer noopener\">t\u1ec7p c\u1ea5u h\u00ecnh<\/a><code>opts<\/code>&nbsp;minion Salt&nbsp;:<\/p>\n<pre class=\"wp-block-code\"><code><code>{{ opts&#91;'log_file'] }} <\/code><\/code><\/pre>\n<p>V\u1ecb tr\u00ed l\u01b0u tr\u1eef t\u1ec7p c\u1ea5u h\u00ecnh c\u1ee7a minion l\u00e0&nbsp;<code>\/etc\/salt\/minion<\/code>.<\/p>\n<p><strong>Tr\u1ee5 c\u1ed9t<\/strong>&nbsp;: Bi\u1ebfn l\u00e0 m\u1ed9t t\u1eeb \u0111i\u1ec3n \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 truy c\u1eadp&nbsp;<a href=\"https:\/\/docs.saltproject.io\/en\/latest\/topics\/tutorials\/pillar.html\" target=\"_blank\" rel=\"noreferrer noopener\">d\u1eef li\u1ec7u tr\u1ee5 c\u1ed9t<\/a><code>pillar<\/code>&nbsp;c\u1ee7a Salt&nbsp;:<\/p>\n<pre class=\"wp-block-code\"><code><code>{{ pillar&#91;'my_key'] }}<\/code><\/code><\/pre>\n<p><code> <\/code>M\u1eb7c d\u00f9 b\u1ea1n c\u00f3 th\u1ec3 truy c\u1eadp tr\u1ef1c ti\u1ebfp c\u00e1c kh\u00f3a v\u00e0 gi\u00e1 tr\u1ecb c\u1ee7a c\u1ed9t, nh\u01b0ng b\u1ea1n n\u00ean s\u1eed d\u1ee5ng&nbsp;<code>pillar.get<\/code>h\u00e0m th\u01b0 vi\u1ec7n bi\u1ebfn c\u1ee7a Salt, v\u00ec n\u00f3 cho ph\u00e9p b\u1ea1n x\u00e1c \u0111\u1ecbnh gi\u00e1 tr\u1ecb m\u1eb7c \u0111\u1ecbnh. \u0110i\u1ec1u n\u00e0y h\u1eefu \u00edch khi gi\u00e1 tr\u1ecb kh\u00f4ng t\u1ed3n t\u1ea1i trong c\u1ed9t:<\/p>\n<pre class=\"wp-block-code\"><code><code>{{ salt&#91;'pillar.get']('my_key', 'default_value') }}<\/code><\/code><\/pre>\n<p><strong>Grains<\/strong>&nbsp;:&nbsp;<code>grains<\/code>Bi\u1ebfn n\u00e0y l\u00e0 m\u1ed9t t\u1eeb \u0111i\u1ec3n v\u00e0 cung c\u1ea5p quy\u1ec1n truy c\u1eadp v\u00e0o&nbsp;<a href=\"https:\/\/docs.saltproject.io\/en\/latest\/topics\/grains\/\" target=\"_blank\" rel=\"noreferrer noopener\">d\u1eef li\u1ec7u h\u1ea1t<\/a>&nbsp;c\u1ee7a minion :<\/p>\n<pre class=\"wp-block-code\"><code><code>{{ grains&#91;'shell'] }}<\/code><\/code><\/pre>\n<p><code>grains.get<\/code>B\u1ea1n c\u0169ng c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng h\u00e0m th\u01b0 vi\u1ec7n bi\u1ebfn&nbsp;c\u1ee7a Salt \u0111\u1ec3 truy c\u1eadp d\u1eef li\u1ec7u h\u1ea1t:<\/p>\n<pre class=\"wp-block-code\"><code><code>{{ salt&#91;'grains.get']('shell') }}<\/code><\/code><\/pre>\n<p><strong>Saltenv<\/strong>&nbsp;: B\u1ea1n c\u00f3 th\u1ec3 \u0111\u1ecbnh ngh\u0129a nhi\u1ec1u m\u00f4i tr\u01b0\u1eddng salt cho minion trong t\u1ec7p top c\u1ee7a Salt master, ch\u1eb3ng h\u1ea1n nh\u01b0&nbsp;<code>base<\/code>,&nbsp;<code>prod<\/code>,&nbsp;<code>dev<\/code>v\u00e0&nbsp;<code>test<\/code>.&nbsp;<code>saltenv<\/code>Bi\u1ebfn n\u00e0y cung c\u1ea5p m\u1ed9t c\u00e1ch \u0111\u1ec3 truy c\u1eadp m\u00f4i tr\u01b0\u1eddng Salt hi\u1ec7n t\u1ea1i trong t\u1ec7p tr\u1ea1ng th\u00e1i Salt. Bi\u1ebfn n\u00e0y ch\u1ec9 kh\u1ea3 d\u1ee5ng trong c\u00e1c t\u1ec7p tr\u1ea1ng th\u00e1i Salt.<\/p>\n<pre class=\"wp-block-code\"><code><code>{{ saltenv }}<\/code><\/code><\/pre>\n<p><strong>SLS<\/strong>&nbsp;: V\u1edbi&nbsp;<code>sls<\/code>bi\u1ebfn n\u00e0y, b\u1ea1n c\u00f3 th\u1ec3 l\u1ea5y \u0111\u01b0\u1ee3c gi\u00e1 tr\u1ecb tham chi\u1ebfu cho t\u1ec7p tr\u1ea1ng th\u00e1i hi\u1ec7n t\u1ea1i (v\u00ed d\u1ee5:&nbsp;<code>apache<\/code>,&nbsp;<code>webserver<\/code>, v.v.). \u0110\u00e2y l\u00e0 gi\u00e1 tr\u1ecb t\u01b0\u01a1ng t\u1ef1 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong t\u1ec7p top \u0111\u1ec3 \u00e1nh x\u1ea1 minion v\u00e0o t\u1ec7p tr\u1ea1ng th\u00e1i ho\u1eb7c th\u00f4ng qua&nbsp;<code>include<\/code>t\u00f9y ch\u1ecdn trong t\u1ec7p tr\u1ea1ng th\u00e1i:<\/p>\n<pre class=\"wp-block-code\"><code><code>{{ sls }}<\/code><\/code><\/pre>\n<p><strong>Slspath<\/strong>&nbsp;: Bi\u1ebfn n\u00e0y cung c\u1ea5p \u0111\u01b0\u1eddng d\u1eabn \u0111\u1ebfn t\u1ec7p tr\u1ea1ng th\u00e1i hi\u1ec7n t\u1ea1i:<\/p>\n<pre class=\"wp-block-code\"><code><code>{{ slspath }}<\/code><\/code><\/pre>\n<h3 id=\"variable-assignments\">G\u00e1n bi\u1ebfn<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#variable-assignments\"><\/a><\/h3>\n<p>B\u1ea1n c\u00f3 th\u1ec3 g\u00e1n gi\u00e1 tr\u1ecb cho m\u1ed9t bi\u1ebfn b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng th\u1ebb&nbsp;<code>set<\/code>c\u00f9ng v\u1edbi d\u1ea5u ph\u00e2n c\u00e1ch v\u00e0 c\u00fa ph\u00e1p sau:<\/p>\n<pre class=\"wp-block-code\"><code>{% set var_name = myvalue %}\n<\/code><\/pre>\n<p>Th\u1ef1c hi\u1ec7n&nbsp;<a href=\"https:\/\/www.python.org\/dev\/peps\/pep-0008\/?#naming-conventions\" target=\"_blank\" rel=\"noreferrer noopener\">theo quy \u01b0\u1edbc \u0111\u1eb7t t\u00ean Python<\/a>&nbsp;khi t\u1ea1o t\u00ean bi\u1ebfn. N\u1ebfu bi\u1ebfn \u0111\u01b0\u1ee3c g\u00e1n \u1edf c\u1ea5p cao nh\u1ea5t c\u1ee7a m\u1eabu, ph\u00e9p g\u00e1n s\u1ebd \u0111\u01b0\u1ee3c xu\u1ea5t v\u00e0 c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c nh\u1eadp b\u1edfi c\u00e1c m\u1eabu kh\u00e1c.<\/p>\n<p><a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#template-variables\">B\u1ea5t k\u1ef3 gi\u00e1 tr\u1ecb n\u00e0o \u0111\u01b0\u1ee3c t\u1ea1o ra b\u1edfi h\u00e0m th\u01b0 vi\u1ec7n bi\u1ebfn m\u1eabu<\/a>&nbsp;Salt&nbsp;\u0111\u1ec1u c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c g\u00e1n cho m\u1ed9t bi\u1ebfn m\u1edbi.<\/p>\n<pre class=\"wp-block-code\"><code>{% set username = salt&#91;'user.info']('username') %}\n<\/code><\/pre>\n<h3 id=\"filters\">B\u1ed9 l\u1ecdc<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#filters\"><\/a><\/h3>\n<p>B\u1ed9 l\u1ecdc c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng cho b\u1ea5t k\u1ef3 bi\u1ebfn m\u1eabu n\u00e0o th\u00f4ng qua m\u1ed9t&nbsp;<code>|<\/code>k\u00fd t\u1ef1. B\u1ed9 l\u1ecdc c\u00f3 th\u1ec3 n\u1ed1i chu\u1ed7i v\u00e0 ch\u1ea5p nh\u1eadn c\u00e1c \u0111\u1ed1i s\u1ed1 t\u00f9y ch\u1ecdn trong d\u1ea5u ngo\u1eb7c \u0111\u01a1n. Khi n\u1ed1i chu\u1ed7i b\u1ed9 l\u1ecdc, \u0111\u1ea7u ra c\u1ee7a m\u1ed9t b\u1ed9 l\u1ecdc s\u1ebd tr\u1edf th\u00e0nh \u0111\u1ea7u v\u00e0o c\u1ee7a b\u1ed9 l\u1ecdc ti\u1ebfp theo.<\/p>\n<pre class=\"wp-block-code\"><code>{{ '\/etc\/salt\/' | list_files | join('\\n') }}\n<\/code><\/pre>\n<p>C\u00e1c b\u1ed9 l\u1ecdc \u0111\u01b0\u1ee3c n\u1ed1i n\u00e0y s\u1ebd tr\u1ea3 v\u1ec1 danh s\u00e1ch \u0111\u1ec7 quy c\u1ee7a t\u1ea5t c\u1ea3 c\u00e1c t\u1ec7p trong th\u01b0&nbsp;<code>\/etc\/salt\/<\/code>m\u1ee5c. M\u1ed7i m\u1ee5c danh s\u00e1ch s\u1ebd \u0111\u01b0\u1ee3c n\u1ed1i b\u1eb1ng m\u1ed9t d\u00f2ng m\u1edbi.<\/p>\n<pre class=\"wp-block-code\"><code>  \/etc\/salt\/master\n  \/etc\/salt\/proxy\n  \/etc\/salt\/minion\n  \/etc\/salt\/pillar\/top.sls\n  \/etc\/salt\/pillar\/device1.sls\n  <\/code><\/pre>\n<p>\u0110\u1ec3 bi\u1ebft danh s\u00e1ch \u0111\u1ea7y \u0111\u1ee7 t\u1ea5t c\u1ea3 c\u00e1c b\u1ed9 l\u1ecdc Jinja t\u00edch h\u1ee3p, h\u00e3y tham kh\u1ea3o&nbsp;<a href=\"http:\/\/jinja.pocoo.org\/docs\/2.10\/templates\/#builtin-filters\" target=\"_blank\" rel=\"noreferrer noopener\">t\u00e0i li\u1ec7u Thi\u1ebft k\u1ebf m\u1eabu Jinja<\/a>&nbsp;. T\u00e0i li\u1ec7u ch\u00ednh th\u1ee9c c\u1ee7a Salt bao g\u1ed3m&nbsp;<a href=\"https:\/\/docs.saltproject.io\/en\/latest\/topics\/jinja\/index.html#filters\" target=\"_blank\" rel=\"noreferrer noopener\">danh s\u00e1ch c\u00e1c b\u1ed9 l\u1ecdc Jinja t\u00f9y ch\u1ec9nh<\/a>&nbsp;.<\/p>\n<h3 id=\"macros\">Macro<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#macros\"><\/a><\/h3>\n<p>Macro l\u00e0 c\u00e1c m\u1eabu nh\u1ecf, c\u00f3 th\u1ec3 t\u00e1i s\u1eed d\u1ee5ng gi\u00fap b\u1ea1n gi\u1ea3m thi\u1ec3u s\u1ef1 l\u1eb7p l\u1ea1i khi t\u1ea1o tr\u1ea1ng th\u00e1i. X\u00e1c \u0111\u1ecbnh macro trong c\u00e1c m\u1eabu Jinja \u0111\u1ec3 bi\u1ec3u di\u1ec5n c\u00e1c c\u1ea5u tr\u00fac th\u01b0\u1eddng d\u00f9ng v\u00e0 sau \u0111\u00f3 t\u00e1i s\u1eed d\u1ee5ng c\u00e1c macro trong c\u00e1c t\u1ec7p tr\u1ea1ng th\u00e1i.<\/p>\n<pre class=\"wp-block-code\"><code>{% macro mysql_privs(user, grant=select, database, host=localhost) %}\n{{ user }}_exampledb:\n   mysql_grants.present:\n    - grant: {{ grant }}\n    - database: {{ database }}\n    - user: {{user}}\n    - host: {{ host }}\n{% endmacro %}<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>{% import \"\/srv\/salt\/mysql\/db_macro.sls\" as db -%}\n\ndb.mysql_privs('jane','exampledb.*','select,insert,update')<\/code><\/pre>\n<p>Macro&nbsp;<code>mysql_privs()<\/code>\u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a trong&nbsp;<code>db_macro.sls<\/code>t\u1ec7p. Sau \u0111\u00f3, m\u1eabu \u0111\u01b0\u1ee3c nh\u1eadp v\u00e0o&nbsp;<code>db<\/code>bi\u1ebfn trong&nbsp;<code>db_privs.sls<\/code>t\u1ec7p tr\u1ea1ng th\u00e1i v\u00e0 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o tr\u1ea1ng th\u00e1i MySQL&nbsp;<code>grants<\/code>cho m\u1ed9t ng\u01b0\u1eddi d\u00f9ng c\u1ee5 th\u1ec3.<\/p>\n<p>Tham kh\u1ea3o ph\u1ea7n&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#imports-and-includes\">Nh\u1eadp v\u00e0 Bao g\u1ed3m<\/a>&nbsp;\u0111\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin v\u1ec1 vi\u1ec7c nh\u1eadp m\u1eabu v\u00e0 bi\u1ebfn.<\/p>\n<h3 id=\"imports-and-includes\">Nh\u1eadp kh\u1ea9u v\u00e0 Bao g\u1ed3m<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#imports-and-includes\"><\/a><\/h3>\n<p><strong>Nh\u1eadp kh\u1ea9u<\/strong><\/p>\n<p>Nh\u1eadp trong Jinja t\u01b0\u01a1ng t\u1ef1 nh\u01b0 nh\u1eadp trong Python. B\u1ea1n c\u00f3 th\u1ec3 nh\u1eadp to\u00e0n b\u1ed9 m\u1eabu, tr\u1ea1ng th\u00e1i c\u1ee5 th\u1ec3 ho\u1eb7c macro \u0111\u01b0\u1ee3c x\u00e1c \u0111\u1ecbnh trong t\u1ec7p.<\/p>\n<pre class=\"wp-block-code\"><code>{% import '\/srv\/salt\/users.sls' as users %}\n<\/code><\/pre>\n<p>V\u00ed d\u1ee5 n\u00e0y s\u1ebd nh\u1eadp t\u1ec7p tr\u1ea1ng th\u00e1i&nbsp;<code>users.sls<\/code>v\u00e0o bi\u1ebfn&nbsp;<code>users<\/code>. T\u1ea5t c\u1ea3 c\u00e1c tr\u1ea1ng th\u00e1i v\u00e0 macro \u0111\u01b0\u1ee3c x\u00e1c \u0111\u1ecbnh trong m\u1eabu s\u1ebd c\u00f3 s\u1eb5n b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng k\u00fd hi\u1ec7u d\u1ea5u ch\u1ea5m.<\/p>\n<p>B\u1ea1n c\u0169ng c\u00f3 th\u1ec3 nh\u1eadp tr\u1ea1ng th\u00e1i ho\u1eb7c macro c\u1ee5 th\u1ec3 t\u1eeb m\u1ed9t t\u1ec7p.<\/p>\n<pre class=\"wp-block-code\"><code>{% from '\/srv\/salt\/user.sls' import mysql_privs as grants %}\n<\/code><\/pre>\n<p>L\u1ec7nh nh\u1eadp n\u00e0y nh\u1eafm v\u00e0o macro&nbsp;<code>mysql_privs<\/code>\u0111\u01b0\u1ee3c x\u00e1c \u0111\u1ecbnh trong&nbsp;<code>user.sls<\/code>t\u1ec7p tr\u1ea1ng th\u00e1i v\u00e0 \u0111\u01b0\u1ee3c cung c\u1ea5p cho m\u1eabu hi\u1ec7n t\u1ea1i v\u1edbi&nbsp;<code>grants<\/code>bi\u1ebfn \u0111\u00f3.<\/p>\n<p><strong>Bao g\u1ed3m<\/strong><\/p>\n<p>Th\u1ebb n\u00e0y&nbsp;<code>{% include %}<\/code>hi\u1ec3n th\u1ecb \u0111\u1ea7u ra c\u1ee7a m\u1ed9t m\u1eabu kh\u00e1c v\u00e0o v\u1ecb tr\u00ed m\u00e0 th\u1ebb include \u0111\u01b0\u1ee3c khai b\u00e1o. Khi s\u1eed d\u1ee5ng th\u1ebb,&nbsp;<code>{% include %}<\/code>ng\u1eef c\u1ea3nh c\u1ee7a m\u1eabu include \u0111\u01b0\u1ee3c chuy\u1ec3n \u0111\u1ebfn m\u1eabu \u0111ang g\u1ecdi.<\/p>\n<pre class=\"wp-block-code\"><code>include:\n  - groups\n\n{% include 'users.sls' %}<\/code><\/pre>\n<p class=\"has-background\" style=\"background-color:#74f78c33\">Ghi ch\u00fa: M\u1ed9t t\u1ec7p \u0111\u01b0\u1ee3c tham chi\u1ebfu b\u1edfi th\u1ebb Jinja&nbsp;<code>include<\/code>c\u1ea7n \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh theo \u0111\u01b0\u1eddng d\u1eabn tuy\u1ec7t \u0111\u1ed1i c\u1ee7a n\u00f3 t\u1eeb&nbsp;<a href=\"https:\/\/github.com\/saltstack\/salt\/issues\/15863#issuecomment-57823633\" target=\"_blank\" rel=\"noreferrer noopener\">thi\u1ebft l\u1eadp&nbsp;c\u1ee7a Salt<code>file_roots<\/code><\/a>&nbsp;; s\u1eed d\u1ee5ng \u0111\u01b0\u1eddng d\u1eabn t\u01b0\u01a1ng \u0111\u1ed1i t\u1eeb t\u1ec7p tr\u1ea1ng th\u00e1i hi\u1ec7n t\u1ea1i s\u1ebd t\u1ea1o ra l\u1ed7i. \u0110\u1ec3 bao g\u1ed3m m\u1ed9t t\u1ec7p trong c\u00f9ng th\u01b0 m\u1ee5c v\u1edbi t\u1ec7p tr\u1ea1ng th\u00e1i hi\u1ec7n t\u1ea1i:<\/p>\n<pre class=\"wp-block-code\"><code>{% include slspath + \"\/users.sls\" %}\n<\/code><\/pre>\n<p class=\"has-background\" style=\"background-color:#74f78c33\">Ngo\u00e0i ra, l\u01b0u \u00fd r\u1eb1ng Salt c\u00f3&nbsp;<a href=\"https:\/\/docs.saltproject.io\/en\/latest\/ref\/states\/include.html\" target=\"_blank\" rel=\"noreferrer noopener\">khai b\u00e1o&nbsp;<\/a><a href=\"https:\/\/docs.saltproject.io\/en\/latest\/ref\/states\/include.html\" target=\"_blank\" rel=\"noreferrer noopener\">g\u1ed1c ri\u00eang<code>include<\/code><\/a>&nbsp;, \u0111\u1ed9c l\u1eadp v\u1edbi . c\u1ee7a Jinja&nbsp;<code>include<\/code>.<\/p>\n<p><strong>Nh\u1eadp kh\u1ea9u h\u00e0nh vi b\u1ed1i c\u1ea3nh<\/strong><\/p>\n<p>Theo m\u1eb7c \u0111\u1ecbnh, m\u1ed9t l\u1ea7n nh\u1eadp s\u1ebd kh\u00f4ng bao g\u1ed3m ng\u1eef c\u1ea3nh c\u1ee7a m\u1eabu \u0111\u00e3 nh\u1eadp, v\u00ec c\u00e1c l\u1ea7n nh\u1eadp \u0111\u01b0\u1ee3c l\u01b0u trong b\u1ed9 nh\u1edb \u0111\u1ec7m. \u0110i\u1ec1u n\u00e0y c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c ghi \u0111\u00e8 b\u1eb1ng c\u00e1ch th\u00eam&nbsp;<code>with context<\/code>v\u00e0o c\u00e1c c\u00e2u l\u1ec7nh nh\u1eadp c\u1ee7a b\u1ea1n.<\/p>\n<pre class=\"wp-block-code\"><code>{% from '\/srv\/salt\/user.sls' import mysql_privs with context %}\n<\/code><\/pre>\n<p>T\u01b0\u01a1ng t\u1ef1 nh\u01b0 v\u1eady, n\u1ebfu b\u1ea1n mu\u1ed1n x\u00f3a ng\u1eef c\u1ea3nh kh\u1ecfi&nbsp;<code>{% include %}<\/code>, h\u00e3y th\u00eam&nbsp;<code>without context<\/code>:<\/p>\n<pre class=\"wp-block-code\"><code>{% include 'users.sls' without context %}\n<\/code><\/pre>\n<h3 id=\"whitespace-control\">Ki\u1ec3m so\u00e1t kho\u1ea3ng tr\u1eafng<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#whitespace-control\"><\/a><\/h3>\n<p>Jinja cung c\u1ea5p m\u1ed9t s\u1ed1 c\u01a1 ch\u1ebf \u0111\u1ec3 ki\u1ec3m so\u00e1t kho\u1ea3ng tr\u1eafng c\u1ee7a \u0111\u1ea7u ra \u0111\u01b0\u1ee3c k\u1ebft xu\u1ea5t. Theo m\u1eb7c \u0111\u1ecbnh, Jinja x\u00f3a c\u00e1c d\u00f2ng m\u1edbi theo sau v\u00e0 gi\u1eef nguy\u00ean m\u1ecdi th\u1ee9 kh\u00e1c, v\u00ed d\u1ee5 nh\u01b0 tab, kho\u1ea3ng tr\u1eafng v\u00e0 nhi\u1ec1u d\u00f2ng m\u1edbi. B\u1ea1n c\u00f3 th\u1ec3 t\u00f9y ch\u1ec9nh c\u00e1ch c\u00f4ng c\u1ee5 m\u1eabu Jinja c\u1ee7a Salt x\u1eed l\u00fd kho\u1ea3ng tr\u1eafng trong&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#jinja-basics\">t\u1ec7p c\u1ea5u h\u00ecnh ch\u00ednh c\u1ee7a Salt<\/a>&nbsp;. M\u1ed9t s\u1ed1 t\u00f9y ch\u1ecdn m\u00f4i tr\u01b0\u1eddng c\u00f3 s\u1eb5n \u0111\u1ec3 ki\u1ec3m so\u00e1t kho\u1ea3ng tr\u1eafng l\u00e0:<\/p>\n<ul>\n<li><code>trim_blocks<\/code>: Khi \u0111\u01b0\u1ee3c \u0111\u1eb7t th\u00e0nh&nbsp;<code>True<\/code>, d\u00f2ng m\u1edbi \u0111\u1ea7u ti\u00ean sau th\u1ebb m\u1eabu s\u1ebd t\u1ef1 \u0111\u1ed9ng b\u1ecb x\u00f3a.&nbsp;<code>False<\/code>Theo m\u1eb7c \u0111\u1ecbnh, t\u00f9y ch\u1ecdn n\u00e0y \u0111\u01b0\u1ee3c \u0111\u1eb7t th\u00e0nh trong Salt.<\/li>\n<li><code>lstrip_blocks<\/code>: Khi \u0111\u01b0\u1ee3c \u0111\u1eb7t th\u00e0nh&nbsp;<code>True<\/code>, Jinja s\u1ebd x\u00f3a c\u00e1c tab v\u00e0 kho\u1ea3ng tr\u1eafng t\u1eeb \u0111\u1ea7u d\u00f2ng \u0111\u1ebfn \u0111\u1ea7u kh\u1ed1i. N\u1ebfu c\u00f3 c\u00e1c k\u00fd t\u1ef1 kh\u00e1c tr\u01b0\u1edbc khi b\u1eaft \u0111\u1ea7u kh\u1ed1i, s\u1ebd kh\u00f4ng c\u00f3 k\u00fd t\u1ef1 n\u00e0o b\u1ecb x\u00f3a.&nbsp;<code>False<\/code>Theo m\u1eb7c \u0111\u1ecbnh, t\u00f9y ch\u1ecdn n\u00e0y \u0111\u01b0\u1ee3c \u0111\u1eb7t th\u00e0nh trong Salt.<\/li>\n<li><code>keep_trailing_newline<\/code>: Khi \u0111\u01b0\u1ee3c \u0111\u1eb7t th\u00e0nh&nbsp;<code>True<\/code>, Jinja s\u1ebd gi\u1eef nguy\u00ean c\u00e1c d\u00f2ng m\u1edbi theo sau.&nbsp;<code>False<\/code>Theo m\u1eb7c \u0111\u1ecbnh, t\u00f9y ch\u1ecdn n\u00e0y \u0111\u01b0\u1ee3c \u0111\u1eb7t th\u00e0nh trong Salt.<\/li>\n<\/ul>\n<p>\u0110\u1ec3 tr\u00e1nh g\u1eb7p ph\u1ea3i l\u1ed7i c\u00fa ph\u00e1p YAML, h\u00e3y \u0111\u1ea3m b\u1ea3o r\u1eb1ng b\u1ea1n c\u00e2n nh\u1eafc \u0111\u1ebfn h\u00e0nh vi hi\u1ec3n th\u1ecb kho\u1ea3ng tr\u1eafng c\u1ee7a Jinja khi ch\u00e8n \u0111\u00e1nh d\u1ea5u m\u1eabu v\u00e0o tr\u1ea1ng th\u00e1i Salt. H\u00e3y nh\u1edb r\u1eb1ng, Jinja ph\u1ea3i t\u1ea1o ra YAML h\u1ee3p l\u1ec7. Khi s\u1eed d\u1ee5ng c\u1ea5u tr\u00fac \u0111i\u1ec1u khi\u1ec3n ho\u1eb7c macro, c\u00f3 th\u1ec3 c\u1ea7n ph\u1ea3i x\u00f3a kho\u1ea3ng tr\u1eafng kh\u1ecfi kh\u1ed1i m\u1eabu \u0111\u1ec3 hi\u1ec3n th\u1ecb YAML h\u1ee3p l\u1ec7 m\u1ed9t c\u00e1ch ph\u00f9 h\u1ee3p.<\/p>\n<p>\u0110\u1ec3 gi\u1eef nguy\u00ean kho\u1ea3ng tr\u1eafng c\u1ee7a n\u1ed9i dung trong c\u00e1c kh\u1ed1i m\u1eabu, b\u1ea1n c\u00f3 th\u1ec3 \u0111\u1eb7t c\u1ea3 t\u00f9y&nbsp;ch\u1ecdn&nbsp;<code>trim_blocks<\/code>v\u00e0&nbsp;trong t\u1ec7p c\u1ea5u h\u00ecnh ch\u00ednh. B\u1ea1n c\u0169ng c\u00f3 th\u1ec3 b\u1eadt v\u00e0 t\u1eaft th\u1ee7 c\u00f4ng c\u00e1c t\u00f9y ch\u1ecdn m\u00f4i tr\u01b0\u1eddng kho\u1ea3ng tr\u1eafng trong m\u1ed7i kh\u1ed1i m\u1eabu. M\u1ed9t&nbsp;k\u00fd t\u1ef1 s\u1ebd \u0111\u1eb7t h\u00e0nh vi c\u1ee7a&nbsp;v\u00e0&nbsp;th\u00e0nh&nbsp;v\u00e0 m\u1ed9t&nbsp;k\u00fd t\u1ef1 s\u1ebd \u0111\u1eb7t c\u00e1c t\u00f9y ch\u1ecdn n\u00e0y&nbsp;cho kh\u1ed1i:<code>lstrip_block<\/code><code>True<\/code><code>-<\/code><code>trim_blocks<\/code><code>lstrip_blocks<\/code><code>False<\/code><code>+<\/code><code>True<\/code><\/p>\n<p>V\u00ed d\u1ee5, \u0111\u1ec3 x\u00f3a kho\u1ea3ng tr\u1eafng sau ph\u1ea7n \u0111\u1ea7u c\u1ee7a c\u1ea5u tr\u00fac \u0111i\u1ec1u khi\u1ec3n, h\u00e3y th\u00eam m\u1ed9t&nbsp;<code>-<\/code>k\u00fd t\u1ef1 tr\u01b0\u1edbc ph\u1ea7n \u0111\u00f3ng&nbsp;<code>%}<\/code>:<\/p>\n<pre class=\"wp-block-code\"><code>{% for item in &#91;1,2,3,4,5] -%}\n    {{ item }}\n{% endfor %}\n<\/code><\/pre>\n<p>\u0110i\u1ec1u n\u00e0y s\u1ebd xu\u1ea5t ra c\u00e1c s\u1ed1&nbsp;<code>12345<\/code>m\u00e0 kh\u00f4ng c\u00f3 kho\u1ea3ng tr\u1eafng \u1edf \u0111\u1ea7u. N\u1ebfu kh\u00f4ng c\u00f3&nbsp;<code>-<\/code>k\u00fd t\u1ef1, \u0111\u1ea7u ra s\u1ebd gi\u1eef nguy\u00ean kho\u1ea3ng c\u00e1ch \u0111\u01b0\u1ee3c x\u00e1c \u0111\u1ecbnh trong kh\u1ed1i.<\/p>\n<h3 id=\"control-structures\">C\u1ea5u tr\u00fac \u0111i\u1ec1u khi\u1ec3n<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#control-structures\"><\/a><\/h3>\n<p>Jinja cung c\u1ea5p c\u00e1c c\u1ea5u tr\u00fac \u0111i\u1ec1u khi\u1ec3n ph\u1ed5 bi\u1ebfn cho nhi\u1ec1u ng\u00f4n ng\u1eef l\u1eadp tr\u00ecnh nh\u01b0 v\u00f2ng l\u1eb7p, \u0111i\u1ec1u ki\u1ec7n, macro v\u00e0 kh\u1ed1i. Vi\u1ec7c s\u1eed d\u1ee5ng c\u00e1c c\u1ea5u tr\u00fac \u0111i\u1ec1u khi\u1ec3n trong tr\u1ea1ng th\u00e1i Salt cho ph\u00e9p ki\u1ec3m so\u00e1t chi ti\u1ebft lu\u1ed3ng th\u1ef1c thi tr\u1ea1ng th\u00e1i.<\/p>\n<p><strong>V\u00f2ng l\u1eb7p For<\/strong><\/p>\n<p>V\u00f2ng l\u1eb7p For cho ph\u00e9p b\u1ea1n l\u1eb7p qua danh s\u00e1ch c\u00e1c m\u1ee5c v\u00e0 th\u1ef1c thi c\u00f9ng m\u1ed9t m\u00e3 ho\u1eb7c c\u1ea5u h\u00ecnh cho t\u1eebng m\u1ee5c trong danh s\u00e1ch. V\u00f2ng l\u1eb7p cung c\u1ea5p m\u1ed9t c\u00e1ch \u0111\u1ec3 gi\u1ea3m s\u1ef1 l\u1eb7p l\u1ea1i trong c\u00e1c tr\u1ea1ng th\u00e1i Salt.<\/p>\n<pre class=\"wp-block-code\"><code>{% set groups = &#91;'sudo','wheel', 'admins'] %}\ninclude:\n  - groups\n\njane:\n  user.present:\n    - fullname: Jane Doe\n    - shell: \/bin\/zsh\n    - createhome: True\n    - home: \/home\/jane\n    - uid: 4001\n    - groups:\n    {%- for group in groups %}\n      - {{ group }}\n    {%- endfor -%}<\/code><\/pre>\n<p>V\u00f2ng l\u1eb7p for tr\u01b0\u1edbc \u0111\u00f3 s\u1ebd g\u00e1n ng\u01b0\u1eddi d\u00f9ng&nbsp;<code>jane<\/code>v\u00e0o t\u1ea5t c\u1ea3 c\u00e1c nh\u00f3m trong&nbsp;<code>groups<\/code>danh s\u00e1ch \u0111\u01b0\u1ee3c \u0111\u1eb7t \u1edf \u0111\u1ea7u&nbsp;<code>users.sls<\/code>t\u1ec7p.<\/p>\n<p><strong>\u0110i\u1ec1u ki\u1ec7n<\/strong><\/p>\n<p>Bi\u1ec3u th\u1ee9c \u0111i\u1ec1u ki\u1ec7n \u0111\u00e1nh gi\u00e1 th\u00e0nh ho\u1eb7c&nbsp;<code>True<\/code>ho\u1eb7c&nbsp;<code>False<\/code>v\u00e0 \u0111i\u1ec1u khi\u1ec3n lu\u1ed3ng c\u1ee7a ch\u01b0\u01a1ng tr\u00ecnh d\u1ef1a tr\u00ean k\u1ebft qu\u1ea3 c\u1ee7a bi\u1ec3u th\u1ee9c boolean \u0111\u01b0\u1ee3c \u0111\u00e1nh gi\u00e1. Bi\u1ec3u th\u1ee9c \u0111i\u1ec1u ki\u1ec7n c\u1ee7a Jinja \u0111\u01b0\u1ee3c th\u00eam ti\u1ec1n t\u1ed1 l\u00e0&nbsp;<code>if<\/code>\/&nbsp;<code>elif<\/code>\/&nbsp;<code>else<\/code>v\u00e0 \u0111\u01b0\u1ee3c \u0111\u1eb7t trong&nbsp;<code>{% ... %}<\/code>d\u1ea5u ph\u00e2n c\u00e1ch.<\/p>\n<pre class=\"wp-block-code\"><code>{% set users = &#91;'anna','juan','genaro','mirza'] %}\n{% set admin_users = &#91;'genaro','mirza'] %}\n{% set admin_groups = &#91;'sudo','wheel', 'admins'] %}\n{% set org_groups = &#91;'games', 'webserver'] %}\n\n\ninclude:\n  - groups\n\n{% for user in users %}\n{{ user }}:\n  user.present:\n    - shell: \/bin\/zsh\n    - createhome: True\n    - home: \/home\/{{ user }}\n    - groups:\n{% if user in admin_users %}\n    {%- for admin_group in admin_groups %}\n      - {{ admin_group }}\n    {%- endfor -%}\n{% else %}\n    {%- for org_group in org_groups %}\n      - {{ org_group }}\n    {% endfor %}\n{%- endif -%}\n{% endfor %}<\/code><\/pre>\n<p>Trong v\u00ed d\u1ee5 n\u00e0y, s\u1ef1 hi\u1ec7n di\u1ec7n c\u1ee7a ng\u01b0\u1eddi d\u00f9ng trong&nbsp;<code>admin_users<\/code>danh s\u00e1ch s\u1ebd x\u00e1c \u0111\u1ecbnh nh\u00f3m n\u00e0o \u0111\u01b0\u1ee3c \u0111\u1eb7t cho ng\u01b0\u1eddi d\u00f9ng \u0111\u00f3 trong tr\u1ea1ng th\u00e1i. Tham kh\u1ea3o ph\u1ea7n&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#salt-and-jinja-best-practices\">Th\u1ef1c h\u00e0nh t\u1ed1t nh\u1ea5t c\u1ee7a Salt<\/a>&nbsp;\u0111\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin v\u1ec1 vi\u1ec7c s\u1eed d\u1ee5ng c\u00e1c \u0111i\u1ec1u ki\u1ec7n v\u00e0 c\u00e2u l\u1ec7nh \u0111i\u1ec1u khi\u1ec3n lu\u1ed3ng trong t\u1ec7p tr\u1ea1ng th\u00e1i.<\/p>\n<h3 id=\"template-inheritance\">K\u1ebf th\u1eeba m\u1eabu<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#template-inheritance\"><\/a><\/h3>\n<p>V\u1edbi k\u1ebf th\u1eeba m\u1eabu, b\u1ea1n c\u00f3 th\u1ec3 \u0111\u1ecbnh ngh\u0129a m\u1ed9t m\u1eabu c\u01a1 s\u1edf c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng l\u1ea1i b\u1edfi c\u00e1c m\u1eabu con. M\u1eabu con c\u00f3 th\u1ec3 ghi \u0111\u00e8 c\u00e1c kh\u1ed1i \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh b\u1edfi m\u1eabu c\u01a1 s\u1edf.<\/p>\n<p>S\u1eed d\u1ee5ng&nbsp;<code>{% block block_name %}<\/code>th\u1ebb c\u00f3 t\u00ean kh\u1ed1i \u0111\u1ec3 x\u00e1c \u0111\u1ecbnh v\u00f9ng c\u1ee7a m\u1eabu c\u01a1 s\u1edf c\u00f3 th\u1ec3 ghi \u0111\u00e8.<\/p>\n<pre class=\"wp-block-code\"><code>{% block user %}jane{% endblock %}:\n  user.present:\n    - fullname: {% block fullname %}{% endblock %}\n    - shell: \/bin\/zsh\n    - createhome: True\n    - home: \/home\/{% block home_dir %}\n    - uid: 4000\n    - groups:\n      - sudo<\/code><\/pre>\n<p>V\u00ed d\u1ee5 n\u00e0y t\u1ea1o ra m\u1ed9t m\u1eabu tr\u1ea1ng th\u00e1i ng\u01b0\u1eddi d\u00f9ng c\u01a1 s\u1edf. B\u1ea5t k\u1ef3 gi\u00e1 tr\u1ecb n\u00e0o ch\u1ee9a th\u1ebb \u0111\u1ec1u&nbsp;<code>{% block %}<\/code>c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c ghi \u0111\u00e8 b\u1edfi m\u1ed9t m\u1eabu con v\u1edbi gi\u00e1 tr\u1ecb ri\u00eang c\u1ee7a n\u00f3.<\/p>\n<p>\u0110\u1ec3 s\u1eed d\u1ee5ng m\u1eabu c\u01a1 s\u1edf trong m\u1eabu con, h\u00e3y s\u1eed d\u1ee5ng th\u1ebb&nbsp;<code>{% extends \"base.sls\"%}<\/code>c\u00f3 v\u1ecb tr\u00ed c\u1ee7a t\u1ec7p m\u1eabu c\u01a1 s\u1edf.<\/p>\n<pre class=\"wp-block-code\"><code>{% extends \"\/srv\/salt\/users.jinja\" %}\n\n{% block fullname %}{{ salt&#91;'pillar.get']('jane:fullname', '') }}{% endblock %}\n{% block home_dir %}{{ salt&#91;'pillar.get']('jane:home_dir', 'jane') }}{% endblock %}<\/code><\/pre>\n<p>T\u1ec7p&nbsp;<code>webserver_users.sls<\/code>tr\u1ea1ng th\u00e1i m\u1edf r\u1ed9ng&nbsp;<code>users.jinja<\/code>m\u1eabu v\u00e0 x\u00e1c \u0111\u1ecbnh gi\u00e1 tr\u1ecb cho c\u00e1c kh\u1ed1i&nbsp;<code>fullname<\/code>v\u00e0&nbsp;<code>home_dir<\/code>. C\u00e1c gi\u00e1 tr\u1ecb \u0111\u01b0\u1ee3c t\u1ea1o b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#template-variables\"><code>salt<\/code>bi\u1ebfn ng\u1eef c\u1ea3nh<\/a>&nbsp;v\u00e0 d\u1eef li\u1ec7u tr\u1ee5 c\u1ed9t. Ph\u1ea7n c\u00f2n l\u1ea1i c\u1ee7a tr\u1ea1ng th\u00e1i s\u1ebd \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb theo&nbsp;<code>user.jinja<\/code>c\u00e1ch m\u1eabu cha \u0111\u00e3 x\u00e1c \u0111\u1ecbnh.<\/p>\n<h2 id=\"salt-and-jinja-best-practices\">Th\u1ef1c h\u00e0nh t\u1ed1t nh\u1ea5t c\u1ee7a mu\u1ed1i v\u00e0 Jinja<a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/#salt-and-jinja-best-practices\"><\/a><\/h2>\n<p>N\u1ebfu Jinja b\u1ecb s\u1eed d\u1ee5ng qu\u00e1 m\u1ee9c, s\u1ee9c m\u1ea1nh v\u00e0 t\u00ednh linh ho\u1ea1t c\u1ee7a n\u00f3 c\u00f3 th\u1ec3 t\u1ea1o ra c\u00e1c t\u1ec7p tr\u1ea1ng th\u00e1i Salt kh\u00f4ng th\u1ec3 b\u1ea3o tr\u00ec v\u00e0 kh\u00f3 \u0111\u1ecdc. Sau \u0111\u00e2y l\u00e0 m\u1ed9t s\u1ed1 bi\u1ec7n ph\u00e1p t\u1ed1t nh\u1ea5t \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o r\u1eb1ng b\u1ea1n \u0111ang s\u1eed d\u1ee5ng Jinja hi\u1ec7u qu\u1ea3:<\/p>\n<ul>\n<li>Gi\u1edbi h\u1ea1n s\u1ed1 l\u01b0\u1ee3ng Jinja b\u1ea1n s\u1eed d\u1ee5ng trong c\u00e1c t\u1ec7p tr\u1ea1ng th\u00e1i. T\u1ed1t nh\u1ea5t l\u00e0 t\u00e1ch d\u1eef li\u1ec7u kh\u1ecfi tr\u1ea1ng th\u00e1i s\u1ebd s\u1eed d\u1ee5ng d\u1eef li\u1ec7u. \u0110i\u1ec1u n\u00e0y cho ph\u00e9p b\u1ea1n c\u1eadp nh\u1eadt d\u1eef li\u1ec7u m\u00e0 kh\u00f4ng c\u1ea7n ph\u1ea3i thay \u0111\u1ed5i tr\u1ea1ng th\u00e1i c\u1ee7a m\u00ecnh.<\/li>\n<li>Kh\u00f4ng l\u1ea1m d\u1ee5ng \u0111i\u1ec1u ki\u1ec7n v\u00e0 v\u00f2ng l\u1eb7p trong c\u00e1c t\u1ec7p tr\u1ea1ng th\u00e1i. L\u1ea1m d\u1ee5ng s\u1ebd khi\u1ebfn vi\u1ec7c \u0111\u1ecdc, hi\u1ec3u v\u00e0 duy tr\u00ec tr\u1ea1ng th\u00e1i c\u1ee7a b\u1ea1n tr\u1edf n\u00ean kh\u00f3 kh\u0103n.<\/li>\n<li>S\u1eed d\u1ee5ng t\u1eeb \u0111i\u1ec3n bi\u1ebfn v\u00e0 tu\u1ea7n t\u1ef1 h\u00f3a tr\u1ef1c ti\u1ebfp ch\u00fang th\u00e0nh YAML, thay v\u00ec c\u1ed1 g\u1eafng t\u1ea1o YAML h\u1ee3p l\u1ec7 trong m\u1ed9t m\u1eabu. B\u1ea1n c\u00f3 th\u1ec3 \u0111\u01b0a logic c\u1ee7a m\u00ecnh v\u00e0o t\u1eeb \u0111i\u1ec3n v\u00e0 truy xu\u1ea5t bi\u1ebfn c\u1ea7n thi\u1ebft trong c\u00e1c tr\u1ea1ng th\u00e1i c\u1ee7a m\u00ecnh.Th\u1ebb&nbsp;<code>{% load_yaml %}<\/code>s\u1ebd h\u1ee7y tu\u1ea7n t\u1ef1 h\u00f3a c\u00e1c chu\u1ed7i v\u00e0 bi\u1ebfn \u0111\u01b0\u1ee3c truy\u1ec1n v\u00e0o n\u00f3.<\/li>\n<\/ul>\n<pre class=\"wp-block-code\"><code> {% load_yaml as example_yaml %}\n       user: jane\n       firstname: Jane\n       lastname: Doe\n   {% endload %}\n\n   {{ example_yaml.user }}:\n      user.present:\n        - fullname: {{ example_yaml.firstname }} {{ example_yaml.lastname }}\n        - shell: \/bin\/zsh\n        - createhome: True\n        - home: \/home\/{{ example_yaml.user }}\n        - uid: 4001\n        - groups:\n          - games<\/code><\/pre>\n<p>S\u1eed d\u1ee5ng&nbsp;<code>{% import_yaml %}<\/code>\u0111\u1ec3 nh\u1eadp c\u00e1c t\u1ec7p d\u1eef li\u1ec7u b\u00ean ngo\u00e0i v\u00e0 l\u00e0m cho d\u1eef li\u1ec7u c\u00f3 s\u1eb5n d\u01b0\u1edbi d\u1ea1ng bi\u1ebfn Jinja.<\/p>\n<pre class=\"wp-block-code\"><code>   {% import_yaml \"users.yml\" as users %}<\/code><\/pre>\n<p>S\u1eed d\u1ee5ng Salt&nbsp;<a href=\"https:\/\/docs.saltproject.io\/en\/latest\/topics\/tutorials\/pillar.html\" target=\"_blank\" rel=\"noreferrer noopener\">Pillars<\/a>&nbsp;\u0111\u1ec3 l\u01b0u tr\u1eef d\u1eef li\u1ec7u chung ho\u1eb7c nh\u1ea1y c\u1ea3m d\u01b0\u1edbi d\u1ea1ng bi\u1ebfn. Truy c\u1eadp c\u00e1c bi\u1ebfn n\u00e0y b\u00ean trong t\u1ec7p tr\u1ea1ng th\u00e1i v\u00e0 t\u1ec7p m\u1eabu.<\/p>\n<h2 id=\"more-information\">Th\u00f4ng tin th\u00eam<\/h2>\n<p>B\u1ea1n c\u00f3 th\u1ec3 mu\u1ed1n tham kh\u1ea3o c\u00e1c ngu\u1ed3n sau \u0111\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin v\u1ec1 ch\u1ee7 \u0111\u1ec1 n\u00e0y. M\u1eb7c d\u00f9 ch\u00fang t\u00f4i cung c\u1ea5p v\u1edbi hy v\u1ecdng r\u1eb1ng ch\u00fang s\u1ebd h\u1eefu \u00edch, nh\u01b0ng xin l\u01b0u \u00fd r\u1eb1ng ch\u00fang t\u00f4i kh\u00f4ng th\u1ec3 \u0111\u1ea3m b\u1ea3o t\u00ednh ch\u00ednh x\u00e1c ho\u1eb7c t\u00ednh k\u1ecbp th\u1eddi c\u1ee7a c\u00e1c t\u00e0i li\u1ec7u \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef b\u00ean ngo\u00e0i.<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.saltproject.io\/en\/latest\/topics\/best_practices.html#modularity-within-states\" target=\"_blank\" rel=\"noreferrer noopener\">Th\u1ef1c h\u00e0nh t\u1ed1t nh\u1ea5t v\u1ec1 mu\u1ed1i<\/a><\/li>\n<li><a href=\"https:\/\/docs.saltproject.io\/en\/latest\/topics\/tutorials\/states_pt1.html\" target=\"_blank\" rel=\"noreferrer noopener\">H\u01b0\u1edbng d\u1eabn v\u1ec1 Salt States<\/a><\/li>\n<li><a href=\"http:\/\/jinja.pocoo.org\/docs\/2.10\/templates\/#import\" target=\"_blank\" rel=\"noreferrer noopener\">T\u00e0i li\u1ec7u thi\u1ebft k\u1ebf m\u1eabu Jinja<\/a><\/li>\n<\/ul>\n<p>Ngu\u1ed3n: https:\/\/www.linode.com\/docs\/guides\/introduction-to-jinja-templates-for-salt\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gi\u1edbi thi\u1ec7u v\u1ec1 Ng\u00f4n ng\u1eef M\u1eabu Jinja l\u00e0 ng\u00f4n ng\u1eef m\u1eabu linh ho\u1ea1t cho Python c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o b\u1ea5t k\u1ef3 \u0111\u1ecbnh d\u1ea1ng d\u1ef1a tr\u00ean v\u0103n b\u1ea3n n\u00e0o nh\u01b0 HTML, XML v\u00e0 YAML. C\u00e1c ng\u00f4n ng\u1eef m\u1eabu nh\u01b0 Jinja cho ph\u00e9p b\u1ea1n ch\u00e8n d\u1eef li\u1ec7u v\u00e0o \u0111\u1ecbnh d\u1ea1ng c\u00f3 c\u1ea5u tr\u00fac. B\u1ea1n<\/p>\n","protected":false},"author":1,"featured_media":36030,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[124],"tags":[],"class_list":["post-34982","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-salt"],"_links":{"self":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/posts\/34982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/comments?post=34982"}],"version-history":[{"count":0,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/posts\/34982\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/media\/36030"}],"wp:attachment":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/media?parent=34982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/categories?post=34982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/tags?post=34982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}