Я создаю сценарий, который укрепит мои серверы Linux. Часть процесса - заменить umask в профилях по умолчанию. Итак, я создал такую задачу:
- name: Change the umask for default profiles
replace:
path: "{{ profile_file }}"
regexp: "(\s+)umask"
replace: "\1 027"
loop:
- /etc/profile
- /etc/bashrc
loop_control:
loop_var: profile_file
Проблема в том, что его идемпотентность не поддерживается. Каждый раз, когда я запускаю задачу, она заменяет маску, даже если она правильная. Если я удалю (\ s +), тогда umask будет записан в начале строки, а не в правильном месте, что, конечно, не является функциональной проблемой, но нарушает читаемость файла.
Итак, я хочу сделать следующее:
regexp: "(\s+)umask 002"
replace: "<something> 027"
где дадут мне только маску с пробелами а затем добавьте 027. Я очень слаб в регулярных выражениях и ничего не знаю о регулярных выражениях в Python, поэтому любая помощь будет принята с благодарностью.
Попробуйте использовать https://regex101.com который является отличным инструментом для изучения / отладки регулярных выражений.
В документации Ansibles говорится следующее относительно групп захвата в строке замены: The string to replace regexp matches. May contain backreferences that will get expanded with the regexp capture groups if the regexp matches. If not set, matches are removed entirely.
Это должно быть возможно, но ваше утверждение из вопроса (\s+)umask
соответствует любому пробелу, который вы записываете в группе 1, и umask
. Таким образом, строка замены будет фактически содержать только пробелы из группы захвата один плюс 027
.
Скорее всего, вы так захотите (\s+umask).*
, который захватывает любые пробелы и umask в группу захвата 1. В строке замены вы можете использовать \1 027
. Быть осторожен .*
соответствует всей остальной части строки. Возможно, это не то, что вы собираетесь делать.
Хотя это не является частью вопроса, я думаю, что было бы хорошо указать umask в 4-значном формате вместо трех.
Регулярное выражение может выглядеть так, чтобы быть очень конкретным для этого варианта использования:
regexp: (\s+umask\s+)([0-7]{4}|[0-7]{3})
replace: \1 0027