ansibleを実行しているユーザーの名前を持つ変数を取得するにはどうすればよいですか?


80

Ansibleスクリプトを実行しているユーザーの名前(例:tlau)を取得し、そのユーザー名と現在の日時(例:tlau-deploy-2014-10)に基づいてリモートシステム上に展開ディレクトリを作成する展開プロセスのスクリプトを作成しています-15-16:52)。

これはAnsibleファクト(LOGNAMEやSUDO_USERなど)で利用できると思われるかもしれませんが、これらはすべて「root」またはリモートシステムへのsshに使用されているデプロイメントIDのいずれかに設定されています。これらのいずれにも、現在ansibleプロセスを実行しているローカルユーザーは含まれていません。

Ansibleプロセスを実行しているユーザーの名前を取得してプレイブックで使用するスクリプトを作成するにはどうすればよいですか?

回答:


71

ホストシステムのユーザー名を意味する場合、2つのオプションがあります。

ローカルアクション(ターゲットマシンではなくホストマシンで実行される)を実行できます。

- name: get the username running the deploy
  become: false
  local_action: command whoami
  register: username_on_the_host

- debug: var=username_on_the_host

この例では、whoamiコマンドの出力は「username_on_the_host」という変数に登録され、ユーザー名はに含まれusername_on_the_host.stdoutます。

(ここではデバッグタスクは必要ありません。変数の内容を示すだけです)


2番目のオプションは、「ルックアッププラグイン」を使用することです。

{{ lookup('env', 'USER') }}

ここでルックアッププラグインについて読んでください:docs.ansible.com/ansible/playbooks_lookups.html


1
sudo: no実行する前にsudoを試行しないように設定local_action
drs

1
ansible 2.0では、become: noまたはになりbecome: falseます。しかし、そうでなければ良いヒント、ありがとう!
ラモンデラフエンテ2016

回避する方法はありchanged=1ますか?また、ファクト委任を使用できますか?
nponeccop 2016年

確かに使用、そこにあるchange_when: False docs.ansible.com/ansible/...
ラモン・デ・ラ・フエンテ

3
特に、変更変数はchanged_when、ではなくchange_whenです。これで少しだけ。
abegosum 2017年

116

あなたの場合はgather_facts、プレイブックのためにデフォルトで有効になっている、そこにあるビルトイン呼ばセットされている変数ansible_user_idのタスクがとして実行されていること、ユーザー名が提供します。その後、この変数を他のタスクまたはテンプレートで{{ ansible_user_id }}。を使用して使用できます。これにより、その変数を登録するタスクを実行する手間が省けます。

参照:https//docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variables-discovered-from-systems-facts


21
今後の参照のために、これはremote_user、ホストマシンのユーザーではなく、管理対象マシンのユーザーの名前を返します。ホストマシンでユーザー名を取得するために、local_action@ Ramonで説明されているaに代わるものが見つかりません。
astorije 2015年

41
ansibleを実行しているローカルホストでユーザーをルックアップする代わりに、ルックアップを使用することもできます:{{lookup( 'env'、 'USER')}} docs.ansible.com/ansible/playbooks_lookups.html
Budric

10
@Budric私の意見では、これは回答として投稿する必要があります
030

14
ただし{{ansible_user_id}}、次の場合は「ルート」になりますbecome:yes
Stephen Ostermiller 2017

5
Ansible 2.8.3では、。を使用してもrootになることansible_user_idないようですbecome: yes
デビッドオリバー

51

私はすべてのテンプレートに次のようなものを入れました:

# Placed here by {{ lookup('env','USER') }} using Ansible, {{ ansible_date_time.date }}.

テンプレートを作成すると、次のように表示されます。

# Placed here by staylorx using Ansible, 2017-01-11.

私が使用{{ ansible_user_id }}してrootになった場合、その変数は「root」を示し、ほとんどの場合必要なものではありません。


このルックアップは、varsセクションのプレイブックの先頭にある変数に追加することもできます。このように: `` `-hosts:xxx collect_facts:no vars:user:" {{lookup( 'env'、 'USER')}} "` ``
Bludwarf 2017

あなたはJinja2のコメントフィルタとドキュメントに記述されてansible_managed変数を使用することができますdocs.ansible.com/ansible/latest/...(ansible_managedの検索)
dtrv

3

これにより、リモートシステムからユーザー名が読み取られます。これは、ローカルシステムとリモートシステムのユーザー名が同じであることが保証されていないためです。SSH構成で名前を変更することが可能です。

- name: Run whoami without become.
  command: whoami
  changed_when: false
  become: false
  register: whoami

- name: Set a fact with the user name.
  set_fact:
    login_user: "{{ whoami.stdout }}"

0

Ansible Towerでテンプレートを実行するユーザーを取得したい場合は、プレイブックでこのvar {{tower_user_name}}を使用できますが、手動で実行する場合にのみ定義されます。

Tower_user_name:このジョブを開始したTowerユーザーのユーザー名。これは、コールバックまたはスケジュールされたジョブでは使用できません。

このドキュメントを確認してくださいhttps://docs.ansible.com/ansible-tower/latest/html/userguide/job_templates.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.