я пытаюсь использовать sed
, чтобы найти и зашифровать поле ansible_password
в файле инвентаризации и зашифруйте его с помощью команды ansible-vault
. Но ansible-command
выдает ошибку sed
, тогда как простое эхо работает нормально.
sed -n "s/\( *\)\(ansible_password\: *\)\"\(.*\)\"/$(echo \\3)/p" sample.yml
выводит значение атрибута без двойных кавычек.
Команда ansible-vault
:
sed -n "s/\( *\)\(ansible_password\: *\)\"\(.*\)\"/$(ansible-vault encrypt_string --vault-password-file ~/password.txt --name 'ansible_password' '\\3')/p" sample.yml
выдает сообщение об ошибке: sed: -e выражение # 1, char 67: незавершенная команда `s '
Вот строка где происходит подстановка:
ansible_password: "somepassword"
Это не может сработать. Сначала будет выполнена вложенная команда. echo
работает случайно, потому что он поставит \3
в качестве шаблона замены, что в данном случае является тем, что вы хотите (= вывести исходное значение).
Не уверен, что именно вы хотите, возможно, вы можете попробовать grep
и xargs
:
grep -Po 'ansible_password: \K"[^"]*' sample.yaml \
| xargs -n1 ansible-vault encrypt_string --vault-password-file ~/password.txt --name 'ansible_password'
Однако, возможно, вы захотите использовать правильный yaml
парсер вместо grep
или sed
.
Используйте blockinfile, если вы можете поместить переменные в блоки "# BEGIN ... # END", например,
shell> cat sample.yml
# BEGIN my_password1
my_password1: "somepassword1"
# END my_password1
# BEGIN my_password2
my_password2: "somepassword2"
# END my_password2
# BEGIN my_password3
my_password3: "somepassword3"
# END my_password3
Затем задачи ниже читают файл и заменяют блоки зашифрованными переменными, например,
- include_vars:
file: sample.yml
name: my_pswd
- blockinfile:
dest: sample.yml
marker: "# {mark} {{ item }}"
block: "{{ _enc }}"
loop: [my_password1, my_password2, my_password3]
vars:
vault_cmd: "ansible-vault encrypt_string --name '{{ item }}' "
_enc: "{{ lookup('pipe', vault_cmd ~ my_pswd[item]) }}"
gives
shell> cat sample.yml
# BEGIN my_password1
my_password1: !vault |
$ANSIBLE_VAULT;1.1;AES256
30343161323861646333623332303663326438336462613165633766313130363961366633343764
3335393837613638633565616366353139623063366131640a616233616534386663666263653432
36376530653139666634323435313433346263643634303463643963343937316562326634313437
6262613663313664630a343830636436376366656534366438613435366664656132643866353030
3633
# END my_password1
# BEGIN my_password2
my_password2: !vault |
$ANSIBLE_VAULT;1.1;AES256
36653034373863613531643535353361636565633463626465393065316561353661666564633762
6139666336666433646633303664633261626135343865380a656464363430643563373264343234
38303034653332626238326432333236333439383365623866656262343436386137353638663436
3261363962373237300a646263396432646134313561366662326439303739303061303936353134
6235
# END my_password2
# BEGIN my_password3
my_password3: !vault |
$ANSIBLE_VAULT;1.1;AES256
31383764376166363733313065636264343863346334386230333739316337306535313866303164
3465616663626565623438316364326532306538303134640a313564356135373931306236373833
62383563386230633265396261363861393530653034613732333962643233316535646462656331
6566383662323266310a343337303465613334336638316132636238343637646235646565653532
6134
# END my_password3
При повторении задач шифрование переменных будет возобновлено.