How to organize infrastructure as code projects?
The layout of your repository depends in many ways upon the context you are developing the automation in.  If, for example, you are building out the infrastructure for a product as part of a product team, then it would make sense to tie the infrastructure to the product - i.e. keep the infrastructure in the same repository as the software source code.

If however, you are building out common infrastructure components to stand-up basic infrastructure for DNS, File Storage, Email, etc. then it probably makes more sense to have a single common-infrastructure repository.  Some of this will be tied to the tool you are using, Terraform for example leads you down the path of having a single repository for all of your environments to support the terraform.tfstate construct.

Reusability

You quite rightly called out reusability and code sharing as a problem you are going to encounter sooner rather than later.  This is an important principle in Software Development called Don't Repeat Yourse - or DRY for short.  Most all DevOps tools allow you to modularize your code in such a way that you don't need to copy/paste code:


Terraform Modules
Ansible Roles
Chef Libraries
Jenkins Plugins


Conceptual Consistency

I advise that you don't use too many tools, try and standardise on a single tool rather than changing tools for each project, typically you see sets of tools being used across an organization:


Jenkins, Terraform and Ansible
TeamCity, Octopus Deploy and Desired State Configuration


This makes it easier to share code across projects, document what has been done so far and handover the code to other or future developers.