Can you force primary shards to only be on certain nodes, and replica shards on other nodes?

You cannot do that because Elasticsearch doesn't differentiate between the two when it comes to allocation.