I'll start by saying that we chose the 2nd solution for our production environment and I guarantee one thing - it just works. Now for the longer version:
Solution no. 1:
- Simple and robust - will just work
- Does not "contaminate" production servers with irrelevant files (other configuration files)
- Does not load production servers with I/O to GitHub (probably negligible)
Solution no. 2:
- Simple and robust - will just work
- To reduce contamination, we clone the configuration repo to /tmp and delete it at the end of the playbook
Solution no. 3/4:
My guess it will work, but feels a bit strange to have your configuration in source control and then not really using source control features. The advantage of these solutions is that you can "cherry pick" which configuration files you want to download rather than cloning the whole repository. This also reduces I/O against github as cloning becomes heavier over time.