Package: drawtf
drawtfDraw diagrams which include Cloud resources using TF state files or without them. Inspired by theDiagramspackage and a burning desire to not have to manually keep architecture diagrams updated, this was born.PrerequisitesInstall PythonInstallGraphvizInstallfoo@bar:~$python-mpipinstall--upgradepipfoo@bar:~$pipinstalldrawtffoo@bar:~$drawtf--helpUsage: drawtf [OPTIONS]Top level command for drawtf.Options:--help  Show this message and exit.Commands:draw   Draw a single design from config and settings.watch  Watch a directory for changes to draw.foo@bar:~$drawtfdraw--helpUsage: drawtf draw [OPTIONS]Draw a single design from config and settings.Options:--name TEXT              The diagram name.--state TEXT             The tfstate file to run against.--platform TEXT          The platform to use 'azure' or 'aws', only 'azure'currently supported--output-path TEXT       Output path if to debug generated json populated.--json-config-path TEXT  Config file path if populated.--verbose                Add verbose logs.--help                   Show this message and exit.foo@bar:~$drawtfwatch--helpUsage: drawtf watch [OPTIONS]Watch a directory for changes to draw.Options:--directory TEXT  Directory to watch for changes in.--help            Show this message and exit.DrawThere are a few ways we can create diagrams here, all options on the CLI are optional, and it is basically just the order which you create them that draws a diagram.Sample config File (app.json)If we use a config file with the fields below, this will set the name for the designs title, import a state file, and add some custom components not in the state file, The final section at the bottom draws the lines between the resources.{"name":"Aggreko Application (All Resources)","state":"./test/app.tfstate","components":[{"name":"Aggreko","type":"draw_custom","resource_group_name":"","attributes":{},"components":[{"name":"InternalDB","type":"draw_custom","resource_group_name":"","custom":"diagrams.azure.database.DatabaseForMysqlServers","attributes":{}},{"name":"App","type":"draw_custom","resource_group_name":"","custom":"diagrams.onprem.compute.Server","attributes":{}},{"name":"AnotherApp","type":"draw_custom","resource_group_name":"","custom":"diagrams.onprem.compute.Server","attributes":{}}]}],"links":[{"from":"App-draw_custom","to":"InternalDB-draw_custom","color":"darkgreen","label":"Write","type":"dotted"},{"from":"AnotherApp-draw_custom","to":"InternalDB-draw_custom","color":"darkgreen","label":"Write","type":"dotted"}],"excludes":[]}foo@bar:~$drawtfdraw--json-config-path./test/app.jsonBy running the command above pointing to the config file, this will set the name and grab other resources from the state file linked. Outputs from will create the design in the same sub-folder with the nameapp.png.Override config File (app-subset.json)Providing an override config alongside our main config file with the fields below, this will override the initial the designs title but still use the same state file and components from the original and attempt to join the links if all of the resources are available. You will notice an excludes section, if the keys for each resource added are in this list, then it will exclude those items.{"name":"Aggreko Application (Subset)","base":".//test//app.json","excludes":["AnotherApp-draw_custom"]}foo@bar:~$drawtfdraw--json-config-path./test/app-subset.jsonBy running the command above pointing to the config file and override files, this will set the name from the override and grab other resources from the state file linked. Outputs from will create the design in the same sub-folder with the nameapp-subset.png.Override config File and CLI overridesfoo@bar:~$drawtfdraw--json-config-path./test/app-subset.json--name"Aggreko Application (Sample)"--state./test/app.tfstate--output-path./test/sample--verboseThe command above, though using the same config files, can override all for the name, state file path and output path. Outputs from will create the design in the directorytestwith the namesample.png.WatchIt is now possible to simply watch a folder for *.json files to change or be created, this will then pick up the changes and draw designs as required.foo@bar:~$drawtfwatch--directory./testStarting watch for *.json files...Watching in .//test...Modified file .//test\app.json, drawing...Adding resource APPLICATION_DEV-azurerm_resource_groupAdding resource storageaccount-azurerm_storage_accountAdding resource (from config) InternalDB-draw_customAdding resource (from config) App-draw_customAdding resource (from config) AnotherApp-draw_customAdding resource (from config) Aggreko-draw_custom.//test\app.json done.Modified file .//test\app-subset.json, drawing...Adding resource APPLICATION_DEV-azurerm_resource_groupAdding resource storageaccount-azurerm_storage_accountAdding resource (from config) InternalDB-draw_customAdding resource (from config) App-draw_customExcluding resource (from config) AnotherApp-draw_customAdding resource (from config) Aggreko-draw_customWARNING:root:Ignoring link as object not in component cache: {'from': 'AnotherApp-draw_custom', 'to': 'InternalDB-draw_custom', 'color': 'firebrick', 'label': 'Write', 'type': 'dotted'}.//test\app-subset.json done.CI/CD StepsYes you can run this via GitHub actions or devops pipelines.GitHub Actions-name:Setup Graphvizuses:ts-graphviz/setup-graphviz@v1-name:Set up Python 3.7uses:actions/setup-python@v4with:python-version:'3.7'-name:Generate Diagramrun:|python -m pip install --upgrade pippip install drawtfdrawtf --helpdrawtf draw --json-config-path "./test/app.json"Azure Devops-script:sudo apt-get -yq install graphvizdisplayName:Setup Graphviz-script:|python -m pip install --upgrade pippip install drawtfdrawtf --helpdrawtf draw --json-config-path "./test/app.json"displayName:Generate DiagramEarly daysJust an FYI, its early days here and is still a development style project. That said we are using for all of our projects internally using TF, but loads of resources types are still to be added.