Как установить переменную среды для java в centos с помощью доступной playbook [duplicate]

== сравнивает ссылки на объекты.

.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() всегда лучше.

48
задан Michal Gasek 26 October 2017 в 15:12
поделиться

3 ответа

Существует несколько способов сделать это, и из вашего вопроса это не ясно, что вам нужно.

1. Если вам нужна переменная среды, которая должна быть определена PER TASK ONLY, вы делаете это:

- 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/8651

UPDATE: теперь он слит с января 2, 2015 год.

2. Если вам нужна постоянная переменная среды + система в целом / только для определенного пользователя

Вы должны посмотреть, как вы это делаете в своем дистрибутиве / оболочке Linux, для этого есть несколько мест. Например, в Ubuntu вы определяете это в файлах, например:

  • ~/.profile
  • /etc/environment
  • /etc/profile.d directory
  • ...

Вы найдете здесь документы Ubuntu: https://help.ubuntu.com/community/EnvironmentVariables

В конце концов для установки переменной среды в ex. Ubuntu вы можете просто использовать модуль lineinfile от Ansible и добавить нужную строку в определенный файл. Обратитесь к своим документам ОС, чтобы узнать, где их добавить, чтобы сделать их постоянными.

87
ответ дан Michal Gasek 16 August 2018 в 10:45
поделиться
  • 1
    Второй вариант - это то, что мне нужно. Я сам пришел к решению, но это единственное. – Gleeb 4 January 2015 в 10:54
  • 2
    Быстрое обновление: запрос Pull # 8651 для Ansible был объединен, так что теперь это можно сделать и на уровне игры. – Michal Gasek 24 January 2015 в 15:17
  • 3
    Таким образом, невозможно установить постоянные переменные среды через Ansible? – garbagecollector 20 May 2015 в 21:50
  • 4
    @DumpHole Я использовал роль & quot; franklinkim.environment & quot; от Ansible Galaxy для этого. – Ates Goral 22 April 2016 в 17:19
  • 5
    Это НЕ работает для меня при настройке существующей переменной среды Linux (RHEL7.2), например, PATH – Chris F 25 October 2017 в 15:46

У меня не было достаточной репутации для комментариев, и поэтому я добавляю новый ответ. Ответ Гасека вполне правильный. Только одно: если вы обновляете файл 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

16
ответ дан gaurav parashar 16 August 2018 в 10:45
поделиться

Для постоянной настройки переменных окружения вы можете использовать одну из существующих ролей в 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
7
ответ дан RichVel 16 August 2018 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: