こんにちは、私は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では、Ansibleのlineinfile
モジュールを使用して、特定のファイルに目的の行を追加できます。 OSのドキュメントを参照して、どこに追加して永続的にするかを確認してください。
コメントするのに十分な評判がなかったため、新しい回答を追加しています。
ガゼックの答えは正解です。 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";
これは機能しません、これらのタスクすべてを同じプレイブックに入れている場合
環境変数を永続的に設定するには、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
以下は、/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
は新しい環境変数を表示します。
これが最適なオプションです。 Michal Gasek(最初の回答)が言ったように、プルリクエストがマージされたため( https://github.com/ansible/ansible/pull/8651 )、設定することができます永続的な環境変数プレイレベルごとに簡単に。
- hosts: all
roles:
- php
- nginx
environment:
MY_ENV_VARIABLE: whatever_value