it-swarm.com.ru

Ответ: Как зашифровать некоторые переменные в файле инвентаризации в отдельном файле хранилища?

Настройки

Рассмотрим файл инвентаризации Ansible похожий на следующий пример:

[san_diego]
Host1
Host2

[san_francisco]
Host3
Host4

[west_coast]
san_diego
san_francisco

[west_coast:vars]
db_server=foo.example.com
db_Host=5432
db_password=top secret password

Эта проблема

Я хотел бы сохранить некоторые из переменных (например, db_password) в Ansible vault , но не весь файл.

Как импортировать файл с зашифрованным хранилищем в незашифрованный файл инвентаризации?

Что я пробовал

Я создал зашифрованный файл Vars и попытался импортировать его с помощью:

include: secrets

На что ansible-playbook ответил:

ERROR: variables assigned to group must be in key=value form

Возможно, потому что он пытался проанализировать оператор include как переменную.

47
Adam Matan

Если ваша проблема заключается в том, чтобы иметь как незашифрованные, так и зашифрованные файлы vars для каждой группы_хостов. 

Вы можете использовать эту функцию: http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-vaults

group_vars/ 
  san_diego/
    vars.yml  # unencrypted yaml file
    vault.yml # encrypted yaml file

Ansible автоматически прочитает vault.yml как зашифрованный файл yaml. 

Обновление: решение ниже также является хорошим решением (начиная с версии 2.3)

39
Antoine

Начиная с версии Ansible 2.3 вы можете зашифровать Single Encrypted Variable. IMO, требуется пошаговое руководство, поскольку документ выглядит довольно лаконично.

Приведенный пример: mysql_password: password123 (в main.yml)

Запустите команду, например:

ansible-vault encrypt_string password123 --ask-vault-pass

Это даст:

    !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
Encryption successful

вставьте это в свой main.yml:

mysql_password: !vault |
    $ANSIBLE_VAULT;1.1;AES256
    66386439653236336462626566653063336164663966303231363934653561363964363833
    3136626431626536303530376336343832656537303632313433360a626438346336353331

запустить playbook:

Т.е. ansible-playbook -i hosts main.yml --ask-vault-pass

Проверить с помощью отладки:

- debug:
    msg: "mysql Pwd: {{ mysql_password }}"
53
wired00

В настоящее время в Ansible 2.3 возможно иметь в виде простого yaml как зашифрованные, так и незашифрованные переменные. Формат зашифрованных переменных выглядит следующим образом:

dbServer: PlainDatabaseServer
dbName: PlainDatabaseName
dbUser: PlainUser
dbPasswd: !vault |
      $ANSIBLE_VAULT;1.1;AES256
      63633363616165656538656537323835343634633063386137353637646663333939623464666437
      6263383933656635316436313934366564316337623435350a386362613838373363393534383232
      39663162363066313431623466363763356466376538613532333731613538373431623239626330
      6463373238366630360a623566616535376339326431363465663431623462356238636333306663
      6439

Вы можете зашифровать переменную с помощью пароля или файла паролей с помощью инструкции:

ansible-vault encrypt_string "dummy" --vault-password-file pass-ansible.txt

Этот оператор возвращает текст, показанный в переменной dbPasswd в yaml выше.

Чтобы запустить playbook, который использует зашифрованную переменную, просто добавьте следующую переменную:

 ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt

Или вы можете сделать то же самое с --ask-vault-pass, который запрашивает пароль при выполнении playbook:

ansible-playbook playbooks/myplaybook --ask-vault-pass
10
V. Morate

Вы можете сделать что-то похожее на это.

  1. Создайте файл паролей (простой текстовый файл с паролем в одной строке)
  2. Создайте ansible.cfg в вашей папке проекта ansible

    [defaults]
    vault_password_file = <path/to/your/password/file>
    
  3. Создайте файл playbook (например, playbook.yml)

     - name: my ansible playbook
       hosts: 127.0.0.1
       vars_files:
         - 'vars.yml'
       tasks:
         - name: print secure variable
           debug: msg="my secure variable '{{ my_secure_variable }}'"`
    
  4. Создайте файл переменной (например, vars.yml)

    my_secure_variable: "X_my_secret_X"
    
  5. Зашифруйте файл переменной (из местоположения ANSIBLE проекта с помощью ansible.cfg)

    ansible-vault encrypt vars.yml
    
  6. Запустите вашу книгу игр (из местоположения проекта ANSIBLE с помощью ansible.cfg)

    ansible-playbook -i "localhost," playbook.yml
    

Вы должны получить вывод, похожий на:

$ ansible-playbook playbook.yml -i 'localhost,'

PLAY [my ansible playbook] ****************************************************

GATHERING FACTS ***************************************************************

ok: [127.0.0.1]

TASK: [print secure variable] *************************************************

ok: [127.0.0.1] => {
    "msg": "my secure variable 'X_my_secret_X' "
}

PLAY RECAP ********************************************************************

127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=0
6
grandma

Это зависит от вашего рабочего процесса. Вы можете использовать файл group_vars согласно предложению Себастьяна Стиглера или, если вы хотите использовать файл инвентаря, вы можете просто добавить другой «ini-like» файл в каталог инвентаря и зашифровать его.

$ mkdir my_inventory/
$ cat >> hosts << EOF
[san_diego]
Host1
Host2

[san_francisco]
Host3
Host4

[west_coast]
san_diego
san_francisco
EOF

$ cat >> inventory_crypted_vars << EOF
[west_coast:vars]
db_server=foo.example.com
db_Host=5432
db_password=top secret password
EOF

Затем используйте -i my_inventory/ в командной строке или создайте локальный ansible.cfg, содержащий:

[defaults]
hostfile = ./my_inventory/

и вы должны быть установлены. Ansible объединит оба файла во время выполнения.

Используйте ansible-vault encrypt my_inventory/inventory_crypted_vars перед фиксацией, и все готово.

Вы, вероятно, хотите зацепить предварительную фиксацию, чтобы гарантировать, что вы не фиксируете незашифрованную версию файла. Например, хук предварительной фиксации, подобный этому, сработает (соответственно настройте FILES_PATTERN).

3
leucos

Вы можете использовать group_vars (см. http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable ).

Создайте подкаталог в вашей игровой книге с именем group_vars.
Там вы создаете файл с именем west_coast и помещаете в него следующие записи:

---
db_server: foo.example.com
db_Host: 5432
db_password: top secret password

Этот файл может быть преобразован в хранилище.

0
Sebastian Stigler