こんにちは、Ansibleで環境変数を設定する方法を見つけようとしています。
このような単純なシェルコマンド:
EXPORT LC_ALL=C
シェルコマンドとして試してみましたが、環境モジュールを使用してエラーが発生し、何も起こりませんでした。
私は何が欠けていますか
こんにちは、Ansibleで環境変数を設定する方法を見つけようとしています。
このような単純なシェルコマンド:
EXPORT LC_ALL=C
シェルコマンドとして試してみましたが、環境モジュールを使用してエラーが発生し、何も起こりませんでした。
私は何が欠けていますか
回答:
これを行うにはいくつかの方法があり、あなたの質問からそれはあなたが何を必要としているのか明確ではありません。
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のドキュメントを調べて、永続化するために追加する場所を確認してください。
私はコメントするのに十分な評判がなかったので、新しい答えを追加しています。
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";
同じプレイブックにこれらすべてのタスクがある場合、これは機能しません。
source file
DO. file
キー/値を永続的に設定するための簡単なローカルタスクを次に示します/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
、新しい環境変数が表示されます。
環境変数を永続的に設定するには、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
これが最良の選択肢です。Michal Gasek(最初の回答)で述べたように、プルリクエストがマージされたため(https://github.com/ansible/ansible/pull/8651)、永続的な環境変数をプレイレベルで簡単に設定できます。
- hosts: all
roles:
- php
- nginx
environment:
MY_ENV_VARIABLE: whatever_value