実行中の現在のansible-playbookへのパスを持つ変数?


109

実行中の現在のansible-playbookへの絶対パスを持つansible変数はありますか?

いくつかのコンテキスト:localhost mysql docker を構成するためにansibleスクリプトを実行/作成していて、ansibleスクリプトに関連するデータボリュームをマウントしたいと考えています。

たとえば、リポジトリをチェックアウトしてから~/branch1/実行するansible-playbook dev.ymlと、ボリュームをに保存する必要があると思っていました~/branch1/.docker_volume/~/branch2それから実行した場合は、ボリュームをに構成する必要があります~/branch2/.docker_volume/


2
考えもしなかった興味深い質問。しかし、あなたがそれを求めているという事実は、あなたが非常に間違った方法で何かをしているかもしれないという指標です。
Antonis Christofides 2015年

私は同意します、@ AntonisChristofidesを詳しく説明します
Josh Unger

回答:


192

playbook_dir変数を使用できます。


2
私は同様の問題に直面しており、あなたの答えはそれを解決しました。ありがとう。しかし、playbook_dir変数が文書化されている場所は見つかりませんでした。ドキュメントを教えていただけませんか。または、この変数についてどのようにして知りましたか?
slayedbylucifer

3
:私はそれがansibleコードで見つけるgithub.com/ansible/ansible/blob/...
セヴァPoliakov

2
また、すべての変数を含む興味深いリポジトリgithub.com/lorin/ansible-quickrefもあります。
Seva Poliakov

46

あなたが望むものを正確に保持する変数はないようです。

ただし、ドキュメントの引用:

また、inventory_dirAnsibleのインベントリホストファイルを保持するディレクトリのパス名、Ansibleのインベントリホストファイルをinventory_file指すパス名とファイル名も使用できます。

playbook_dirには、プレイブックのベースディレクトリが含まれています。

最後に、role_path現在のロールのパス名を返します(1.8以降)。これはロール内でのみ機能します。

設定によっては、これらまたは$ pwdベースのソリューションで十分な場合があります。


2

残念ながらありません。実際、Ansibleの実行方法のコンテキストでは、絶対パスは少し意味がありません(そして混乱する可能性があります)。簡単に言えば、プレイブックを呼び出すと、タスクごとに、Ansibleがタスクに関連付けられたモジュールをターゲットマシンの一時ディレクトリに物理的にコピーし、必要なパラメーターを指定してモジュールを呼び出します。したがって、ターゲットマシン上の絶対パスは、その中にいくつかの一時ファイルのみが含まれる一時ディレクトリであり、完全なプレイブックも含まれていません。また、Ansibleサーバー上のファイルの完全パスを知っていることは、ターゲット上のAnsibleディレクトリツリー全体を複製しているのでない限り、ターゲットマシンではほとんど役に立ちません。

Ansibleで定義されているすべての変数を表示するには、次のコマンドを実行するだけです。

$ ansible -m setup hostname

プレイブックへの絶対パスを知る必要があると思う理由は何ですか?


ブルースのおかげで、自分のやろうとしていることを詳しく説明するために質問を修正しました。
Josh Unger、2015年

6
絶対ローカルパスはまったく意味がありません。たとえば、ローカルコマンドを実行したり、ansible構成に直接含めることができない他のローカルファイルやサービスをクエリしたりするために使用できます。ansibleがlocal_actionモジュールを持っているという単なる事実は、これには正当なユースケースがあることを意味します。
Cray

1

私はこのようなプレイブックを使用して自分の役割をローカルでテストしていました:

---
- hosts: localhost
  roles:
     - role: .

しかし、これはAnsible v2.2では機能しなくなりました。

私は前述のソリューションをデバッグしました

---
- hosts: all
  tasks:
    - name: Find out playbooks path
      shell: pwd
      register: playbook_path_output
    - debug: var=playbook_path_output.stdout

そして、「現在の作業ディレクトリ」ではなく、私のホームディレクトリを生成しました。

私はと和解しました

---
- hosts: all
  roles:
    - role: '{{playbook_dir}}'

上記のソリューションごとに。


1

この目的のための組み込み変数はありませんが、「pwd」コマンドを使用してプレイブックの絶対パスを常に見つけ、その出力を変数に登録できます。

- name: Find out playbook's path
  shell: pwd
  register: playbook_path_output
- debug: var=playbook_path_output.stdout

これで、パスは変数playbook_path_output.stdoutで使用可能になります


7
この場合pwd、プレイブックスクリプトのパスは返されません。プロセスの現在のディレクトリを返します(通常はansible-playbook)。2つは同じである必要はなく、ansibleが呼び出された正確な方法に依存します。
クレイ、

5
@Crayは正しいです。いずれにしても、Ansibleがすでにこの変数を用意していることをお伝えしたいと思いますdebug: var=ansible_env.PWD(これによりansible-playbook、ローカルマシンで実行したディレクトリとリモートサーバーのホームディレクトリが得られます)
NS du Toit

4
また、現在のディレクトリがで見つけることができます:{{ lookup('env','PWD') }}
isedwards
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.