Pseudo-random role assignment
I suspect the biggest problem is going to be the gap between role 3's.  So, one possible approach would be to schedule 8 rounds at a time, and for each block of 8 rounds, make sure that every player gets assigned role 3 exactly once.

This can be done as follows.  For the first round, randomly pick N/8 people to be role 3 in the first round.  Then, randomly pick N/8 people who haven't been picked yet to be role 3 in the second round.  Continue until you have scheduled all of the role 3's for all 8 rounds.   This will ensure that each player is role 3 exactly once in those 8 rounds; and that in each round, exactly N/8 people have role 3.

You could then complete the schedule by randomly scheduling role 2's and role  1's among the remaining people (with the right probabilities).  This would be pretty simple to implement and might be good enough.



What if people start complaining about the role 2's?  Well, you could schedule them nearly-equally, too, with a modest modification.  As before, schedule 8 rounds at a time.  We'll try to ensure each player is assigned role 3 exactly once in those 8 rounds; and that most players are assigned role 2 twice, once in the first 4 rounds and once in the last 4 rounds (but we won't be completely perfect about that).  We'll start by assigning the role 3's as described above and fix their assignment.

Next, we'll assign  role 2's to the first 4 rounds.  In the first round, randomly pick a subset of N/4 people who don't have any assignment in that round, and assign them role 2.  In the second round, out of the people who  don't have any assignment in that round and who haven't been assigned role 2 yet, randomly pick a subset of N/8 of them and assign them role 2.  Continue.  In each round, we find the set of people who don't have a role assigned to them in that round yet and who haven't been assigned role 2 yet, and randomly pick a subset of size N/4  from that set; everyone in that subset is assigned role 2.  In rounds 1-3, it is nearly guaranteed that this set is larger than N/4, so we can pick a subset  of the appropriate size.  In round 4,  this set might be smaller than N/4; if so, assign everyone in that set role 2, and then randomly pick other people who don't have an assignment in that round to be role 2 until you have N/4 role 2a's in that round.  In this way, most people are assigned role 2 exactly once in the 4 rounds, with a few people who get assigned role 2 zero or two times (due to round 4 being imperfect).

Then, do the same for role 2 in rounds 5-8.