web-dev-qa-db-ja.com

Ansibleが強制的にログオフしてユーザーグループを更新する

AnsibleとDockerでサーバーをセットアップしています。私は現在両方のテクノロジーを学んでいるので、私がここであまりにも愚かである場合は、ご容赦ください。

Dockerコマンドの実行を実行するには、ユーザーはdockerユーザーグループに属している必要があります。だから私はこれをやっています:

-   name: Ensure group "docker" exists
    become: yes
    group:
        name: docker
    state: present

-   name: Add ansible user to docker group
    become: yes
    user:
        name: "{{ansible_user}}"
        groups: docker
        append: yes

後のプレイ(ただし同じプレイブック)では、次のようにします。

-   name: build
    command: docker-compose build --pull
    args:
        chdir: /docker

-   name: start services
    command: docker-compose -f docker-compose.yml up -d
    args:
        chdir: /docker

これは最初の実行では機能しません。 「ビルド」タスクは常に失敗し、Dockerが見つからない(これはアクセス権がないため)と不平を言います。 {{ansible_user}}として手動でログインすると、Dockerを正常に実行でき、十分に待機すると(Ansibleが新しいSSHセッションを開くように)、プレイブックも正常に機能し、信じられます{{ansible_user}}は、AnsibleがプレイブックのすべてのタスクにSSHセッションを再利用しているため、まだ新しいグループをピックアップしていません。

だから私は何をすべきですか?私も試しました

-   name: build
    become: yes
    become_user: "{{ansible_user}}"
    become_method: su
    command: docker-compose build --pull
    args:
        chdir: /docker

ansibleが新しいセッションに入るようにするためですが、パスワードを入力する必要があり、タスクで直接行う方法がないと思うので、これはおそらく失敗します。

これを非ハッキーな方法で解決する方法についてのアイデアはありますか?これは非常にまれなユースケースであり、これを解決する標準的な方法がないとは信じられません。たぶん私は何かを見落としているだけです。

3
MadMonkey

うまくいくかどうかはわかりませんが、reset_connectionを追加してみることをお勧めします。

- name: reset ssh connection
  meta: reset_connection

ここに例があります。

これをハンドラーとして追加し、ユーザー/グループの変更タスクから通知することができます。次に、meta: flush_handlersしたがって、接続は必要な場合にのみリセットされます。

5
Zoredache