{"id":17312847,"url":"https://github.com/9seconds/fuel-pdsh","last_synced_at":"2025-08-02T12:33:28.514Z","repository":{"id":57432541,"uuid":"46863020","full_name":"9seconds/fuel-pdsh","owner":"9seconds","description":"Simple PDSH alternative for OpenStack Fuel","archived":false,"fork":false,"pushed_at":"2016-02-24T07:58:09.000Z","size":32,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-07T23:30:59.568Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/9seconds.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-11-25T13:23:49.000Z","updated_at":"2016-02-15T11:52:24.000Z","dependencies_parsed_at":"2022-09-17T03:50:48.402Z","dependency_job_id":null,"html_url":"https://github.com/9seconds/fuel-pdsh","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/9seconds/fuel-pdsh","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/9seconds%2Ffuel-pdsh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/9seconds%2Ffuel-pdsh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/9seconds%2Ffuel-pdsh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/9seconds%2Ffuel-pdsh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/9seconds","download_url":"https://codeload.github.com/9seconds/fuel-pdsh/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/9seconds%2Ffuel-pdsh/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268388241,"owners_count":24242521,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-02T02:00:12.353Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-15T12:44:45.134Z","updated_at":"2025-08-02T12:33:28.485Z","avatar_url":"https://github.com/9seconds.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"=========\nfuel-pdsh\n=========\n\n|PyPi Package|\n\nfuel-pdsh is a small utility which allows you to execute one command on\nthe multiple OpenStack nodes from master node (aka Fuel node) remotely\nusing SSH.\n\nBasically it is just a pure Python replacement for `PDSH\n\u003chttps://code.google.com/p/pdsh/\u003e`_ which uses Nailgun API to discover\nnodes. Also it supports ``pdcp`` utility for copying files to multiple\nhosts in parallel.\n\n``fuel-pdsh`` package contains 2 commandline utilities, ``fuel-pdsh``\nfor executing SSH command on the group of hosts and ``fuel-pdcp`` for\nfile copying.\n\n\nInstallation\n============\n\nBefore install fuel-pdsh on master node, do the following:\n\n::\n\n    $ yum install python-devel python-pip gcc\n\nIf you want system installation, do:\n\n::\n\n    $ pip install fuel-pdsh\n\nIf you want to use virtualenv:\n\n::\n\n    $ pip install virtualenv\n    $ virtualenv -p python2.6 --system-site-packages ~/.fuelpdsh-venv\n    $ source ~/.fuelpdsh-venv/bin/activate\n    $ pip install fuel-pdsh\n\n\nCommandline options\n===================\n\nThe both of ``fuel-pdsh`` and ``fuel-pdcp`` have the same options set but\ndifferent arguments.\n\n::\n\n    usage: fuel-pdsh [-h] [--concurrency CONCURRENCY] [-c CLUSTER_ID]\n                     [-w NODE_IDS] [-i IPS] [-n NAME] [-s STATUS] [-g GROUP_ID]\n                     [-r ROLES] [-v | -d]\n                     command [command ...]\n\n    positional arguments:\n      command               Command to execute\n\n    optional arguments:\n      -h, --help            show this help message and exit\n      --concurrency CONCURRENCY\n                            How many simultaneous connections should be\n                            established. By default (4), we are trying to connect\n                            to all nodes, no limits.\n      -c CLUSTER_ID, --cluster-id CLUSTER_ID\n                            Select only nodes which belong to cluster with such\n                            ID.\n      -w NODE_IDS, --node-ids NODE_IDS\n                            Plain comma-separated list of nodes.\n      -i IPS, --ips IPS     Plain comma-separated list of node IPs.\n      -n NAME, --name NAME  Regular expression for the node name.\n      -s STATUS, --status STATUS\n                            Node status.\n      -g GROUP_ID, --group-id GROUP_ID\n                            Group ID.\n      -r ROLES, --roles ROLES\n                            Node roles.\n      -v, --verbose         Be verbose.\n      -d, --debug           Be event more verbose, for debugging.\n\n    Please contact Sergey Arkhipov \u003cserge@aerialsounds.org\u003e for issues.\n\n\n``--concurrency``\n-----------------\n\nThis flag defines how may hosts would be accessed in parallel. If you\nhave 40 nodes but ``--concurrency`` is set to 4, only 4 hosts will be\nmanaged in parallel. Set ``0`` if you want to connect *all* hosts in\nparallel.\n\nIn reality, please do not set this setting to high. ``fuel-pdsh``\nuses `Paramiko \u003chttp://www.paramiko.org/\u003e`_ for host access and it\nhas well-known issues on slowing down with multiple simultaneous\nconnections. You may have serious performance decrease if you connect to\nall hosts instead of some limit.\n\n\n``--verbose``\n-------------\n\nThis flag makes utilities more verbose. By default, if you execute\n``fuel-pdsh``, you will see such output:\n\n::\n\n    $ fuel-pdsh -n contr -- echo hello world\n    node-4 :  hello world\n    node-39:  hello world\n    node-3 :  hello world\n\nIf you enable ``-v``, you will get something like this:\n\n::\n\n    $ fuel-pdsh -n contr -v -- echo hello world\n    *** 140489797273344 \u003e\u003e\u003e Found 3 suitable nodes\n    *** 140489797273344 \u003e\u003e\u003e Execute with 4 threads\n    node-4 :  hello world\n    node-39:  hello world\n    node-3 :  hello world\n\nSo, more verbose, to understand what is going.\n\n\n``--debug``\n-----------\n\nEnables maximal verbosity. Basically, if you are not me, you do not need\nthis level of verbosity. But I need when I debug.\n\nSo, if you met with some problems and want to issue a bug, execute\nutilities with ``-d`` and send me an output.\n\n\n``-c``, ``--cluster-id``\n------------------------\n\nDefines optional cluster ID for additional node filtering. If no cluster ID\nis set, utilities will work over all accessible clusters.\n\n::\n\n    $ fuel-pdsh -c 1 -- ls\n\nThis will do ``ls`` on all nodes in cluster with ID ``1``.\n\n\n``-w``, ``--node-ids``\n----------------------\n\nThe most simple selector, just select all nodes by given IDs. So if you\nwant t``-c``, o run a command on nodes with IDs ``2``, ``4`` and ``8``,\njust pass them as a comma-separated list.\n\n::\n\n    $ fuel-pdsh -w 2,4,8 -- ls\n\nAlso, you may prefix them with ``node-`` prefix (as you SSH to them).\nThe following command is the same as previous:\n\n::\n\n    $ fuel-pdsh -w node-2,4,node-8 -- ls\n\n\n``-i``, ``--ips``\n-----------------\n\nSelect only those nodes which have these IPs.\n\n::\n\n    $ fuel-pdsh -i 10.0.0.1,10.0.0.2 -- ls\n\n\n``-n``, ``--name``\n------------------\n\nFilters on the node names. This parameter is just a regular expression\nfor the node name, so there is not point to enter the whole name, just\npass a part.\n\n::\n\n    $ fuel-pdsh -n contro -- ls\n\n\n``-s``, ``--status``\n--------------------\n\nFilter nodes on their statuses.\n\n::\n\n    $ fuel-pdsh -s ready -- ls\n\nThis will ``ls`` on all nodes which have status ``ready``.\n\n\n``-g``, ``--group-id``\n----------------------\n\nFilters nodes on their group ID.\n\n::\n\n    $ fuel-pdsh -g 10 -- ls\n\n\n``-r``, ``-roles``\n------------------\n\nFilter nodes on their roles.\n\n::\n\n    $ fuel-pdsh -r compute -- ls\n\n\nfuel-pdsh\n=========\n\n``fuel-pdsh`` is a tool to execute commands in parallel on different\nhosts. Let's assume you want to restart Apache on all controllers. Then\ndo following:\n\n::\n\n    $ fuel-pdsh -r controller service apache2 restart\n\nSometimes you need to pass arguments to the command which may be\nrecognized as an arguments for ``fuel-pdsh`` itself. No worries, good\nold ``--`` is supported.\n\n::\n\n    $ fuel-pdsh -r controller -- manage.py --noinput\n\nSometimes you have to invoke several commands. No worries again:\n\n::\n\n    $ fuel-pdsh -r controller -- sh -c \"command1 \u0026\u0026 command2; command3\"\n\n\nfuel-pdcp\n=========\n\n``fuel-pdcp`` is a utility to copy files on multiple hosts simultaneously.\n\n::\n\n    $ fuel-pdcp -r controller -- zabbix.deb /tmp\n\nThis will copy Zabbix package to ``/tmp`` on all controllers. Also, you\nmay copy several files:\n\n::\n\n    $ fuel-pdcp -r controller -- zabbix.deb zabbix.conf /tmp\n\n**Important**: destination is considered directory. So if you do following\n\n::\n\n    $ fuel-pdcp -r controller -- zabbix.deb /tmp/zabbix.deb\n\nThen new directory ``/tmp/zabbix.deb/`` will be created and you file\ngonna be copied in ``/tmp/zabbix.deb/zabbix.deb``. This is intentional\nbecause to avoid ambiguaty on copying several files into one place.\nPlease remember about that.\n\n\n.. |PyPi Package| image:: https://badge.fury.io/py/fuel-pdsh.svg\n    :target: https://pypi.python.org/pypi/fuel-pdsh\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F9seconds%2Ffuel-pdsh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F9seconds%2Ffuel-pdsh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F9seconds%2Ffuel-pdsh/lists"}