web-dev-qa-db-ja.com

Ansibleロールに変数を渡す

私はこれとして私のディレクトリ構造を持っています

└── digitalocean
    ├── README.md
    ├── play.yml
    └── roles
        ├── bootstrap_server
        │   └── tasks
        │       └── main.yml
        ├── create_new_user
        │   └── tasks
        │       └── main.yml
        ├── update
        │   └── tasks
        │       └── main.yml
        └── vimserver
            ├── files
            │   └── vimrc_server
            └── tasks
                └── main.yml

ロールcreate_new_userの下にユーザーを作成するとき、ユーザー名を次のようにハードコーディングしました。

---
- name: Creating a user named username on the specified web server.
  user: 
    name: username
    state: present
    Shell: /bin/bash
    groups: admin
    generate_ssh_key: yes
    ssh_key_bits: 2048
    ssh_key_file: .ssh/id_rsa

- name: Copy .ssh/id_rsa from Host box to the remote box for user username
  become: true
  copy: 
    src: ~/.ssh/id_rsa.pub
    dest: /home/usernmame/.ssh/authorized_keys
    mode: 0600
    owner: username
    group: username

これを解決する1つの方法は、var/main.ymlを作成し、そこにユーザー名を配置することです。しかし、play.ymlレベルでユーザー名を指定できるものが必要でした。ロールvimrcserverのユーザー名も使用しているため。

play.ymlを使用してロールを呼び出しています

---
- hosts: testdroplets
  roles:
    - update
    - bootstrap_server
    - create_new_user
    - vimserver

この場合、テンプレートはここで機能しますか?これらから多くを見つけることができませんでした SOquestions

18
Tasdik Rahman

私はそれをやって

---
- hosts: testdroplets
  roles:
    - update
    - bootstrap_server
    - role: create_new_user
      username: username
    - role: vimserver
      username: username

play.yml

別のアプローチを見てみたいと思いますが、

ドキュメントhttp://docs.ansible.com/ansible/playbooks_roles.html#roles

編集

私は最終的に次のようなディレクトリ構造に落ち着きました

$ tree
.
├── README.md
├── ansible.cfg
├── play.yml
└── roles
    ├── bootstrap_server
    │   └── tasks
    │       └── main.yml
    ├── create_new_user
    │   ├── defaults
    │   │   └── main.yml
    │   └── tasks
    │       └── main.yml
    ├── update
    │   └── tasks
    │       └── main.yml
    └── vimserver
        ├── defaults
        │   └── main.yml
        ├── files
        │   └── vimrc_server
        └── tasks
            └── main.yml

defaults/main.ymlの使用が必要なロール内に{{username}}ファイルを作成する場所

誰かがコードに興味があるなら、

22
Tasdik Rahman

Play.ymlのusernameエントリにvarsを入れることができるはずです。

変数を個別のファイルに分割することもできます。

以下に両方のオプションを示す例を示します。

- hosts: all
  vars:
    favcolor: blue
  vars_files:
    - /vars/external_vars.yml

  tasks:

  - name: this is just a placeholder
    command: /bin/echo foo

https://docs.ansible.com/ansible/playbooks_variables.html#variable-file-separation

Ansibleは、ニースの包括的なリファレンスや、それぞれの異なるアプローチの完全な意味を議論する理論的根拠を持たずに、同じことを行うための異なる方法を持つことを喜ぶようです。上記のことを覚えていなかった場合(vars_filesを完全に忘れていました)、ドキュメントから見つける最も簡単なオプションは、最も洗練された3番目の方法であったかもしれません。

Ansible-examplesには目立った推奨事項があります。 group_varsディレクトリを見ることができます。ファイルには、マジックallグループなど、グループに応じてホストに値を自動的に提供します。 group_varsディレクトリは、プレイブックと同じディレクトリに配置できます。

https://github.com/ansible/ansible-examples/tree/master/lamp_simple

11
sourcejedi

コマンドラインから-eパラメーターを指定して変数を渡すことはできませんか?そのため、実行前であっても変数を指定できます。また、これにより、常に優先順位が最も強い変数宣言が生成されます( Variable precendence を参照)。

プレイブック内に配置する場合は、プレイブックのset_factディレクティブでユーザー名を定義することをお勧めします。この変数は、すべてのロールで使用でき、プレイブックにも含まれています。何かのようなもの:

---
- hosts: testdroplets
  pre_tasks:
    - set_fact:
        username: my_username
  roles:
    - update
    - bootstrap_server
    - create_new_user
    - vimserver
4
L. Tischler

たぶんこれはあなたが望むものですか?

---
- hosts: testdroplets
  roles:
    - update
    - bootstrap_server
    - { role: create_new_user, username: 'foobar' }
    - vimserver

https://docs.ansible.com/ansible/2.5/user_guide/playbooks_reuse_roles.html#using-roles

3
Richard Urban

すべてここにあります: http://docs.ansible.com/ansible/playbooks_variables.html

すでにいくつかの良い答えがありますが、私はこの正確なことをしたので、私は私のものを追加したかったです。

ここに私が書いた役割があります: https://github.com/jmalacho/ansible-examples/tree/master/roles/users

そして、hash_merge = trueとansibleのgroup_varsを使用してユーザーの辞書を作成します:キー、グループ。ホストまたは環境ごとに新しいユーザーを追加し、再実行が簡単です。

また、次のように、チームが環境でグループ変数をどのように使用するかについても書きました: " https://www.coveros.com/ansible-environment-design/ "

0
Jon Malachowski