Где я могу поместить общую переменную вне playbook в ansible - PullRequest
0 голосов
/ 18 мая 2018

Я использую playboooks для запуска своих модулей.У меня есть сомнение, могу ли я разместить свои общие переменные вне playbook по следующим причинам

  1. Причина безопасности, такая как имя пользователя и пароль
  2. Чтобы уменьшить повторяющийся код, используя глобальную переменную вобщее место и местонахождение playbook.

Прямо сейчас мой playbook выглядит следующим образом:

      - hosts: localhost
        tasks:
          - name: Get all Storage Service Levels
            StorageServiceLevelModule: host=<ip> port=<port> user=admin password=<password>
               action=get name='my_ssl'
            register: jsonResultforSSLs

          - name: print the SSL key
            debug: msg="{{ jsonResultforSSLs.meta.result.records[0].key}}"


          - name: Get all Storage VMs
            StorageVMModule: host=<ip> port=<port> user=admin password=<password>
               action=get name=my_svm
            register: jsonResultforSVMs

Я хочу поместить

   host=<ip> port=<port> user=admin password=<password> 

за пределами playbookи использовать его во всех заданиях моих пьес.Как я могу это сделать?

Пожалуйста, дайте мне знать, если требуется какое-либо разъяснение.

Ответы [ 4 ]

0 голосов
/ 21 мая 2018

Ко второму Винни -

Роли.Роли, роли, роли.

Структура ролей по умолчанию включает в себя каталог defaults, в котором можно определить значения по умолчанию в defaults/main.yml.Это самый низкий приоритет, который вы можете использовать, поэтому он мне больше нравится, чем vars/main.yml, для установки разумных значений, которые можно легко переопределить во время выполнения, но если вы выбираете согласованную структуру, то вы хороши.

Мне лично не нравится идея «общей» роли только для переменных, которые все используют, но если ваш дизайн хорошо с этим работает, вы должны быть уверены, что перед всеми именами переменных стоит префикс «виртуальное пространство имен»строки.например, не называйте это repo, называйте это common_git_repo или common_artifactory, или что-то более конкретное, если можете.

Как только вы включите эту роль в книгу игр, убедитесь, что файл по умолчаниюстатически загружается перед вызовом значений, но если это так, вам не нужно сильно беспокоиться об этом.Просто используйте {{ common_git_repo }} там, где вам это нужно.Это будет там ... именно поэтому вы хотите использовать виртуальное пространство имен, чтобы избежать коллизий с эффективно глобальными именами.

Когда вам нужно переопределить значения, вы можете настроить их соответствующим образом.Мы записываем специфичные для playbook переопределения значений по умолчанию для ролей в разделе vars: playbook, а затем динамически записываем переопределения в последнюю минуту в файл Custom.yml, который загружается в раздел vars_files:.Следите за своей безопасностью, но она очень гибкая.

Мы также записываем переменные прямо в инвентарь.Если вы используете динамический инвентарь , вы можете встраивать туда переменные, специфичные для хоста и / или группы.Это работает очень хорошо.Для записи, вы можете использовать вывод YAML вместо JSON.Вот упрощенный шаблон - мы иногда используем сценарий оболочки, который запускает ansible в качестве инвентаря:

case $# in
0) # execute the playbook
   ansible-playbook -i Jenkins.sh -vv site.yml
;;
*) case $1 in
   # ansible-playbook will call the script with --list for hosts
   --list)
     printf "%s\n\n" ---
     for group in someGroup otherGroup admin managed each all
     do  printf "\n$group:\n  hosts:\n"
         for s in $Servers
         do printf "    - $s\n"
         done
         printf "  vars:\n"
         printf "    ansible_ssh_user: \"$USER\"\n"
         printf "    ansible_ssh_pass: \"$PSWD\"\n\n"
     done
   ;;
   esac
;;
esac

Вы также можете использовать --extra-vars в качестве переопределения с наивысшим приоритетом в последнюю минуту.

0 голосов
/ 18 мая 2018

Вы можете указать свои собственные переменные для всех или определенных хостов в файле инвентаризации или в связанных с ним подкаталогах (например, ./group_vars). Перейти на эту страницу .Там вы можете увидеть пример файла в этом каталоге, который должен иметь имя группы и быть написан на yaml).Каталог ./group_vars должен находиться в том же каталоге, что и ваш файл hosts.Например, если ваш файл hosts находится в ./inventory/hosts, то файлы с переменными должны быть ./inventory/group_vars/<group_name>.Имейте в виду, что переменные, определенные в этих файлах, будут применяться только к членам группы.Пример содержимого файла в этом каталоге:


---
ip=1.1.1.1
port=420
password='password1'            # should be encrypted with Ansible Vault
...

И тогда вы будете использовать их как обычно:

- name: Get all Storage VMs
  StorageVMModule: host='{{ip}}' port='{{port}}' user=admin action=get name=my_svm
  register: jsonResultforSVMs
0 голосов
/ 21 мая 2018

Чтобы указать вещи, которые вы описываете, лучше всего использовать хранилище секретов для своих секретов, чтобы что-то вроде хранилища hashicorp, но, к счастью, ansible, также имело способ шифрования секретной информации, называемое хранилищем Ansible, которое работает на уровне файлов.

То, что вы никогда не должны делать, - это помещать секреты в текстовые файлы, а затем передавать их в систему контроля версий.Ansible Vault будет шифровать данные, чтобы обойти это.

Ansible Vault не сложен, но имеет очень хорошую документацию здесь

Вы можете создать новый зашифрованный файл, например так:

ansible-vault create filename.yml

Вы можете редактировать файл следующим образом:

ansible-vault edit filename.yml

Вы можете зашифровать незашифрованный файл следующим образом:

ansible-vault encrypt filename.yml

Вы можете расшифровать с помощью ansible-vault decrypt

Затем вы можете использовать их в playbooks и зафиксировать управление src с их защитой.

Другой подход - сохранить его во внешнем секретном хранилище (хранилище), а затем экспортировать в переменные среды.Затем прочитайте переменные окружения и присвойте им переменные.Таким образом, в управление исходным кодом вообще ничего не входит, это мой предпочтительный подход.

Это секреты, о которых нужно позаботиться.

Для общих структур вы можете использовать group_vars и устанавливать разные значения для разных ролей.объясняется здесь

0 голосов
/ 18 мая 2018

variables можно загружать разными способами.Вы можете определить файл с именем all в каталоге vars/, и он доступен во всей книге воспроизведения.

Кроме того, вы можете определить его в файле и предоставить его при исполнении книги воспроизведения с помощью -e @filename,Я нашел этот самый удобный способ.

Проверьте эту ссылку из документации, я думаю, вы можете найти ее очень полезной


Я настоятельно рекомендую вам использовать роли .Там, в каждой роли у вас есть папка vars, в которую вы можете поместить соответствующие переменные в роль.Затем вы можете указать их значения с помощью переменных среды ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...