Сегодня днем я тоже боролся с этим. Думаю, я понял это немного лучше, поэтому хочу поделиться этим. Но я также новичок в Ansible Vault, поэтому то, что я здесь говорю, может быть не совсем правильным. Я использовал [1] в качестве основного источника обучения.
Ссылки
Что могло вас смутить
[1] говорит
root@2ca77340d571:/# ansible-vault view --vault-id=.passvaults extravaulty.yml
chocolate:banana
has the pattern
root@2ca77340d571:/# ansible-vault view [email protected] extravaulty.yml
chocolate:banana
. Но символ
.passvaults
delivers the meaning of "inside", "at", or "of" which makes people think a vault ID
dev
означает строку внутри файла
[email protected]
with the label
root@2ca77340d571:/# ansible-vault view [email protected] extravaulty.yml
chocolate:banana
.
Но это ошибка: согласно моему тесту, весь контент в root@2ca77340d571:/# cat extravaulty.yml
$ANSIBLE_VAULT;1.2;AES256;dev
33336336336238326137393764316333623231336238323931306166626434653164326330656566
3561356333343435663538623661363661373461356461300a663361666331323031623530343930
62633230636566643339663637386438336539383162346634393031633165333033396238363163
6134383233346538330a326266626261346638303738313862656337396237343231326231656139
34376334663664343164303462356431306539316232323761386164643735376330
is used as the password. In your example above, the password Вы думаете это «my_test_pass»; но пароль Ansible Vault видит является root@2ca77340d571:/# ansible-vault encrypt [email protected] extravaulty.yml
Encryption successful
(note the white spaces and the End-of-Lines).
Поэтому, root@2ca77340d571:/# cat extravaulty.yml
chocolate:banana
does not select the line "my_test_pass". It actually means the following:
- В шифрование, это означает «использовать весь контент в
root@2ca77340d571:/# cat .passvaults
dev my_dev_pass
test my_test_pass
prod my_prod_pas
as the password to encrypt the given message and marks the result with the label ansible-vault
".
- В расшифровка, это означает «использовать весь контент в
file_path
as the password to decrypt everything that is marked with the label test@file_path
".
Использование нескольких файлов паролей
Поэтому, если вы хотите использовать разные файлы паролей, вам нужно сделать это следующим образом:
- Создайте три файла (я специально разместил их в разных папках для демонстрации):
ansible-vault
, test
, --vault-id abc@file_path
.
- Поместите пароли в правильные файлы. Пример:
ansible-vault
into ansible-vault
.
- Когда вы шифруете файл
--encrypt-vault-id=test
, you have two options:
- Вы можете указать только один идентификатор хранилища:
default
- Вы можете указать несколько идентификаторов хранилища, но также необходимо использовать
--vault-id
to tell --vault-password-file
какой из них на самом деле следует использовать для шифрования файла: default
Когда вам нужно расшифровать какой-либо контент, вы можете знать или не знать, каким паролем был зашифрован контент. В этом случае вы можете передать все возможные идентификаторы хранилища: --vault-id
. And vault will automatically figure out which password to use. This is talked about в этом разделе [1].
Это также объясняет, почему default
part is only used as a hint. In fact, you can pass in the vault IDs with completely wrong labels:
--vault-id
И ansible-vault
is still able to decrypt the file, because, essentially, ANSIBLE_VAULT_ID_MATCH=1 ansible-vault decrypt prod@~/pass_dev.txt dev@/tmp/pass_test.txt test@./pass_prod.txt some_encrypted_file.yml
использует ansible-vault
as the hint to see which password should be tried first. If it doesn't succeed, it tries the other passwords.
Но если вы определите переменную среды ANSIBLE_VAULT_ID_MATCH
, label
будет серьезно относиться к меткам и пробовать пароли только с совпадающими метками, поэтому следующее не удастся:
ansible-vault
Другие вещи в вашем вопросе
Возможно, я не совсем прав в этой части: наверное, ansible-vault
maintains an internal list of "currently available vault IDs". If no ansible-vault decrypt prod@~/pass_dev.txt dev@/tmp/pass_test.txt test@./pass_prod.txt some_encrypted_file.yml
присутствует в командной строке, единственный доступный идентификатор хранилища — label
. When ansible-vault decrypt dev@~/pass_dev.txt test@/tmp/pass_test.txt prod@./pass_prod.txt some_encrypted_file.yml
аргументы приведены, т. ansible-vault encrypt --vault-id dev@~/pass_dev.txt test@/tmp/pass_test.txt prod@./pass_prod.txt --encrypt-vault-id dev my_dev_file.yml
is overridden by whatever is provided.
Поэтому, когда вы зашифровали целевой файл с помощью ansible-vault
, without any other --encrypt-valut-id
, единственным доступным идентификатором хранилища был ansible-vault encrypt --vault-id dev@~/pass_dev.txt my_dev_file.yml
. But by providing my_dev_file.yml
ты спрашивал pass_dev.txt
to encrypt the target file using a vault ID of "test" which was not available, hence the error "Did not find a match".
Позже, когда вы предоставили my_dev_pass
with only ./pass_prod.txt
но попросил его зашифровать целевой файл, используя /tmp/pass_test.txt
, ~/pass_dev.txt
по-прежнему не удалось найти требуемый идентификатор хранилища, поэтому снова появляется ошибка «Не найдено совпадение».
Вы совершили ошибку, потому что думали test
selects one password from all the available passwords in file_path
, поэтому, предоставляя один файл паролей, вы думали, что предоставили несколько паролей. Но, похоже, это не так. test
works. You need to provide multiple password files (or, technically, multiple password sources which could also be prompts and scripts).