web-dev-qa-db-ja.com

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

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

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

EXPORT LC_ALL=C

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

私は何が欠けています

75
Gleeb

これを行うには複数の方法があり、あなたの質問から何が必要なのか明確ではありません。

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では、Ansibleのlineinfileモジュールを使用して、特定のファイルに目的の行を追加できます。 OSのドキュメントを参照して、どこに追加して永続的にするかを確認してください。

123
Michal Gasek

コメントするのに十分な評判がなかったため、新しい回答を追加しています。
ガゼックの答えは正解です。 1つだけ、.bash_profileファイルまたは/etc/profileを更新する場合、それらの変更は新しいログインを行った後にのみ反映されます。場合によっては、env変数を設定してから、同じプレイブックの後続のタスクで使用する必要があります。これらの環境変数を.bashrcファイルに追加することを検討してください。
この背後にある理由は、ログインシェルと非ログインシェルだと思います。
別のタスクを実行中に、.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";

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

24
gaurav parashar

環境変数を永続的に設定するには、Ansible Galaxyで既存のロールのいずれかを使用できます。 franklinkim.environment をお勧めします。

Ansible-galaxyの使用:

$ ansible-galaxy install franklinkim.environment

Requirements.ymlの使用:

- src: franklinkim.environment

次に、プレイブックで:

- hosts: all
  Sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging
10
Ates Goral

以下は、/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は新しい環境変数を表示します。

4
JL Peyret

これが最適なオプションです。 Michal Gasek(最初の回答)が言ったように、プルリクエストがマージされたため( https://github.com/ansible/ansible/pull/8651 )、設定することができます永続的な環境変数プレイレベルごとに簡単に。

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