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が新しいセッションに入るようにするためですが、パスワードを入力する必要があり、タスクで直接行う方法がないと思うので、これはおそらく失敗します。
これを非ハッキーな方法で解決する方法についてのアイデアはありますか?これは非常にまれなユースケースであり、これを解決する標準的な方法がないとは信じられません。たぶん私は何かを見落としているだけです。
うまくいくかどうかはわかりませんが、reset_connectionを追加してみることをお勧めします。
- name: reset ssh connection
meta: reset_connection
ここに例があります。
これをハンドラーとして追加し、ユーザー/グループの変更タスクから通知することができます。次に、meta: flush_handlers
したがって、接続は必要な場合にのみリセットされます。