web-dev-qa-db-ja.com

ロールのansible事前タスクを指定する方法は?

ロールの依存関係の事前タスクを定義するにはどうすればよいですか。私は現在、ユーザー変数を持つApacheロールを持っているので、<role>/meta/main.ymlでの自分のロールで、次のようなことをします。

---
dependencies:
  - { role: Apache, user: proxy }

この時点での問題は、指定したユーザーがまだ存在せず、ロールが存在しないユーザーの下でApacheサーバーを起動しようとするとエラーが発生することです。

<role>/tasks/main.ymlのようなタスクを作成してみました:

---
- user: name=proxy

ただし、ユーザーは、依存関係でApacheタスクを実行した後にのみ作成されます(これは予想されることです)。では、依存関係でロールを実行する前にユーザーを作成するタスクを作成する方法はありますか?

42
Kęstutis

pre_tasksを使用して、ロールの前にいくつかのタスクを実行します。 Kashyap に感謝します。

#!/usr/bin/env ansible-playbook

---
- hosts: all
  become: true
  pre_tasks:
    - name: start tasks and sent notifiaction to HipChat
      hipchat:
        color: purple
        token: "{{ hipchat_token }}"
        room: "{{ hipchat_room }}"
        msg: "[Start] Run 'foo/setup.yml' playbook on {{ ansible_nodename }}."

  roles:
    - chusiang.vim-and-vi-mode

  vars:
    ...

  tasks:
    - name: include main task
      include: tasks/main.yml

  post_tasks:
    - name: finish tasks and sent notifiaction to HipChat
      hipchat:
        color: green
        token: "{{ hipchat_token }}"
        room: "{{ hipchat_room }}"
        msg: "[Finish] Run 'foo/setup.yml' playbook on {{ ansible_nodename }}."

# vim:ft=ansible :
27
Chu-Siang Lai

簡単な答え:言語でpre_tasksをロールに指定することは許可されていないと思います。

ユーザーの作成を別のプレイブックに移動し、includeの代わりにroleをプレイすると、チート/回避策を実行できます。このようなもの:

my_fake_role_playbooks/user_and_Apache.yml:

- hosts: "{{p_hosts}}"
  pre_tasks:
    user: name=proxy
  roles: [ Apache ]

actual_playbook.yml:

- include: my_fake_role_playbooks/user_and_Apache.yml p_hosts=[Host1, Host2]

*コードはテストされていません。

HTH

10
Kashyap

名前のない<role>またはApacheロールの別の依存関係を使用して、これを簡単に解決できます。

新しいプロキシユーザーロールのコンテンツ全体:

---
- user: name=proxy
...

次に、roles/Apache/meta/main.ymlに依存関係を追加します。

---
dependencies:
  - proxy-user
...

またはroles/<role>/meta/main.ymlで設定します:

---
dependencies:
  - proxy-user
  - { role: Apache, user: proxy }
...
10
udondan

Ansible 2.2では、include_roleを使用できます。 https://docs.ansible.com/ansible/include_role_module.html

- user: name=proxy

- include_role:
    name: Apache
  vars:
    user: proxy
8
kimamula

問題に対処しなければならなかったのですが、実際の問題は、事前タスクが役割よりも多少具体的である可能性が高いことです。ポストタスクを行うのは簡単です。なぜなら、単に新しいロールを依存関係にするだけだからです。これは「ラッパーロール」として知られています...または少なくとも、シェフのアイデアと呼ばれるものです。

事前タスクでは、「ラッパーロール」と私が「兄弟ロール」と呼ぶものを使用して、階層を少し変更する必要があります。したがって、依存関係ロジックは次のように表示されます。

  • ラッパーロール
    • 兄弟の役割
    • 元の役割

ラッパーには2つの依存関係がありますが、依存関係リストの最初に「兄弟ロール」を追加してください。 Ansibleは上から下に行くので。

最後に、変数をplaybookから上書きできるように、ラッパーロールに変数を配置する必要があります。変数を可能な限り階層に従い、兄弟間でジャンプしないようにします。

6
J. M. Becker

同様のニーズがあり、ロールvarsで変数を定義することで解決しました。つまり、<role>/vars/main.ymlを作成するには

---
user: proxy

これは、Apacheモジュールで定義されたuser変数をオーバーライドする必要がありますが、モジュールdefaultsディレクトリに書き込むことはできません。

私はansible 1.9を使用していますが、この動作がどのくらい続いているかはわかりません。

1
Javier Palacios