with_items ファイルに含まれる jinja2 テンプレートと変数の使用方法

with_items ファイルに含まれる jinja2 テンプレートと変数の使用方法

jinja2テンプレートを使用して構成を構築しようとするとエラーが発生し、変数フィールドは検出されません。これは ansible を使用して、Linux リポジトリをゴールドソースから yum と apt ベースのシステムに同期します。各ストレージ構成は別のファイルに移動し、変数名でジョブを更新します。デフォルトのシステム構成は、属性リストの後に「-」を複数回使用してファイルに入れることができる必要があります。

私はすでに次のようにコメントしました。

jinja2のforループ

https://omarkhawaja.com/accessing-ansible-variables-with-jinja2-loops/

https://stackoverflow.com/questions/25418158/templated-multiple-yum-repo-files-with-ansible-template-module

そして私がしていることとあまり関係のない他のこともあります。

変数ファイル:

---
repo:
  - name: google_chrome
    async: 1
    url: http://dl.google.com/linux/chrome/rpm/stable/x86_6
...

var操作が含まれます:

- name: Include var into the 'chrome' variable.
  include_vars:
    file: google_chrome_repo.yaml
    name: chrome

テンプレートモジュールを使用するタスク:

- name: generate config for Centos
  template:
    src: yum_template.j2
    dest: "/etc/yum.repos.d/{{ item }}.repo"
    backup: yes
  with_items:
    - chrome
  when:
    - ansible_distribution == 'CentOS'

型:

{% for i in item %}
[ {{ i.name }} ]
async = {{ i.async }}
baseurl = {{ i.url }}
enabled = {{ i.repo_enable }}
enablegroups = {{ i.pkggrp_enable }}
failovermethod = {{ i.ha_method }}
gpgkey = {{ i.gpgkey_url }}
http_caching = {{ i.http_caching }}
keepcache = {{ i.keepcache }}
metadata_expire = {{ i.metadata_expire }}
mirrorlist = {{ i.mirrorlist }}
mirrorlist_expire = {{ i.mirrorlist_expire }}
name = {{ i.descrip }}
protect = {{ i.protect }}
proxy = {{ i.proxy_config }}
proxy_password =  {{ i.proxy_username }}
proxy_username = {{ i.proxy_password }}
repo_gpgcheck = {{ i.repo_gpgcheck }}
retries = {{ i.repo_retry_count }}
s3_enabled = {{ i.s3_enabled }}
sslverify = {{ i.ssl_verify }}
timeout = {{ i.timeout }}
{% endfor %}

間違い:

failed: [192.168.33.31] (item=chrome) => {"changed": false, "item": "chrome", "msg": "AnsibleUndefinedVariable: 'unicode object' has no attribute 'name'"}

jinja2テンプレートが最初に呼び出す役割のプロパティに関係なく、この方法は失敗します。以下を変更すると、名前が参照されず、「i.name」が「chrome」になり、非同期が失敗します。

変数をインポートしたことがわかります

ok: [192.168.33.31] => {"ansible_facts": {"chrome": {"repo": [{"async": 1, "descrip": "Google Chrome Repository", "gpgkey_url": "https://dl.google.com/linux/linux_signing_key.pub", "ha_method": "roundrobin", "http_caching": 1, "keepcache": 1, "metadata_expire": 21600, "mirrorlist": null, "mirrorlist_expire": 21600, "name": "google_chrome", "pkggrp_enable": 1, "protect": 0, "proxy_config": "__None__", "proxy_password": null, "proxy_username": null, "repo_enable": 1, "repo_gpgcheck": 1, "repo_retry_count": 10, "s3_enabled": 0, "ssl_verify": 1, "timeout": 1, "url": "http://dl.google.com/linux/chrome/rpm/stable/x86_6"}]}}, "ansible_included_var_files": ["/var/lib/awx/projects/_6__trowe/playbooks/roles/Manage_Linux_Repos/vars/google_chrome_repo.yaml"], "changed": false}

「Unicode」変数と書かれているのを見て、事前であると予想しました。私もwith_dictを試しましたが、変数が辞書ではないというエラーが発生しました。ただし、「repo:」なしで変数ファイルを設定すると、辞書オブジェクトが渡されなかったというエラーが発生します。

ベストアンサー1

私は目標を達成するためのより良い方法を見つけました。

目的:ユーザーがリポジトリ情報を含むvarファイルを生成できるようにします。 1つのファイルに複数のリポジトリが1対1で保存されます。 (CentOSベースのrepoファイルにはさまざまなプロジェクトがありますが、elasticsearch、epelなどは異なるファイルに配置する必要があります。)

  1. {repo}_{pkg_mgr}_repo.ymlという名前のvarファイルを作成します。
  2. 役割のmain.ymlファイルで、{repo}_{pkg_mgr}を含むすべてのファイルを見つけます。repo.ymlファイルまたは*Tower/AWX で渡され、変数に登録された変数に基づく {pkg_mgr}.yml ファイル。 AWX / Towerから渡されたyumとaptに対してこれを行います。
  3. yum または apt repo 構成を生成するジョブに {variable}.files を渡します。
  4. テンプレートモジュールとjinja2テンプレートファイルを使用してrepoファイルを作成し、リモートサーバーに配置します。
  5. タスクを実行して、現在のリポジトリのすべてのgpgキーをインポートしたことを確認してください。

**デフォルトのaptリポジトリはresources.listにあり、他のリポジトリは/etc/apt/sources.list.d/にあることを考慮する必要があります。

これはテストされ、yumベースのディストリビューションで動作し、現在のAPTで動作します。

おすすめ記事