GNU/Linux >> Linux の 問題 >  >> Linux

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

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

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

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

<強い>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 のドキュメントを参照して、永続化するために追加する場所を確認してください。


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

- name: populate /etc/environment
  lineinfile:


    path: "/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 でした のように:

    dest: "/etc/environment"

しかし、コメントを参照してください

タスクのみ:インライン化は、時々動作します .

——————-

注:以下の内容は、推奨というよりも観察/実験です。——————-

最初のタスクは、Michael のトップ投票の回答に相当します。

2 番目は機能しませんが、もう一度 foo=1 echo $foo bash でも動作しません (これは echo が原因だと思われます) 組み込みです)。

3 つ目は機能します 、bash の場合と同様に、ほとんど手間がかかりません。 しかし... これを実行してノード変数を設定しようとしたとき、Michael の回答を使用するまで惨めに失敗しました。

  tasks:
    - name: Echo my_env_var
      shell: "echo $MY_ENV_VARIABLE"
      environment:
        MY_ENV_VARIABLE: value1  

    - name: Echo my_env_var inline, doesnt work in bash either
      shell: "MY_ENV_VARIABLE=value2 echo $MY_ENV_VARIABLE"

    - name: set my_env_var inline then env
      shell: "MY_ENV_VARIABLE=value3 env | egrep MY_ENV"


出力:

TASK [Echo my_env_var] *********************************************************
changed: [192.168.63.253] => changed=true 
  cmd: echo $MY_ENV_VARIABLE
  stdout: value1

TASK [Echo my_env_var inline, doesnt work in bash either] **********************
changed: [192.168.63.253] => changed=true 
  cmd: MY_ENV_VARIABLE=value2 echo $MY_ENV_VARIABLE
  stdout: ''

TASK [set my_env_var inline then env] ******************************************
changed: [192.168.63.253] => changed=true 
  cmd: MY_ENV_VARIABLE=value3 env | egrep MY_ENV
  stdout: MY_ENV_VARIABLE=value3

コメントするのに十分な評判がなかったため、新しい回答を追加しています。
Gasekの答えはかなり正しいです。 1 つだけ:.bash_profile を更新している場合 ファイルまたは /etc/profile 、これらの変更は、新しいログインを行った後にのみ反映されます。環境変数を設定し、同じ Playbook の後続のタスクで使用する場合は、それらの環境変数を .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";

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


Linux
  1. Linuxでローカル、ユーザー、およびシステム全体の環境変数を設定および設定解除する方法

  2. Linuxで環境変数とシェル変数を設定/作成する方法

  3. Linux エクスポート コマンドの例 (環境変数の設定方法)

  1. Ansibleを使用してPrometheusでシステム監視を設定する方法

  2. Linux でスペースを使用して環境変数を設定する

  3. 明らかに隠された環境変数を出力するには?

  1. Linux環境変数:LinuxVPSでの読み取りと設定の方法

  2. Linux で環境変数を設定、一覧表示、および削除する方法

  3. Linux での「su」および「sudo」によるユーザー環境変数