AnsibleでLinux環境変数を設定する方法


95

こんにちは、Ansibleで環境変数を設定する方法を見つけようとしています。

このような単純なシェルコマンド:

EXPORT LC_ALL=C

シェルコマンドとして試してみましたが、環境モジュールを使用してエラーが発生し、何も起こりませんでした。

私は何が欠けていますか


1
特定のアカウント($ HOME / .profile、デフォルト(/ etc / profile))で設定する必要がありますか、それともアプリケーションをインストールまたは実行する前に使用可能にするだけですか?
BMW

mongodbコンソールを使用できるように設定する必要があります。マシンを上げた後、この変数をエクスポートしないとコンソールに入ることができません
Gleeb

わかりました、mongodbモジュールについてansibleで話しているので、そのモジュールを準備するとき(インストール、構成ファイルの設定、またはサービスの開始)に直接モジュールを配置しないのはなぜですか?
BMW

1
環境変数の設定は、mongodbモジュールとどのように関係していますか。そして、私はそれをまったく使用しませんでした。mongoをインストールして環境変数を設定し、サービスを開始するだけです
Gleeb

mongodbモジュールの準備ができていませんでしたか?それからあなたは最初にそれに時間を費やす必要があります、そしてあなたの問題は問題ではありません。
BMW

回答:


157

これを行うにはいくつかの方法があり、あなたの質問からそれはあなたが何を必要としているのか明確ではありません。

1.環境変数をタスクごとにのみ定義する必要がある場合は、次のようにします。

- hosts: dev
  tasks:
    - name: Echo my_env_var
      shell: "echo $MY_ENV_VARIABLE"
      environment:
        MY_ENV_VARIABLE: whatever_value

    - name: Echo my_env_var again
      shell: "echo $MY_ENV_VARIABLE"

MY_ENV_VARIABLEは最初のタスクでのみ使用可能でありenvironment、システムに永続的に設定するわけではないことに注意してください。

TASK: [Echo my_env_var] ******************************************************* 
changed: [192.168.111.222] => {"changed": true, "cmd": "echo $MY_ENV_VARIABLE", ... "stdout": "whatever_value"}

TASK: [Echo my_env_var again] ************************************************* 
changed: [192.168.111.222] => {"changed": true, "cmd": "echo $MY_ENV_VARIABLE", ... "stdout": ""}

上記のタスクレベルだけでなく、プレイレベルenvironmentもすぐに使用できることを願っています。現在、AnsibleのGitHub:https : //github.com/ansible/ansible/pull/8651で、この機能のプルリクエストが開かれています

更新:2015年1月2日の時点で統合されました。

2.永続的な環境変数+システム全体/特定のユーザーのみが必要な場合

Linuxディストリビューション/シェルでそれをどのように行うかを検討する必要があります。そのための場所は複数あります。たとえばUbuntuでは、次のようなファイルで定義します。

  • ~/.profile
  • /etc/environment
  • /etc/profile.d ディレクトリ
  • ...

Ubuntuのドキュメントについては、https//help.ubuntu.com/community/EnvironmentVariablesをご覧ください。

結局のところ、exで環境変数を設定するためです。Ubuntuではlineinfile、Ansibleのモジュールを使用して、特定のファイルに必要な行を追加できます。OSのドキュメントを調べて、永続化するために追加する場所を確認してください。


6
2番目のオプションは私が必要なものです。私は自分で解決策に到達しましたが、それが解決策です。
Gleeb

2
クイックアップデート:Ansibleのプルリクエスト#8651がマージされたため、これをプレイレベルでも実行できるようになりました。
Michal Gasek、2015年

8
それで、Ansibleを通じて永続的な環境変数を設定する方法はありませんか?
garbagecollector 2015年

1
@DumpHoleそのために、Ansible Galaxyの「franklinkim.environment」の役割を使用しました。
Ates Goral

1
現在のbashシェルのみに環境変数を設定したい場合はどうなりますか?たとえば、復号化されたパスワードがこのように使用される可能性があります。
openCivilization

28

私はコメントするのに十分な評判がなかったので、新しい答えを追加しています。
Gasekの答えはかなり正しいです。ただ1つのこと:.bash_profileファイルまたはを更新する場合/etc/profile、それらの変更は、新しいログインを行った後にのみ反映されます。env変数を設定して、同じプレイブックの後続のタスクでそれを使用する場合は、それらの環境変数を.bashrcファイルに追加することを検討してください。
この背後にある理由は、ログインシェルと非ログインシェルにあると思います。
Ansibleは、さまざまなタスクの実行中.bashrcに、.bash_profileまたはの代わりにファイルからパラメーターを読み取ります/etc/profile

例として、パス変数を更新して.bash_profile、それぞれのユーザーのファイルにカスタムバイナリを含め、ファイルのソースを作成したとします。次の後続のタスクは私のコマンドを認識しません。ただし、.bashrcファイルを更新した場合、コマンドは機能します。

 - name: Adding the path in the bashrc files
   lineinfile: dest=/root/.bashrc line='export PATH=$PATH:path-to-mysql/bin' insertafter='EOF' regexp='export PATH=\$PATH:path-to-mysql/bin' state=present
 
-  - name: Source the bashrc file
   shell: source /root/.bashrc

 - name: Start the mysql client
   shell: mysql -e "show databases";

これは動作します私は、プロファイルファイル使用して、それを行っていたmysql -e "show databases"エラーを与えているだろう。

- name: Adding the path in the Profile files
   lineinfile: dest=/root/.bash_profile line='export PATH=$PATH:{{install_path}}/{{mysql_folder_name}}/bin' insertafter='EOF' regexp='export PATH=\$PATH:{{install_path}}/{{mysql_folder_name}}/bin' state=present

 - name: Source the bash_profile file
   shell: source /root/.bash_profile

 - name: Start the mysql client
   shell: mysql -e "show databases";

同じプレイブックにこれらすべてのタスクがある場合これは機能しません


2
デフォルトのシェルがshの場合、ソースが機能しない可能性があります。代わりのsource fileDO. file
Cloverr

12

キー/値を永続的に設定するための簡単なローカルタスクを次に示します/etc/environment(システム全体、すべてのユーザー)。

- name: populate /etc/environment
  lineinfile:
    dest: "/etc/environment"
    state: present
    regexp: "^{{ item.key }}="
    line: "{{ item.key }}={{ item.value}}"
  with_items: "{{ os_environment }}"

そしてそれの変数:

os_environment:
  - key: DJANGO_SETTINGS_MODULE 
    value : websec.prod_settings  
  - key: DJANGO_SUPER_USER 
    value : admin

そして、はい、sshを実行して再度実行するとenv、新しい環境変数が表示されます。


destに置き換えられましたがpathドキュメントによるとまだ機能するはずです。そうでない場合は、に切り替えpathます。
guessimtoolate

9

環境変数を永続的に設定するには、Ansible Galaxyで既存の役割の1つを使用できます。私はweareinteractive.environmentをお勧めします

ansible-galaxyの使用:

$ ansible-galaxy install weareinteractive.environment

requirements.ymlの使用:

- src: franklinkim.environment

次に、プレイブックで:

- hosts: all
  sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging

@openCivilization更新しました!
Ates Goral

注:weareinteractive.environmentは/ etc / environmentに書き込みます
simohe

5

これが最良の選択肢です。Michal Gasek(最初の回答)で述べたように、プルリクエストがマージされたため(https://github.com/ansible/ansible/pull/8651)、永続的な環境変数をプレイレベルで簡単に設定できます。

- hosts: all
  roles:
     - php
     - nginx
  environment:
    MY_ENV_VARIABLE: whatever_value

2
役割の前に環境が実行されていますか?私のルックアップはまだ空だからです。
EvgenyKolyakov

私の検索でさえ、順序に関係なく空です
AhmFM '7/10/19

これに関する唯一の警告は、プレイブックが実行される前に、プレイブックレベルの環境が解決されることです。これは、すべての値を事前に知っている場合に役立ちますが、動的に値を追加する場合は、JL Peyretの回答
Bubzsan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.