2016-08-05 13 views
0

私はアノプスの環境について知っていますが、プレイブックの一番上にあるコマンドですが、プレイブックを実行する前に変数の値がわからないことがわかりました。私はパッケージのバージョンとPHPモジュールを取得してファイルに記録しようとしています。 regexを使ってバージョンを取得し、それを環境変数に格納したいと思います。次に、その変数をその変数の値と同じようにシェルコマンドで環境ファイルに書きたいと思います。私はまた、環境から配列を引き出し、それをループしたいと思います。 Ansibleはシェル環境を永続させるようには見えず、環境変数はコマンド間で抹消されます。これはBashでは単純です。これは不可能で可能ですか?私は努力しています:不可能なダイナミック環境変数の設定

--- 
- hosts: all 
    become: yes 
    vars: 
     site_variables: 
      code_directory: /home/ 
     dependency_versions: 
      WGET_VERSION: placeholder 
      PHP_MODULES: placeholder 

    tasks: 
    - name: Retrieve Environment 
     shell: export WGET_VERSION=$(wget --version | grep -o 'Wget [0-9]*.[0-9]*\+') 
     shell: export PHP_MODULES=$(php -m) 
     shell: echo "export {{ item }}={{ lookup('env', item) }}" >> {{ site_variables.code_directory }}/.env.log 
     with_items: 
     - WGET_VERSION 


    - name: Write PHP Modules Out 
     shell: export PHP_MODULES=$(php -m) 
     shell: export PHP_MODULES=$(echo {{ lookup('env', 'PHP_MODULES') }} | sed 's/\[PHP Modules\]//g') 
     shell: export PHP_MODULES=$(echo {{ lookup('env', 'PHP_MODULES') }} | sed 's/\[Zend Modules\]//g') 
     shell: export PHP_MODULES=({{ lookup('env', 'PHP_MODULES') }}) 
     shell: echo "# - {{ item.0 }}" >> {{ site_variables.code_directory }}/.env.log 
     with_items: 
     - "{{ lookup('env', 'PHP_MODULES') }}" 

答えて

2

ここにはたくさんのことがあります。あなたはshellモジュールに渡すスクリプトは、リモートサーバー上でを実行している間

まず、lookupは常に、ansible制御ホストを実行します。したがって、lookupを使用してリモート環境変数を取得することはできません。詳細について

https://docs.ansible.com/ansible/playbooks_lookups.html

第二に、環境変数は、子から親に伝達されません。あなたは...

export MYVARIABLE=foo 

...これを行うスクリプトを持っていて、そのスクリプトを実行すると、現在の環境が突然MYVARIABLEという名前の変数を持っていません。これは、あなたのシェルによって生成されたプロセスと同じように、Anipalによって生成されたプロセスでも同様です。

あなたはansible変数を設定したい場合は、値を取得するためにregisterキーワードを使用することを検討してください:私は完全にあなたを以下のよ場合

- hosts: localhost 
    gather_facts: false 
    tasks: 
    - name: get wget version 
     command: wget --version 
     register: wget_version_raw 

    - name: extract wget version 
     set_fact: 
     wget_version: "{{ wget_version_raw.stdout_lines[0].split()[2] }}" 

    - name: show wget version 
     debug: 
     msg: "wget version is: {{ wget_version }}" 
+0

わかりません。私はリモートホストにsshして、手動でWGET_VERSIONを設定しました...そう、WGET_VERSION = 1.1.1としましょう。 {{lookup( 'env'、item)}}は実際に私が手動でセットアップしたremote_hostから環境変数を取得していました(1.1.1)。これはシェルのAnsibleを使って新しい値を設定していないだけです。export WGET_VERSION = $(wget --version | grep -o 'Wget [0-9] *。[0-9] * \ +')私は、最終的に配列全体を通してそれを絶対に必要とするので、これ以上考えてみる必要があるでしょう。多分、Ansibleはこれを行う方法ではないでしょう。 – Nabsta

+0

あなたのアドバイスをいただきありがとうございます!私はAnsibleには新しく、間違いなく役立ちます。 – Nabsta

+0

もう一度ありがとう!私は、set_fact、並列配列のセット、および正規表現をエスケープして動作させました。この場合、ストレートbashのようなものがより適切できれいです。 – Nabsta