これが最良の選択肢です。 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 にある場合。