==
сравнивает ссылки на объекты.
.equals()
сравнивает значения String.
Иногда ==
дает иллюзии сравнения значений String, как в следующих случаях:
String a="Test";
String b="Test";
if(a==b) ===> true
Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:
(a == b) ===> true
String Pool
b -----------------> "test" <-----------------a
Однако ==
не выполняется в следующем случае:
String a="test";
String b=new String("test");
if (a==b) ===> false
В этом случае для new String("test")
оператор new String будет создан в куче, и эта ссылка будет указана на b
, поэтому b
будет дана ссылка на кучу, а не на String pool.
Теперь a
указывает на String в пуле String, а b
указывает на String в куче. Из-за этого мы получаем:
, если (a == b) ===> false.
String Pool
"test" <-------------------- a
Heap
"test" <-------------------- b
Пока .equals()
всегда сравнивает значение String, поэтому дает true в обоих случаях:
String a="Test";
String b="Test";
if(a.equals(b)) ===> true
String a="test";
String b=new String("test");
if(a.equals(b)) ===> true
Таким образом, использование .equals()
всегда лучше.
Существует несколько способов сделать это, и из вашего вопроса это не ясно, что вам нужно.
1. Если вам нужна переменная среды, которая должна быть определена PER TASK ONLY, вы делаете это:
blockquote>- 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
также будет возможно на уровне игры, а не только на уровне задачи, как указано выше. В настоящее время для этой функции в GitHub от Ansible открыт запрос на перенос: https://github.com/ansible/ansible/pull/8651UPDATE: теперь он слит с января 2, 2015 год.
2. Если вам нужна постоянная переменная среды + система в целом / только для определенного пользователя
Вы должны посмотреть, как вы это делаете в своем дистрибутиве / оболочке Linux, для этого есть несколько мест. Например, в Ubuntu вы определяете это в файлах, например:
~/.profile
/etc/environment
/etc/profile.d
directory- ...
Вы найдете здесь документы Ubuntu: https://help.ubuntu.com/community/EnvironmentVariables
В конце концов для установки переменной среды в ex. Ubuntu вы можете просто использовать модуль
lineinfile
от Ansible и добавить нужную строку в определенный файл. Обратитесь к своим документам ОС, чтобы узнать, где их добавить, чтобы сделать их постоянными.
У меня не было достаточной репутации для комментариев, и поэтому я добавляю новый ответ. Ответ Гасека вполне правильный. Только одно: если вы обновляете файл 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 «показать базы данных» дала бы ошибку.
- 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
Для постоянной настройки переменных окружения вы можете использовать одну из существующих ролей в Ansible Galaxy. Я рекомендую franklinkim.environment .
Использование анизотропной галактики:
$ ansible-galaxy install franklinkim.environment
Использование требований.yml:
- src: franklinkim.environment
Затем в вашем плейбуке:
- hosts: all
sudo: yes
roles:
- role: franklinkim.environment
environment_config:
NODE_ENV: staging
DATABASE_NAME: staging