Easy for one machine. Now do it for 5, or 10, or 100.
Remember that those machines all have slightly different software on them, so it's not simple to automate. Unless you're manage systems with something (eg puppet) it's not just a PITA or a question of laziness - it's a real task that takes up hours, not a quick 15-minute job you run over a coffee break, and that's assuming no breakage.
That's fine so long as you have a full test suite to exercise the app - catch small mail server configuration changes, apparmor and MySQL (we got bitten by that when upgrading to MySQL 5.5 from 5.1) et al - it's not a matter of saying "hey this looks like it's running" but verifying there's no regressions either.
Mind you containers don't help with this either...
And at least with ubuntu you can pass user data to a new container just like on AWS EC2 to initialize a new container with specific apt-get installs etc
Remember that those machines all have slightly different software on them, so it's not simple to automate. Unless you're manage systems with something (eg puppet) it's not just a PITA or a question of laziness - it's a real task that takes up hours, not a quick 15-minute job you run over a coffee break, and that's assuming no breakage.