Ansible будет моей рекомендацией.
Он может делать все на шаге 1 через SSH, не требуя установки какого-либо агента на устройства (хотя рекомендуется Python, включая библиотеку JSON). Вместо шага 2 я бы предложил запустить шаг 1 на каждом устройстве.
Puppet отлично подходит для сред с большим количеством устройств. Он может делать все на шаге 1, по крайней мере, так же, как Ansible, но требует некоторых дополнительных усилий (установка Puppet Agent и зависимостей на каждом устройстве, настройка Puppet Master, разрешение устройствам подключаться к Puppet Master через HTTP.
rsync
на первый взгляд может показаться простым решением. Однако вы, вероятно, потратите много времени на написание сценариев вокруг проблем, которые другие инструменты уже решают или с которыми не сталкиваются в первый раз.