When modifying a line the regexp should typically match both the initial state of the line as well as its state after replacement by line to ensure idempotence.
Стоит ещё помнить, что такие открытые регексы могут попортить нервов. Потому что оно матчится не только с Port 11111, но и с Port 111111 и с Port 1111122. В данном конкретном случае скорее всего проблем не будет. Потому что портов всего 64 тысячи. Но вероятность что что-то пойдет не так всё же есть.
Ну и в целом, я бы использовал replace в случае крайней необходимости. template или даже просто copy всё же куда надежнее.
Например, в случае с sshd есть прекрасная директория /etc/ssh/sshd_config.d, куда можно положить файл с нужными значениями, а не править /etc/ssh/sshd_config. Его лучше оставить на откуп мантейнерам дистрибутива и не трогать. И во время обновления вопросов будет меньше. Вот выдержка из man sshd_config:
/etc/ssh/sshd_config.d/*.conf files are included at the start of the configuration file,
so options set there will override those in /etc/ssh/sshd_config.
Стоит ещё помнить, что такие открытые регексы могут попортить нервов. Потому что оно матчится не только с Port 11111, но и с Port 111111 и с Port 1111122. В данном конкретном случае скорее всего проблем не будет. Потому что портов всего 64 тысячи. Но вероятность что что-то пойдет не так всё же есть.
TASK [Syn files] ******************************************************************************************************************************************************************************
fatal: [ans_prod1]: FAILED! => {"changed": false, "cmd": "/usr/local/bin/rsync --delay-updates -F --compress --archive --rsh='/usr/bin/ssh -S none -o Port=1111 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' --out-format='<<CHANGED>>%i %n%L' /mnt/test ans_prod1:/mnt/", "msg": "ssh: Could not resolve hostname ans_prod1: Name does not resolve\r\nrsync: connection unexpectedly closed (0 bytes received so far) [sender]\nrsync error: unexplained error (code 255) at io.c(228) [sender=3.2.3]\n", "rc": 255}
Я так понял что rsync не знает сетевые данные об ans_prod1, в нес в системный файл /etc/hosts ip ans_prod1 и после ансибл запустился нормально, директория /mnt/test синхронизировалась.
Хоть в конфиге ансибле host данные сетевые серверов прописаны.
Например, в случае с sshd есть прекрасная директория /etc/ssh/sshd_config.d, куда можно положить файл с нужными значениями, а не править /etc/ssh/sshd_config. Его лучше оставить на откуп мантейнерам дистрибутива и не трогать. И во время обновления вопросов будет меньше. Вот выдержка из man sshd_config:
Подобное сработает если ssh запущен на стандартных настройках.
+ все равно нужно инклудить новую диру с файлами конфига.
Тоже нюанс, если параметр активирован в основном конфиге ssh, то этот же параметр про дублируется с новыми параметрами на сервере из конфига shd_config.d
Подскажите по такой задачи.
Есть группа на сервере ftp, в нее входят несколько пользователей.
Хочу добавить правило в крон пользователей которые в группе ftp.
- hosts: ans_prod
tasks:
- name: Who is in group ftp.
shell: getent group ftp | cut -d: -f4 | tr ',' '\n'
register: users_name
- name: add users to cron
cron:
name: "ftp backup"
minute: "0"
hour: "*/4"
job: "sh /home/users_name.stdout_lines/back.sh"
Почему-то переменная users_name не добавляет содержимой самой переменной, а просто прописывается как есть (sh /home/users_name.stdout_lines/back.sh).
Содержимое команды.
Хочется либо что бы у рута появилась несколько записей крона.
0 */3 * * * backup /home/sir
0 */3 * * * backup /home/igor
Либо чтобы в в самом пользовательстком кронтабе от того пользователя который в группе состоит прописывалась запись.
В консоли такая команда отрабатывает нормально rm -rf /mnt/tes_por/{*,.*}
Если правильно помню, то по умолчанию ansible пытается всё это запускать в sh, который не умеет в shell expansion, wildcards и прочие редиректы. Оболочку можно переназначить через executable. Примерно так:
# ansible-playbook shel
[WARNING]: While constructing a mapping from /usr/local/etc/ansible/shel, line 5,
column 9, found a duplicate dict key (cmd). Using last defined value only.
PLAY [ans_prod] *********************************************************************
TASK [Gathering Facts] **************************************************************
ok: [ans_prod]
TASK [who is in group ftp.] *********************************************************
changed: [ans_prod]
Отрабатывает только последняя команда (cmd: "ls /usr/ > /tmp/tee.txt").
То-есть как я понял, несколько подряд команд нельзя запускать.
Нет. С этим кодом у вас создадутся две директории /mnt/tes_por/absent и /mnt/tes_por/directory. Вам нужно {{ item }} именно в state указывать, чтобы по нему цикл шёл.
В ansible есть модули на все случаи жизни. Их использовать надёжнее, чем шелл, потому что шелловские команды могут создать проблемы с переносимостью. Между двумя установками одной и той же системы, если в одной не хватает какой-то команды, между двумя разными версиями одной и той же системы, или, тем более, если решите что-то с фряхи на линукс перевести.
Чтобы очистить полностью всё содержимое директории, нужно её сначала удалить, а потом создать обратно. В цикле, который я привёл, именно это и происходит. {{ item }} подставляется в state и ansible понимает, что с одной и той же директорией нужно делать разные вещи. В вашем переделанном варианте {{ item }} подставляется в имя директории, а state остается тем же самым. Таким образом ansible вместо удаления / создания одной и той же директории создаёт 2 разные директории внутри вашей целевой. Что немного отличается от поставленной цели.
Продолжаю изучения ansible.
Есть чистый сервер, на нем питон не установлен, вообще ничего не установлен, только добавлен ssh запущен.
так вот пытаюсь через raw установить питона.
ansible-playbook shel
PLAY [ans_test] *******************************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************************
fatal: [ans_test]: FAILED! => {"ansible_facts": {}, "changed": false, "failed_modules": {"ansible.legacy.setup": {"failed": true, "module_stderr": "Shared connection to 3.4.7.9 closed.\r\n", "module_stdout": "/bin/sh: /usr/local/bin/python: not found\r\n", "msg": "The module failed to execute correctly, you probably need to set the interpreter.\nSee stdout/stderr for the exact error", "rc": 127}}, "msg": "The following modules failed to execute: ansible.legacy.setup\n"}
PLAY RECAP ************************************************************************************************************************************************************
ans_test : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
При установки менеджер паркетов требовал поддверждения что установит зависимости по порту.
Добавил ключ -y к установке и спустя какоето время ( пока обновится репа) питон установил, после задача создать симлинк и можно пользоваться.