- Multiple Tableau Server environments: non-production1, non-production2, non-production3, production. Imagine sandbox, test, UAT, production for instance
- Self Service environment where line of business users can contribute content (publish workbooks and data sources) and other can consume
- No enforced path to production (such as first deploy to non-production1,2,3, production )-- that would be over burdensome granted our self-service approach
- Not all users (contributors or consumers) have access to the lower environments but some do.
We have had these separate environments for quite some time and, because there is no official or enforceable "path to production" there has been sizable yet expected drift between them. To fix and prevent that drift, we'd like to integrate an environment sync into an existing automated backup process. I was able to figure out the sync piece easy enough, so I thought...
I use the backup of prod and restore the lowers from that. There are several configuration pieces that I then have to update (run as user and such) but even that was easy enough to automate. Heck, even redirecting the database connections was challenging but doable (Tableau REST API to the rescue). The last piece is extracts that are pointed to environment specific locations... these have me pulling my hair out!
Consider the following hypothetical: I have an alteryx workflow that updates an excel file every month. Well in production, that file is located at /.../production/file.xlsx. When I perform the restore as described from above (effectively taking prod and pushing it to each of the lowers), if I now try to refresh the extract the refresh will fail because my lower environments don't have access to the //production/file.xlsx. I do have lower environments that parallel the /.../production/file.xlsx such as /.../non-production1/file.xlsx so I can absolutely point it down there but I cannot figure out how to do that programatically... anyone done this? Is there an xml config that I can update? am I missing something in tabcmd or the API?