Ansible のロール設定にホスト変数を列挙する方法

Ansible のロール設定にホスト変数を列挙する方法

そこで、私はロールを使用して PostgreSQL サーバーを構成しています。そのロールには、次のようにサーバーのユーザーとデータベースを指定する方法があります。

postgresql_users:
  - name: baz

私のhosts.yaml:

all:
  hosts:
  children:
    django:
      hosts:
        django_1:
          username: django1
          userpass: django1_pass
        django_2:
          username: django2
          userpass: django2_pass
    db:
      hosts:
        db1:

私のplaybook.yaml:

- hosts: db
  become: true
  roles:
    - role: anxs.postgresql

この情報を使ってやりたいことは、すべての Django ホストを取得し、そのユーザー名とユーザーパスの変数を取得することです。

次に、この情報から、手動で記述したかのようにpostgresql_users変数を作成します(関連(望ましい結果) セクション:

db:
  hosts:
    db1:
      postgresql_users:
        - name: django1
          password: django1_pass
          encrypted: true
        - name: django2
          password: django2_pass
          encrypted: true

見つけたこの質問私の問題に対処していますが、残念ながら私は Ansible にあまり詳しくないため、そこで何が提案されているのかを本当に理解できません。

では、postgresql_users 変数を希望どおりに構成する適切な反復を作成するにはどうすればよいでしょうか?

答え1

質問:「すべての Django ホストを取得し、そのユーザー名とユーザーパスワードの変数を取得します。」

A: 最初のプレイで変数を作成し、後で使用することは可能です。例えば

- hosts: all
  tasks:
    - set_fact:
        psql_users: "{{ groups['django']|
                        map('extract', hostvars)|
                        list|
                        json_query('[].{name: username,
                                        password: userpass,
                                        encrypted: `true`}') }}"
      delegate_to: localhost
      run_once: true

- hosts: db
  tasks:
    - debug:
        var: psql_users

与える

ok: [db1] => {
    "psql_users": [
        {
            "encrypted": true, 
            "name": "django1", 
            "password": "django1_pass"
        }, 
        {
            "encrypted": true, 
            "name": "django2", 
            "password": "django2_pass"
        }
    ]
}

インベントリファイルを使用して作成することも可能ですtemplate。たとえば、テンプレートを使用すると

$ cat hosts.j2
db:
  hosts:
    db1:
      postgresql_users:
{{ psql_users|to_nice_yaml|indent(8,true) }}

タスク

- template:
    src: hosts.j2
    dest: hosts2

在庫を作成する

$ cat hosts2
db:
  hosts:
    db1:
      postgresql_users:
        -   encrypted: true
            name: django1
            password: django1_pass
        -   encrypted: true
            name: django2
            password: django2_pass

関連情報