web-dev-qa-db-ja.com

Ansibleを使用して環境変数を設定する方法

Java_HOMEなどの変数を設定し、PATHを更新する必要があります。これを行うには多くの方法があります。 1つの方法は、/etc/environment変数を更新し、 lineinfile モジュールを使用してJava_HOMEの行を含めてから、ゲストOSでコマンドソース/etc/environmentを直接実行することです(私の場合はCentOS)。

別の方法は、エクスポートコマンドを実行することです.

export Java_HOME=/usr/Java/jre1.8.0_51
export PATH=$PATH:$Java_HOME

これらをすべて実行するには、環境変数を更新するためにOSでファイルを操作し、コマンドを直接実行する必要があるため、よりクリーンな方法がありますか?

29
Deepak Shenoy

はい、よりクリーンな方法があります。タスクごとに環境変数を設定できます。

  tasks:
  - Shell: echo Java_HOME is $Java_HOME
    environment:
      Java_HOME: /usr/Java/jre1.8.0_51
    register: shellout
  - debug: var=shellout

出力:

TASK: [Shell echo Java_HOME is $Java_HOME] ********************************** 
changed: [localhost]

TASK: [debug var=shellout] **************************************************** 
ok: [localhost] => {
    "var": {
        "shellout": {
            "changed": true, 
            "cmd": "echo Java_HOME is \"$Java_HOME\"", 
            "delta": "0:00:00.005797", 
            "end": "2015-08-07 06:32:47.295061", 
            "invocation": {
                "module_args": "echo Java_HOME is \"$Java_HOME\"", 
                "module_name": "Shell"
            }, 
            "rc": 0, 
            "start": "2015-08-07 06:32:47.289264", 
            "stderr": "", 
            "stdout": "Java_HOME is /usr/Java/jre1.8.0_51", 
            "stdout_lines": [
                "Java_HOME is /usr/Java/jre1.8.0_51"
            ], 
            "warnings": []
        }
    }
}

タスクで上記のような環境変数を設定した場合、この特定のタスクでのみ使用できます。後続のタスクでは、再度定義しない限り存在しません。

プレイごとにenv変数も定義できますが:

- hosts:
  - localhost
  gather_facts: no
  environment:
    Java_HOME: /usr/Java/jre1.8.0_51
  tasks:
     ...

これで、このプレイのすべてのタスクで使用できるようになります。

環境の設定 および FAQ:タスクまたはプレイブック全体のPATHまたはその他の環境変数を設定するにはどうすればよいですか? を参照してください。


スクリプトタスクの別の例:

  tasks:
  - script: /tmp/script.sh
    environment:
      Java_HOME: /usr/Java/jre1.8.0_51
    register: shellout
  - debug: var=shellout

スクリプトが単にこのコンテンツを持っている場合:

#!/bin/sh

echo Java_HOME is $Java_HOME
25
udondan

これを行う回避策は、Ansibleで lineinfile コマンドを使用することであることがわかりました。

- name: Set Java_HOME
  lineinfile: dest=/etc/environment state=present regexp='^Java_HOME' >
     line='Java_HOME=/opt/jre1.8.0_51/bin'

これは理想的ではありませんが、新しい環境変数を作成できます。もちろん、変数を使用してディレクトリパスを作成する必要があります。例を簡単にするために、明示的なパスを含めました。

19
Deepak Shenoy

Lineinfileアプローチを更新します。 Java_HOME値にはbinディレクトリを含めないでください。以下はcentosで機能しました:

- name: Set Java_HOME
  lineinfile:
    dest: /etc/environment
    state: present
    regexp: '^Java_HOME'
    line: 'Java_HOME=/usr/lib/jvm/Java-1.8.0-openjdk'
4
glennop