Git Product home page Git Product logo

community.rabbitmq's Introduction

community.rabbitmq Collection

Build Status

This repository hosts the community.rabbitmq Ansible Collection.

The collection includes the rabbitmq modules and plugins supported by Ansible rabbitmq community to help the management of rabbitmq infrastructure.

This collection is a part of the Ansible package.

Code of Conduct

We follow the Ansible Code of Conduct in all our interactions within this project.

If you encounter abusive behavior violating the Ansible Code of Conduct, please refer to the policy violations section of the Code of Conduct for information on how to raise a complaint.

Included content

  • Modules:

    • rabbitmq_binding: Manage rabbitMQ bindings.
    • rabbitmq_exchange: Manage rabbitMQ exchanges.
    • rabbitmq_feature_flag: Enables feature flag.
    • rabbitmq_global_parameter: Manage RabbitMQ global parameters.
    • rabbitmq_parameter: Manage RabbitMQ parameters.
    • rabbitmq_plugin: Manage RabbitMQ plugins.
    • rabbitmq_policy: Manage the state of policies in RabbitMQ.
    • rabbitmq_publish: Publish a message to a RabbitMQ queue.
    • rabbitmq_queue: Manage rabbitMQ queues.
    • rabbitmq_upgrade: Execute rabbitmq-upgrade commands.
    • rabbitmq_user_limits: Manage RabbitMQ user limits.
    • rabbitmq_user: Manage RabbitMQ users.
    • rabbitmq_vhost_limits: Manage the state of virtual host limits in RabbitMQ.
    • rabbitmq_vhost: Manage the state of a virtual host in RabbitMQ.
  • Lookup:

    • rabbitmq: Retrieve messages from an AMQP/AMQPS RabbitMQ queue.

Using this collection

Installing the Collection from Ansible Galaxy

Before using the collection, you need to install it with the Ansible Galaxy command-line tool:

ansible-galaxy collection install community.rabbitmq

You can include it in a requirements.yml file and install it via ansible-galaxy collection install -r requirements.yml, using the format:

---
collections:
  - name: community.rabbitmq

You can also download the tarball from Ansible Galaxy and install the collection manually wherever you need.

Note that if you install the collection from Ansible Galaxy with the command-line tool or tarball, it will not be upgraded automatically when you upgrade the Ansible package. To upgrade the collection to the latest available version, run the following command:

ansible-galaxy collection install community.rabbitmq --upgrade

You can also install a specific version of the collection, for example, if you need to downgrade when something is broken in the latest version (please report an issue in this repository). Use the following syntax:

ansible-galaxy collection install community.rabbitmq:==X.Y.Z

See Ansible Using collections for more details.

Contributing to this collection

The content of this collection is made by people just like you, a community of individuals collaborating on making the world better through developing automation software.

We are actively accepting new contributors.

All types of contributions are very welcome.

You don't know how to start? Refer to our contribution guide!

The aspiration is to follow the following general guidelines:

  • Changes should include tests and documentation where appropriate.
  • Changes will be lint tested using standard python lint tests.
  • No changes which do not pass CI testing will be approved/merged.
  • The collection plugins must provide the same coverage of python support as the versions of Ansible supported.
  • The versions of Ansible supported by the collection must be the same as those in developed, or those maintained, as shown in the Ansible Release and Maintenance documentation.

We use the following guidelines:

Local Testing

Local testing is done with the ansible-test tool which requires a specific directory hierarchy to function correctly so please follow carefully.

# These base directory environment variables can be adjusted to suit personal preferences
SRC_BASE_DIR="~/code"
VENV_BASE_DIR="~/.venvs"

# These should not be altered
COLL_DIR="${SRC_BASE_DIR}/ansible/ansible_collections/community/rabbitmq"
VENV_DIR="${VENV_BASE_DIR}/ansible"

# Create the required directory structure
mkdir -p $(basename ${COLL_DIR})

# Clone the collection repository
git clone https://github.com/ansible-collections/community.rabbitmq.git ${COLL_DIR}

# Create and activate a virtual environment.
virtualenv ${VENV_DIR}
source ${VENV_DIR}/bin/activate

# Install the devel branch of ansible-base
pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check

# Switch into the collection directory
cd ${COLL_DIR}

# Run the integration tests
ansible-test integration --docker default -v --color --python 3.6

# Run the unit tests
ansible-test units --docker default -v --color --python 3.6

Collection maintenance

The current maintainers (contributors with write or higher access) are listed in the MAINTAINERS file. If you have questions or need help, feel free to mention them in the proposals.

To learn how to maintain / become a maintainer of this collection, refer to the Maintainer guidelines.

It is necessary for maintainers of this collection to be subscribed to:

  • The collection itself (the Watch button -> All Activity in the upper right corner of the repository's homepage).
  • The "Changes Impacting Collection Contributors and Maintainers" issue.

They also should be subscribed to Ansible's The Bullhorn newsletter.

Publishing New Version

See the Releasing guidelines.

Tested with Ansible

TBD

External requirements

TBD

Supported connections

TBD

More Information

Communication

To communicate, we use:

We announce important development changes and releases through Ansible's The Bullhorn newsletter. If you are a collection developer, be sure you are subscribed.

We take part in the global quarterly Ansible Contributor Summit virtually or in-person. Track The Bullhorn newsletter and join us.

For more information about communication, refer to the Ansible Communication guide.

Reference

License

GNU General Public License v3.0 or later.

See LICENCE to see the full text.

community.rabbitmq's People

Contributors

abompard avatar aitorpazos avatar akasurde avatar andersson007 avatar chandlerswift avatar chuckmoe avatar cognifloyd avatar csmart avatar damiandabrowski5 avatar duttaani avatar flora-five avatar g0tmi1k avatar gotmax23 avatar gundalow avatar im0 avatar mjrider avatar nazunalika avatar odyssey4me avatar rolt avatar samdoran avatar shadow6363 avatar tchernomax avatar thetrompf avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

community.rabbitmq's Issues

Add changelog publishing

SUMMARY

In ansible-collections/overview#18 there is some debate about how collections should publish changelogs. This collection currently has no changelog, so we need to create one using one of the many available methods and publish it.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Do not append -n 'rabbit' parameter by default to rabbitmq_user module invocation

SUMMARY

As also reported and fixed in ansible/ansible-modules-extras@3013f05 the rabbitmq_user module adds -n parameter by default with a default value "rabbit":

The latest stable version line of code responsible for the "bug":
https://github.com/ansible/ansible/blame/ff7bbbcaf1e8f434432075bc9c55626a9dd3091d/lib/ansible/modules/messaging/rabbitmq/rabbitmq_user.py#L252

ISSUE TYPE
  • Bug Report
COMPONENT NAME

rabbitmq_user messaging module

ANSIBLE VERSION
ansible 2.9.7
CONFIGURATION

Not relevant, problem identified in the code.

OS / ENVIRONMENT

Not relevant, problem identified in the code.

STEPS TO REPRODUCE
- name: "[810] delete guest"
  rabbitmq_user:
    user:  "guest"
    state: "absent"
EXPECTED RESULTS

No default "-n 'rabbit'' parameter is used and user is removed.

ACTUAL RESULTS

output:

{
    "changed": false,
    "cmd": "/opt/rabbitmq/sbin/rabbitmqctl -q -n rabbit list_users",
    "msg": "\n07:********@bcd0cc70bfa9'. Please see diagnostics information and suggestions below.\n\nMost common reasons for this are:\n\n * Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)\n * CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)\n * Target node is not running\n\nIn addition to the diagnostics info below:\n\n * See the CLI, clustering and networking guides on http://rabbitmq.com/documentation.html to learn more\n * Consult server logs on node rabbit@bcd0cc70bfa9\n\nDIAGNOSTICS\n===========\n\nattempted to contact:********@bcd0cc70bfa9:\n  * connected to epmd (port 4369) on bcd0cc70bfa9\n  * epmd reports node 'rabbit' uses port 25672 for inter-node and CLI tool traffic \n  * TCP connection succeeded but Erlang distribution failed \n  * suggestion: check if the Erlang cookie identical for all server nodes and CLI tools\n  * suggestion: check if all server nodes and CLI tools use consistent hostnames when addressing each other\n  * suggestion: check if inter-node connections may be configured to use TLS. If so, all nodes and CLI tools must do that\n   * suggestion: see the CLI, clustering and networking guides on http://rabbitmq.com/documentation.html to learn more\n\n\nCurrent node details:********@dev20-rabbitmq-1.argos-test.merlin'\n * effective user's home directory: /var/lib/rabbitmq\n * Erlang cookie hash: fwFzSmDgSM91iqx2okyVOg==",
    "rc": 69,
    "stderr": "\n07:52:49.335 [error] ** System running to use fully qualified hostnames **\n** Hostname bcd0cc70bfa9 is illegal **\n\n\n07:52:49.348 [error] ** System running to use fully qualified hostnames **\n** Hostname bcd0cc70bfa9 is illegal **\n\nError: unable to perform an operation on node 'rabbit@bcd0cc70bfa9'. Please see diagnostics information and suggestions below.\n\nMost common reasons for this are:\n\n * Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)\n * CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)\n * Target node is not running\n\nIn addition to the diagnostics info below:\n\n * See the CLI, clustering and networking guides on http://rabbitmq.com/documentation.html to learn more\n * Consult server logs on node rabbit@bcd0cc70bfa9\n\nDIAGNOSTICS\n===========\n\nattempted to contact: [rabbit@bcd0cc70bfa9]\n\nrabbit@bcd0cc70bfa9:\n  * connected to epmd (port 4369) on bcd0cc70bfa9\n  * epmd reports node 'rabbit' uses port 25672 for inter-node and CLI tool traffic \n  * TCP connection succeeded but Erlang distribution failed \n  * suggestion: check if the Erlang cookie identical for all server nodes and CLI tools\n  * suggestion: check if all server nodes and CLI tools use consistent hostnames when addressing each other\n  * suggestion: check if inter-node connections may be configured to use TLS. If so, all nodes and CLI tools must do that\n   * suggestion: see the CLI, clustering and networking guides on http://rabbitmq.com/documentation.html to learn more\n\n\nCurrent node details:\n * node name: '[email protected]'\n * effective user's home directory: /var/lib/rabbitmq\n * Erlang cookie hash: fwFzSmDgSM91iqx2okyVOg==\n\n",
    "stderr_lines": [
        "",
        "07:52:49.335 [error] ** System running to use fully qualified hostnames **",
        "** Hostname bcd0cc70bfa9 is illegal **",
...

rabbitmq_policy json.decoder error when trying to apply a policy

SUMMARY

When trying to apply a policy, a json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) error appears.

ISSUE TYPE
  • Bug Report
COMPONENT NAME

community.rabbitmq.rabbitmq_policy

ANSIBLE VERSION
ansible 2.9.16
  config file = /home/ansible/infrastructure/ansible/ansible.cfg
  configured module search path = ['/home/ansible/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Aug 24 2020, 17:57:11) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
CONFIGURATION
ANSIBLE_FORCE_COLOR(/home/ansible/infrastructure/ansible/ansible.cfg) = True
ANSIBLE_NOCOWS(/home/ansible/infrastructure/ansible/ansible.cfg) = True
ANSIBLE_SSH_ARGS(/home/ansible/infrastructure/ansible/ansible.cfg) = -C -o ControlMaster=auto -o ControlPersist=60s -o GSSAPIAuthentication=no
CACHE_PLUGIN(/home/ansible/infrastructure/ansible/ansible.cfg) = memory
CACHE_PLUGIN_TIMEOUT(/home/ansible/infrastructure/ansible/ansible.cfg) = 1800
COLLECTIONS_PATHS(/home/ansible/infrastructure/ansible/ansible.cfg) = ['/home/ansible/infrastructure/ansible/collections']
COMMAND_WARNINGS(/home/ansible/infrastructure/ansible/ansible.cfg) = True
DEFAULT_FORKS(/home/ansible/infrastructure/ansible/ansible.cfg) = 20
DEFAULT_GATHERING(/home/ansible/infrastructure/ansible/ansible.cfg) = smart
DEFAULT_LOG_PATH(/home/ansible/infrastructure/ansible/ansible.cfg) = /home/ansible/infrastructure/ansible/tmp/ansible.log
DEFAULT_MANAGED_STR(/home/ansible/infrastructure/ansible/ansible.cfg) = Ansible managed
DEFAULT_NO_LOG(/home/ansible/infrastructure/ansible/ansible.cfg) = False
DEFAULT_ROLES_PATH(/home/ansible/infrastructure/ansible/ansible.cfg) = ['/home/ansible/infrastructure/ansible/roles/local', '/home/ansible/infrastructure/ansible/roles/public']
DEFAULT_STRATEGY(/home/ansible/infrastructure/ansible/ansible.cfg) = free
DISPLAY_ARGS_TO_STDOUT(/home/ansible/infrastructure/ansible/ansible.cfg) = False
DISPLAY_SKIPPED_HOSTS(/home/ansible/infrastructure/ansible/ansible.cfg) = False
RETRY_FILES_ENABLED(/home/ansible/infrastructure/ansible/ansible.cfg) = True
OS / ENVIRONMENT

CentOS 8.3, x86_64
RabbitMQ 3.8.3

STEPS TO REPRODUCE

Create a simple playbook with a set of tasks to create a virtual host and then apply a policy to the vhost.

- name: Configure pubsub virtual host
  community.rabbitmq.rabbitmq_vhost:
    name: /pubsub
    state: present

- name: Configure an HA policy for pubsub
  community.rabbitmq.rabbitmq_policy:
    name: HA
    apply_to: queues
    pattern: ".*"
    tags:
      ha-mode: all
      ha-sync-mode: automatic
      ha-sync-batch-size: 10000
    vhost: /pubsub
EXPECTED RESULTS

Vhost is created and policy is successfully applied.

ACTUAL RESULTS

The playbook errors out with a module error.

The full traceback is:
Traceback (most recent call last):
  File "/home/ansible/.ansible/tmp/ansible-tmp-1611654783.6917102-146428-116716834350778/AnsiballZ_rabbitmq_policy.py", line 102, in <module>
    _ansiballz_main()
  File "/home/ansible/.ansible/tmp/ansible-tmp-1611654783.6917102-146428-116716834350778/AnsiballZ_rabbitmq_policy.py", line 94, in _ansiballz_main
    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
  File "/home/ansible/.ansible/tmp/ansible-tmp-1611654783.6917102-146428-116716834350778/AnsiballZ_rabbitmq_policy.py", line 40, in invoke_module
    runpy.run_module(mod_name='ansible_collections.community.rabbitmq.plugins.modules.rabbitmq_policy', init_globals=None, run_name='__main__', alter_sys=True)
  File "/usr/lib64/python3.6/runpy.py", line 205, in run_module
    return _run_module_code(code, init_globals, run_name, mod_spec)
  File "/usr/lib64/python3.6/runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "/usr/lib64/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmp/ansible_community.rabbitmq.rabbitmq_policy_payload__4toqeqo/ansible_community.rabbitmq.rabbitmq_policy_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_policy.py", line 248, in <module>
  File "/tmp/ansible_community.rabbitmq.rabbitmq_policy_payload__4toqeqo/ansible_community.rabbitmq.rabbitmq_policy_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_policy.py", line 237, in main
  File "/tmp/ansible_community.rabbitmq.rabbitmq_policy_payload__4toqeqo/ansible_community.rabbitmq.rabbitmq_policy_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_policy.py", line 161, in has_modifications
  File "/tmp/ansible_community.rabbitmq.rabbitmq_policy_payload__4toqeqo/ansible_community.rabbitmq.rabbitmq_policy_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_policy.py", line 161, in <genexpr>
  File "/tmp/ansible_community.rabbitmq.rabbitmq_policy_payload__4toqeqo/ansible_community.rabbitmq.rabbitmq_policy_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_policy.py", line 198, in _policy_check
  File "/usr/lib64/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/usr/lib64/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib64/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
fatal: [ord1-prod-rabbitmq001.example.com]: FAILED! => {
    "changed": false,
    "module_stderr": "Shared connection to 10.XX.XX.XX closed.\r\n",
    "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ansible/.ansible/tmp/ansible-tmp-1611654783.6917102-146428-116716834350778/AnsiballZ_rabbitmq_policy.py\", line 102, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ansible/.ansible/tmp/ansible-tmp-1611654783.6917102-146428-116716834350778/AnsiballZ_rabbitmq_policy.py\", line 94, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ansible/.ansible/tmp/ansible-tmp-1611654783.6917102-146428-116716834350778/AnsiballZ_rabbitmq_policy.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.rabbitmq.plugins.modules.rabbitmq_policy', init_globals=None, run_name='__main__', alter_sys=True)\r\n  File \"/usr/lib64/python3.6/runpy.py\", line 205, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib64/python3.6/runpy.py\", line 96, in _run_module_code\r\n    mod_name, mod_spec, pkg_name, script_name)\r\n  File \"/usr/lib64/python3.6/runpy.py\", line 85, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_community.rabbitmq.rabbitmq_policy_payload__4toqeqo/ansible_community.rabbitmq.rabbitmq_policy_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_policy.py\", line 248, in <module>\r\n  File \"/tmp/ansible_community.rabbitmq.rabbitmq_policy_payload__4toqeqo/ansible_community.rabbitmq.rabbitmq_policy_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_policy.py\", line 237, in main\r\n  File \"/tmp/ansible_community.rabbitmq.rabbitmq_policy_payload__4toqeqo/ansible_community.rabbitmq.rabbitmq_policy_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_policy.py\", line 161, in has_modifications\r\n  File \"/tmp/ansible_community.rabbitmq.rabbitmq_policy_payload__4toqeqo/ansible_community.rabbitmq.rabbitmq_policy_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_policy.py\", line 161, in <genexpr>\r\n  File \"/tmp/ansible_community.rabbitmq.rabbitmq_policy_payload__4toqeqo/ansible_community.rabbitmq.rabbitmq_policy_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_policy.py\", line 198, in _policy_check\r\n  File \"/usr/lib64/python3.6/json/__init__.py\", line 354, in loads\r\n    return _default_decoder.decode(s)\r\n  File \"/usr/lib64/python3.6/json/decoder.py\", line 339, in decode\r\n    obj, end = self.raw_decode(s, idx=_w(s, 0).end())\r\n  File \"/usr/lib64/python3.6/json/decoder.py\", line 357, in raw_decode\r\n    raise JSONDecodeError(\"Expecting value\", s, err.value) from None\r\njson.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\r\n",
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
    "rc": 1
}

Add unit testing for plugins/modules/rabbitmq_vhost.py

SUMMARY

There is no unit testing for this module. Add unit testing to ensure that the module behaves consistently with all changes made to it. Try to add some negative testing too.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Add unit testing for plugins/modules/rabbitmq_publish.py

SUMMARY

There is no unit testing for this module. Add unit testing to ensure that the module behaves consistently with all changes made to it. Try to add some negative testing too.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Add collection build test

SUMMARY

As part of the testing for the collection, we should verify that it builds correctly. This should be a distinct test.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Improve examples formatting

SUMMARY

As was spotted in #73 (comment),
the format of the examples can be improved to

- name: Do something
  community.rabbitmq.rabbitmq_module:
    ...

or if a task descr is long

- name: |-
    Here is my very very long explanation of
    what this task is doing and how and for what in details
  community.rabbitmq.rabbitmq_module:
    ...
ISSUE TYPE
  • Documentation Report
COMPONENT NAME

All the modules need to be checked

Volunteer help wanted

Unfortunately I'm not able to commit as much time as I'd like to the maintenance and continuous improvement of this repository. I would appreciate it if some others could step up to take on any or all of these roles:

  1. Development of improvements - looking at the code base and improving its readability, maintainability and testability.
  2. Development of bug fixes - fixing reported bugs and implementing tests to ensure they do not happen with any future changes.
  3. Triaging of bug reports - validating the bug and providing a test playbook to reproduce it.

Please feel free to reply to this issue to volunteer.

Document standards for developers

SUMMARY

There is no documentation for what is required when developing modules, plugins, etc. Add some documentation.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

[rabbitmq_user] permissions: with multiple vhosts breaks functionality in 2.7.2

Thank you very much for your interest in Ansible. This plugin is no longer maintained in this repository and has been migrated to https://github.com/ansible-collections/community.rabbitmq

Please re-submit this issue in the above repository.

If you have further questions please stop by IRC or the mailing list:

See: ansible/ansible#48890

It's really hard for me to comprehend how this issue can be open for 2 years with pull requests that fix it, people occasionally pinging for an update and now the old issue just gets closed with "reopen it in this other repo"... Is it gonna sit here as well now for 2 years? Very frustrating 😠

Can we get this fixed/merged...?

rabbitmq_user doesn't support Ansible check mode

SUMMARY

When applied with ansible --check, the rabbitmq_user module always makes any required changes to the users anyway. This is unexpected behaviour and potentially disruptive to the RabbitMQ service.

ISSUE TYPE
  • Bug Report
COMPONENT NAME

rabbitmq_user

ANSIBLE VERSION
ansible 2.9.23
  config file = /home/test/src/working/ansible/ansible.cfg
  configured module search path = [u'/usr/share/ansible']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
COLLECTION VERSION
Collection         Version
------------------ -------
community.rabbitmq 1.1.0  
CONFIGURATION
ANSIBLE_PIPELINING(/home/test/src/working/ansible/ansible.cfg) = True
DEFAULT_MODULE_PATH(/home/test/src/working/ansible/ansible.cfg) = [u'/usr/share/ansible']
HOST_KEY_CHECKING(/home/test/src/working/ansible/ansible.cfg) = False
TRANSFORM_INVALID_GROUP_CHARS(/home/test/src/working/ansible/ansible.cfg) = ignore
OS / ENVIRONMENT

CentOS 7.9

STEPS TO REPRODUCE

Create a new RabbitMQ user using the rabbitmq_user module, but apply the playbook using ansible-playbook --check, which should show what would happen.

- hosts: all
  become: true
  tasks:
  - name: configure rabbitmq users
    community.rabbitmq.rabbitmq_user:
      name: "test-user"
      password: "pebhebEk"
      configure_priv: "^$"
      read_priv: "^$"
      write_priv: "^$"
      state: "present"
$ ansible-playbook -i hosts rabbitmq-test.yml -l mqserver.test.com -K --check -v
$ ansible-playbook -i hosts rabbitmq-test.yml -l mqserver.test.com -K --check -v
EXPECTED RESULTS

Ansible output would consistently show 'changed: [mqserver.test.com] => {"changed": true, ...}' for task but test-user would not actually be created on RabbitMQ host.

ACTUAL RESULTS

test-user is created the first time playbook is applied with --check. A second run outputs 'ok: ... "changed": false', indicating that the user now exists.

ansible(master)] 1023$ ansible-playbook -i hosts rabbitmq-test.yml -l mqserver.test.com -K --check -v
Using /home/test/src/working/ansible/ansible.cfg as config file
BECOME password: 

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [mqserver.test.com]

TASK [configure rabbitmq users] ************************************************
changed: [mqserver.test.com] => {"changed": true, "state": "present", "user": "test-user"}

PLAY RECAP *********************************************************************
mqserver.test.com          : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansible(master)] 1024$ ansible-playbook -i hosts rabbitmq-test.yml -l mqserver.test.com -K --check -v
Using /home/test/src/working/ansible/ansible.cfg as config file
BECOME password: 

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [mqserver.test.com]

TASK [configure rabbitmq users] ************************************************
ok: [mqserver.test.com] => {"changed": false, "state": "present", "user": "test-user"}

PLAY RECAP *********************************************************************
mqserver.test.com          : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


[root@mqserver test]# rabbitmqctl list_users | grep test-user
test-user	[]

This is because the code for rabbitmq_user.py does not include support for running in check mode (e.g. compare implementation of _exec() with rabbitmq_vhost.py, which explicitly tests for check_mode being enabled and does not execute rabbitmqctl if so).
I have a modified rabbitmq_user implementation that includes check_mode support (based on rabbitmq_vhost.py) if you want a PR.

Add support for user limits introduced in RabbitMQ 3.8.10

SUMMARY

As of RabbitMQ release 3.8.10, per-user limits are supported for max-connections and max-channels. It will be great if this collections supports managing those (possibly similarly as it is done for rabbitmq_vhost_limits

ISSUE TYPE
  • Feature Idea
COMPONENT NAME

It could be a new rabbitmq_user_limits task.

ADDITIONAL INFORMATION

Proposed syntax:

# Limit both of the max number of connections and channels on the user 'guest'.
- community.rabbitmq.rabbitmq_user_limits:
    user: guest
    max_connections: 64
    max_channels: 256
    state: present

Add automated collection publishing

SUMMARY

We should automate the publishing of a collection to ansible galaxy.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Release plan

SUMMARY

(partially copied from ansible-collections/community.crypto#74)

We should decide eventually on how to release this collection (w.r.t. versioning).
Small collections like this one don't need a complex plan like the one for community.general and community.network.
So how about the following?

  1. Release minor and patch releases whenever we want (like after adding new features or fixing bugs). Since this collection is small, there's no need to fix things in advance. Just add features, and after a feature either wait a bit longer for more features/bugs, or make a release.

I suggest releasing without branching https://github.com/ansible/community-docs/blob/main/releasing_collections_without_release_branches.rst

Once we release a 2.0.0 (with some breaking change relative to 1.x.y), we can have a stable-1 branch so we can backport bugfixes (or even features) if needed, and release more 1.x.y versions.

Add unit testing for plugins/modules/rabbitmq_exchange.py

SUMMARY

There is no unit testing for this module. Add unit testing to ensure that the module behaves consistently with all changes made to it. Try to add some negative testing too.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Release a new version

The master branch contains several commits. At least 351d9fb should fix #47.

SUMMARY

Can the current master branch be released so that users benefit from the fixes?

community.rabbitmq.rabbitmq_plugin - No option to specify "node"

SUMMARY

Community.rabbitmq.rabbitmq_plugin module does not have the ability to specify the RabbitMQ node name. If/when the node name is not the default "rabbit", this module will report false success.

ISSUE TYPE
  • Bug Report
COMPONENT NAME

community.rabbitmq.rabbitmq_plugin

ANSIBLE VERSION
ansible 2.9.17
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/var/lib/awx/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Aug 24 2020, 17:57:11) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
CONFIGURATION
ACTION_WARNINGS(default) = True
AGNOSTIC_BECOME_PROMPT(default) = True
ALLOW_WORLD_READABLE_TMPFILES(default) = False
ANSIBLE_CONNECTION_PATH(default) = None
ANSIBLE_COW_PATH(default) = None
ANSIBLE_COW_SELECTION(default) = default
ANSIBLE_COW_WHITELIST(default) = ['bud-frogs', 'bunny', 'cheese', 'daemon', 'default', 'dragon', 'elephant-in->
ANSIBLE_FORCE_COLOR(default) = False
ANSIBLE_NOCOLOR(default) = False
ANSIBLE_NOCOWS(default) = False
ANSIBLE_PIPELINING(default) = False
ANSIBLE_SSH_ARGS(default) = -C -o ControlMaster=auto -o ControlPersist=60s
ANSIBLE_SSH_CONTROL_PATH(default) = None
ANSIBLE_SSH_CONTROL_PATH_DIR(default) = ~/.ansible/cp
ANSIBLE_SSH_EXECUTABLE(default) = ssh
ANSIBLE_SSH_RETRIES(default) = 0
ANY_ERRORS_FATAL(default) = False
BECOME_ALLOW_SAME_USER(default) = False
BECOME_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/become', '/usr/share/ansible/plugins/become']
CACHE_PLUGIN(default) = memory
CACHE_PLUGIN_CONNECTION(default) = None
CACHE_PLUGIN_PREFIX(default) = ansible_facts
CACHE_PLUGIN_TIMEOUT(default) = 86400
COLLECTIONS_PATHS(default) = ['/var/lib/awx/.ansible/collections', '/usr/share/ansible/collections']
COLOR_CHANGED(default) = yellow
COLOR_CONSOLE_PROMPT(default) = white
COLOR_DEBUG(default) = dark gray
COLOR_DEPRECATE(default) = purple
COLOR_DIFF_ADD(default) = green
COLOR_DIFF_LINES(default) = cyan
COLOR_DIFF_REMOVE(default) = red
COLOR_ERROR(default) = red
COLOR_HIGHLIGHT(default) = white
COLOR_OK(default) = green
COLOR_SKIP(default) = cyan
COLOR_UNREACHABLE(default) = bright red
COLOR_VERBOSE(default) = blue
COLOR_WARN(default) = bright purple
COMMAND_WARNINGS(default) = True
CONDITIONAL_BARE_VARS(default) = True
CONNECTION_FACTS_MODULES(default) = {'asa': 'asa_facts', 'cisco.asa.asa': 'cisco.asa.asa_facts', 'eos': 'eos_f>
COVERAGE_REMOTE_OUTPUT(default) = None
COVERAGE_REMOTE_WHITELIST(default) = *
DEFAULT_ACTION_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/action', '/usr/share/ansible/plugins/act>
DEFAULT_ALLOW_UNSAFE_LOOKUPS(default) = False
DEFAULT_ASK_PASS(default) = False
DEFAULT_ASK_VAULT_PASS(default) = False
DEFAULT_BECOME(default) = False
DEFAULT_BECOME_ASK_PASS(default) = False
DEFAULT_BECOME_EXE(default) = None
DEFAULT_BECOME_FLAGS(default) =
DEFAULT_BECOME_METHOD(default) = sudo
DEFAULT_BECOME_USER(default) = root
DEFAULT_CACHE_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/cache', '/usr/share/ansible/plugins/cache>
DEFAULT_CALLABLE_WHITELIST(default) = []
DEFAULT_CALLBACK_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/callback', '/usr/share/ansible/plugins>
DEFAULT_CALLBACK_WHITELIST(default) = []
DEFAULT_CLICONF_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/cliconf', '/usr/share/ansible/plugins/c>
DEFAULT_CONNECTION_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/connection', '/usr/share/ansible/plu>
DEFAULT_DEBUG(default) = False
DEFAULT_EXECUTABLE(default) = /bin/sh
DEFAULT_FACT_PATH(default) = None
DEFAULT_FILTER_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/filter', '/usr/share/ansible/plugins/fil>
DEFAULT_FORCE_HANDLERS(default) = False
DEFAULT_FORKS(default) = 5
DEFAULT_GATHERING(default) = implicit
DEFAULT_GATHER_SUBSET(default) = ['all']
DEFAULT_GATHER_TIMEOUT(default) = 10
DEFAULT_HANDLER_INCLUDES_STATIC(default) = False
DEFAULT_HASH_BEHAVIOUR(default) = replace
DEFAULT_HOST_LIST(default) = ['/etc/ansible/hosts']
DEFAULT_HTTPAPI_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/httpapi', '/usr/share/ansible/plugins/h>
DEFAULT_INTERNAL_POLL_INTERVAL(default) = 0.001
DEFAULT_INVENTORY_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/inventory', '/usr/share/ansible/plugi>
DEFAULT_JINJA2_EXTENSIONS(default) = []
DEFAULT_JINJA2_NATIVE(default) = False
DEFAULT_KEEP_REMOTE_FILES(default) = False
DEFAULT_LIBVIRT_LXC_NOSECLABEL(default) = False
DEFAULT_LOAD_CALLBACK_PLUGINS(default) = False
DEFAULT_LOCAL_TMP(default) = /var/lib/awx/.ansible/tmp/ansible-local-84395ose6fvva
DEFAULT_LOG_FILTER(default) = []
DEFAULT_LOG_PATH(default) = None
DEFAULT_LOOKUP_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/lookup', '/usr/share/ansible/plugins/loo>
DEFAULT_MANAGED_STR(default) = Ansible managed
DEFAULT_MODULE_ARGS(default) =
DEFAULT_MODULE_COMPRESSION(default) = ZIP_DEFLATED
DEFAULT_MODULE_NAME(default) = command
DEFAULT_MODULE_PATH(default) = ['/var/lib/awx/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
DEFAULT_MODULE_UTILS_PATH(default) = ['/var/lib/awx/.ansible/plugins/module_utils', '/usr/share/ansible/plugin>
DEFAULT_NETCONF_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/netconf', '/usr/share/ansible/plugins/n>
DEFAULT_NO_LOG(default) = False
DEFAULT_NO_TARGET_SYSLOG(default) = False
DEFAULT_NULL_REPRESENTATION(default) = None
DEFAULT_POLL_INTERVAL(default) = 15
DEFAULT_PRIVATE_KEY_FILE(default) = None
DEFAULT_PRIVATE_ROLE_VARS(default) = False
DEFAULT_REMOTE_PORT(default) = None
DEFAULT_REMOTE_USER(default) = None
DEFAULT_ROLES_PATH(default) = ['/var/lib/awx/.ansible/roles', '/usr/share/ansible/roles', '/etc/ansible/roles']
DEFAULT_SCP_IF_SSH(default) = smart
DEFAULT_SELINUX_SPECIAL_FS(default) = ['fuse', 'nfs', 'vboxsf', 'ramfs', '9p', 'vfat']
DEFAULT_SFTP_BATCH_MODE(default) = True
DEFAULT_SQUASH_ACTIONS(default) = ['apk', 'apt', 'dnf', 'homebrew', 'openbsd_pkg', 'pacman', 'pip', 'pkgng', '>
DEFAULT_SSH_TRANSFER_METHOD(default) = None
DEFAULT_STDOUT_CALLBACK(default) = default
DEFAULT_STRATEGY(default) = linear
DEFAULT_STRATEGY_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/strategy', '/usr/share/ansible/plugins>
DEFAULT_SU(default) = False
DEFAULT_SYSLOG_FACILITY(default) = LOG_USER
DEFAULT_TASK_INCLUDES_STATIC(default) = False
DEFAULT_TERMINAL_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/terminal', '/usr/share/ansible/plugins>
DEFAULT_TEST_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/test', '/usr/share/ansible/plugins/test']
DEFAULT_TIMEOUT(default) = 10
DEFAULT_TRANSPORT(default) = smart
DEFAULT_UNDEFINED_VAR_BEHAVIOR(default) = True
DEFAULT_VARS_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/vars', '/usr/share/ansible/plugins/vars']
DEFAULT_VAULT_ENCRYPT_IDENTITY(default) = None
DEFAULT_VAULT_IDENTITY(default) = default
DEFAULT_VAULT_IDENTITY_LIST(default) = []
DEFAULT_VAULT_ID_MATCH(default) = False
DEFAULT_VAULT_PASSWORD_FILE(default) = None
DEFAULT_VERBOSITY(default) = 0
DEPRECATION_WARNINGS(default) = True
DIFF_ALWAYS(default) = False
DIFF_CONTEXT(default) = 3
DISPLAY_ARGS_TO_STDOUT(default) = False
DISPLAY_SKIPPED_HOSTS(default) = True
DOCSITE_ROOT_URL(default) = https://docs.ansible.com/ansible/
DOC_FRAGMENT_PLUGIN_PATH(default) = ['/var/lib/awx/.ansible/plugins/doc_fragments', '/usr/share/ansible/plugin>
DUPLICATE_YAML_DICT_KEY(default) = warn
ENABLE_TASK_DEBUGGER(default) = False
ERROR_ON_MISSING_HANDLER(default) = True
FACTS_MODULES(default) = ['smart']
GALAXY_IGNORE_CERTS(default) = False
GALAXY_ROLE_SKELETON(default) = None
GALAXY_ROLE_SKELETON_IGNORE(default) = ['^.git$', '^.*/.git_keep$']
GALAXY_SERVER(default) = https://galaxy.ansible.com
GALAXY_SERVER_LIST(default) = None
GALAXY_TOKEN_PATH(default) = /var/lib/awx/.ansible/galaxy_token
HOST_KEY_CHECKING(default) = True
HOST_PATTERN_MISMATCH(default) = warning
INJECT_FACTS_AS_VARS(default) = True
INTERPRETER_PYTHON(default) = auto_legacy
INTERPRETER_PYTHON_DISTRO_MAP(default) = {'centos': {'6': '/usr/bin/python', '8': '/usr/libexec/platform-pytho>
INTERPRETER_PYTHON_FALLBACK(default) = ['/usr/bin/python', 'python3.7', 'python3.6', 'python3.5', 'python2.7',>
INVALID_TASK_ATTRIBUTE_FAILED(default) = True
INVENTORY_ANY_UNPARSED_IS_FAILED(default) = False
INVENTORY_CACHE_ENABLED(default) = False
INVENTORY_CACHE_PLUGIN(default) = None
INVENTORY_CACHE_PLUGIN_CONNECTION(default) = None
INVENTORY_CACHE_PLUGIN_PREFIX(default) = ansible_facts
INVENTORY_CACHE_TIMEOUT(default) = 3600
INVENTORY_ENABLED(default) = ['host_list', 'script', 'auto', 'yaml', 'ini', 'toml']
INVENTORY_EXPORT(default) = False
INVENTORY_IGNORE_EXTS(default) = {{(BLACKLIST_EXTS + ( '.orig', '.ini', '.cfg', '.retry'))}}
INVENTORY_IGNORE_PATTERNS(default) = []
INVENTORY_UNPARSED_IS_FAILED(default) = False
LOCALHOST_WARNING(default) = True
MAX_FILE_SIZE_FOR_DIFF(default) = 104448
NETCONF_SSH_CONFIG(default) = None
NETWORK_GROUP_MODULES(default) = ['eos', 'nxos', 'ios', 'iosxr', 'junos', 'enos', 'ce', 'vyos', 'sros', 'dello>
OLD_PLUGIN_CACHE_CLEARING(default) = False
PARAMIKO_HOST_KEY_AUTO_ADD(default) = False
PARAMIKO_LOOK_FOR_KEYS(default) = True
PERSISTENT_COMMAND_TIMEOUT(default) = 30
PERSISTENT_CONNECT_RETRY_TIMEOUT(default) = 15
PERSISTENT_CONNECT_TIMEOUT(default) = 30
PERSISTENT_CONTROL_PATH_DIR(default) = /var/lib/awx/.ansible/pc
PLAYBOOK_DIR(default) = None
PLAYBOOK_VARS_ROOT(default) = top
PLUGIN_FILTERS_CFG(default) = None
PYTHON_MODULE_RLIMIT_NOFILE(default) = 0
RETRY_FILES_ENABLED(default) = False
RETRY_FILES_SAVE_PATH(default) = None
SHOW_CUSTOM_STATS(default) = False
STRING_CONVERSION_ACTION(default) = warn
STRING_TYPE_FILTERS(default) = ['string', 'to_json', 'to_nice_json', 'to_yaml', 'ppretty', 'json']
SYSTEM_WARNINGS(default) = True
TAGS_RUN(default) = []
TAGS_SKIP(default) = []
TASK_DEBUGGER_IGNORE_ERRORS(default) = True
TRANSFORM_INVALID_GROUP_CHARS(default) = never
USE_PERSISTENT_CONNECTIONS(default) = False
VARIABLE_PRECEDENCE(default) = ['all_inventory', 'groups_inventory', 'all_plugins_inventory', 'all_plugins_pla>
VERBOSE_TO_STDERR(default) = False
YAML_FILENAME_EXTENSIONS(default) = ['.yml', '.yaml', '.json']
OS / ENVIRONMENT

OS = CentOS 8
AWX = 17.0.1
Docker = 20.10.2 build 2291f61
Erlang = 23[erts-11.1.5]
RabbitMQ = 3.7.9
ansible_python_interpreter = auto (set globally)
AnsibleControler:
python = 3.6.8 (alternatives: python->auto->/usr/libexec/no-python, python3->auto->/usr/bin/python3.6)
Targetserver:
CentOS 7 (fresh install with latest updates)
python = 2.7.5 & 3.6.8

STEPS TO REPRODUCE
  1. Within RabbitMQ server/target, create /etc/rabbitmq/rabbitmq-env.conf file
  2. In rabbitmq-env.conf => set variable USE_LONGNAMES=true
    (essentially this changes the RabbitMQ default node name from "rabbit" to "rabbit@%localhost-FQDN%"
- name: rabbitmq_plugin_enable
  community.rabbitmq.rabbitmq_plugin:
    names: "{{ item }}"
    state: enabled
    new_only: yes
  with_items: "{{ var_rabbitmq_plugin_enable }}"

var_rabbitmq_plugin_enable:
  - rabbitmq_management
  - rabbitmq_management_agent
EXPECTED RESULTS

Should see RabbitMQ plugins management & management_agent enabled.

ACTUAL RESULTS

No plugins are enabled.

testserver02 rabbitmq]# rabbitmq-plugins list
 Configured: E = explicitly enabled; e = implicitly enabled
 | Status: * = running on [email protected]
 |/
[  ] rabbitmq_amqp1_0                  3.7.9
[  ] rabbitmq_auth_backend_cache       3.7.9
[  ] rabbitmq_auth_backend_http        3.7.9
[  ] rabbitmq_auth_backend_ldap        3.7.9
[  ] rabbitmq_auth_mechanism_ssl       3.7.9
[  ] rabbitmq_consistent_hash_exchange 3.7.9
[  ] rabbitmq_event_exchange           3.7.9
[  ] rabbitmq_federation               3.7.9
[  ] rabbitmq_federation_management    3.7.9
[  ] rabbitmq_jms_topic_exchange       3.7.9
[  ] rabbitmq_management               3.7.9
[  ] rabbitmq_management_agent         3.7.9
[  ] rabbitmq_mqtt                     3.7.9
[  ] rabbitmq_peer_discovery_aws       3.7.9
[  ] rabbitmq_peer_discovery_common    3.7.9
[  ] rabbitmq_peer_discovery_consul    3.7.9
[  ] rabbitmq_peer_discovery_etcd      3.7.9
[  ] rabbitmq_peer_discovery_k8s       3.7.9
[  ] rabbitmq_random_exchange          3.7.9
[  ] rabbitmq_recent_history_exchange  3.7.9
[  ] rabbitmq_sharding                 3.7.9
[  ] rabbitmq_shovel                   3.7.9
[  ] rabbitmq_shovel_management        3.7.9
[  ] rabbitmq_stomp                    3.7.9
[  ] rabbitmq_top                      3.7.9
[  ] rabbitmq_tracing                  3.7.9
[  ] rabbitmq_trust_store              3.7.9
[  ] rabbitmq_web_dispatch             3.7.9
[  ] rabbitmq_web_mqtt                 3.7.9
[  ] rabbitmq_web_mqtt_examples        3.7.9
[  ] rabbitmq_web_stomp                3.7.9
[  ] rabbitmq_web_stomp_examples       3.7.9
See playbook and attached file below

RabbitMQ_cluster_Enable_Plugins_False_Success.txt

This is a similar issue related to issue# https://github.com/ansible-collections/community.rabbitmq/issues/53

Missing galaxy.yml

SUMMARY

This repository needs a galaxy.yml file so that ansible-galaxy and other consumers can enumerate the namespace and the name.

ISSUE TYPE
  • Bug Report
COMPONENT NAME

galaxy.yml

Add a module to manage operator policies

SUMMARY

The rabbitmq_policy module currently supports the management of "standard" policies for RabbitMQ. Nevertheless, it does not allow to manage operator policies .

ISSUE TYPE
  • Feature Idea
COMPONENT NAME

rabbitmq_operator_policy

ADDITIONAL INFORMATION

This new module would allow to manage RabbitMQ operator policies (enforced policies set by administrators that cannot be overwritten by standard users).

Moreover, the two rabbitmqctl commands are quite similar, as you can see from the usage manual:

rabbitmqctl [--node <node>] [--longnames] [--quiet] set_policy [--vhost <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
rabbitmqctl [--node <node>] [--longnames] [--quiet] set_operator_policy [--vhost <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>

So I think we can rely on the existing rabbitmq_policy module to build one for operator policies.

It can be used to set a maximum message TTL on a specific vhost, on which you don't want to allow message retention, for example.

- name: "Set RabbitMQ operator policy"
  rabbitmq_operator_policy:
    node: "rabbit@hostname"
    name: "one-week-message-ttl"
    vhost: "1w-message-ttl-vhost"
    pattern: ".*"
    priority: "0"
    state: "present"
    apply_to: "all"
    tags:
      message-ttl: 604800000

Inclusion of community.rabbitmq in Ansible 2.10

This collection will be included in Ansible 2.10 because it contains modules and/or plugins that were included in Ansible 2.9. Please review:

DEADLINE: 2020-08-18

The latest version of the collection available on August 18 will be included in Ansible 2.10.0, except possibly newer versions which differ only in the patch level. (For details, see the roadmap). Please release version 1.0.0 of your collection by this date! If 1.0.0 does not exist, the same 0.x.y version will be used in all of Ansible 2.10 without updates, and your 1.x.y release will not be included until Ansible 2.11 (unless you request an exception at a community working group meeting and go through a demanding manual process to vouch for backwards compatibility . . . you want to avoid this!).

Follow semantic versioning rules

Your collection versioning must follow all semver rules. This means:

  • Patch level releases can only contain bugfixes;
  • Minor releases can contain new features, new modules and plugins, and bugfixes, but must not break backwards compatibility;
  • Major releases can break backwards compatibility.

Changelogs and Porting Guide

Your collection should provide data for the Ansible 2.10 changelog and porting guide. The changelog and porting guide are automatically generated from ansible-base, and from the changelogs of the included collections. All changes from the breaking_changes, major_changes, removed_features and deprecated_features sections will appear in both the changelog and the porting guide. You have two options for providing changelog fragments to include:

  1. If possible, use the antsibull-changelog tool, which uses the same changelog fragment as the ansible/ansible repository (see the documentation).
  2. If you cannot use antsibull-changelog, you can provide the changelog in a machine-readable format as changelogs/changelog.yaml inside your collection (see the documentation of changelogs/changelog.yaml format).

If you cannot contribute to the integrated Ansible changelog using one of these methods, please provide a link to your collection's changelog by creating an issue in https://github.com/ansible-community/ansible-build-data/. If you do not provide changelogs/changelog.yml or a link, users will not be able to find out what changed in your collection from the Ansible changelog and porting guide.

Make sure your collection passes the sanity tests

Run ansible-test sanity --docker -v in the collection with the latest ansible-base or stable-2.10 ansible/ansible checkout.

Keep informed

Be sure you're subscribed to:

Questions and Feedback

If you have questions or want to provide feedback, please see the Feedback section in the collection requirements.

(Internal link to keep track of issues: ansible-collections/overview#102)

CI for rabbitmq

Hi,
Have you thought about CI for rabbitmq?

Collections built around using APIs instead of local resources tend to only need testing on different Python versions, not distros. Examples would include the AWS and VMware collections.

Those using local resources should be tested on different platforms/versions: Examples would include Windows and crypto collections.
For the former, the default test container makes sense since it has all python versions available.
For the later, using the various --docker, --remote and --windows options as appropriate makes sense.

I can help get this setup

Add unit testing for plugins/modules/rabbitmq_vhost_limits.py

SUMMARY

There is no unit testing for this module. Add unit testing to ensure that the module behaves consistently with all changes made to it. Try to add some negative testing too.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Add unit testing for plugins/modules/rabbitmq_queue.py

SUMMARY

There is no unit testing for this module. Add unit testing to ensure that the module behaves consistently with all changes made to it. Try to add some negative testing too.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Add documentation publishing

SUMMARY

Documentation should be automatically published.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Add RabbitMQ install roles

SUMMARY

Add generic roles for installing rabbitmq. They should span simple use-cases (single server) to clustered server.
Since this is a collection, we can break the installation down into multiple roles so that users can pick and choose the roles they need.

I'm thinking of something similar to the roles in community.mongodb.

Are there any suggestions on how to break down the set of install roles?
Once there is some feedback, I can work on either porting or re-writing some external roles.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME

Misc rabbitmq roles

Add unit testing for plugins/modules/rabbitmq_parameter.py

SUMMARY

There is no unit testing for this module. Add unit testing to ensure that the module behaves consistently with all changes made to it. Try to add some negative testing too.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Add unit testing for plugins/modules/rabbitmq_binding.py

SUMMARY

There is no unit testing for this module. Add unit testing to ensure that the module behaves consistently with all changes made to it. Try to add some negative testing too.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Add unit testing for plugins/modules/rabbitmq_plugin.py

SUMMARY

There is no unit testing for this module. Add unit testing to ensure that the module behaves consistently with all changes made to it. Try to add some negative testing too.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Add unit testing for plugins/modules/rabbitmq_policy.py

SUMMARY

There is no unit testing for this module. Add unit testing to ensure that the module behaves consistently with all changes made to it. Try to add some negative testing too.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Add code coverage testing

SUMMARY

Currently there is no code coverage testing. We should add it, and require that all PR's include testing for anything they add.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Improve integration testing

SUMMARY

To make things going in the collection, CI, that failed, was simplified with #78

I can't invest much time as not a maintainer of this collection and not a specialist in the area.

Would be nice:

  1. Get rid of the simplification introduced with #78 replacing it with corresponding Ansible tasks. Uncomment # - stage: Docker_2_9 in .azure-pipelines/azure-pipelines.yml

  2. Add ubuntu 16.04 back to .azure-pipelines/azure-pipelines.yml against to all the branches except devel

  3. The CI triggers many distributions (like Fedora, CentOS, Suse, etc.) but tests actually run only on Ubuntu. I disabled them to reduce load on CI system. We could a) remove them from the test matrix or b) implement tests for them (for what? I think rabbitmq versions are actually important)

  4. Would be nice to run tests against several versions of rabbitmq (starting with the oldest supported and finishing with the latest one).

`rabbitmq_user`: ValueError: need more than 1 value to unpack

SUMMARY

Module rabbitmq_user crashes with message ValueError: need more than 1 value to unpack.

ISSUE TYPE
  • Bug Report
COMPONENT NAME

community.rabbitmq.rabbitmq_user

ANSIBLE VERSION
ansible 2.10.3
  config file = None
  configured module search path = ['/home/freitafr/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/freitafr/dev/repr-rabbitmq/venv/lib/python3.8/site-packages/ansible
  executable location = /home/freitafr/dev/repr-rabbitmq/venv/bin/ansible
  python version = 3.8.6 (default, Sep 30 2020, 04:00:38) [GCC 10.2.0]
CONFIGURATION
OS / ENVIRONMENT

Centos 7 (x86_64)

STEPS TO REPRODUCE

Create a virtual machine. I used the following Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.provision :ansible do |ansible|
      ansible.playbook_command = "venv/bin/ansible-playbook"
      ansible.playbook = "rabbitmq.yml"
  end
end

Run the following playbook twice.

---
- hosts: all
  tasks:
    - name: Install epel
      become: true
      yum:
        name: epel-release

    - name: Install RabbitMQ
      become: true
      yum:
        name: rabbitmq-server

    - name: Configure rabbitmq
      become: true
      copy:
        content: NODENAME=rabbit@localhost
        dest: /etc/rabbitmq/rabbitmq-env.conf
        mode: 0644

    - name: Start RabbitMQ
      become: true
      systemd:
        name: rabbitmq-server
        state: started
        enabled: yes

    # Running this playbook **twice** triggers the failure.
    - name: Remove guest user from rabbitmq
      become: true
      rabbitmq_user:
        user: guest
        state: absent
        node: rabbit@localhost
# Sequence of commands to produce the failure:
# 1. Copy Vagrantfile and rabbitmq.yml playbook in the same directory.
# Start the virtual machine, will provision it with the playbook a first time.
$ vagrant up
# Re-provision
$ vagrant provision
# See the crash.
EXPECTED RESULTS

Guest user is removed on first run. Task unchanged on second run.

ACTUAL RESULTS

An exception is raised by the module on second run:

File \"/tmp/ansible_rabbitmq_user_payload_2cDtIG/ansible_rabbitmq_user_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py\", line 431, in main
File \"/tmp/ansible_rabbitmq_user_payload_2cDtIG/ansible_rabbitmq_user_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py\", line 299, in get
ValueError: need more than 1 value to unpack\r\n
TASK [Remove guest user from rabbitmq] *****************************************
task path: /home/freitafr/dev/repr-rabbitmq/rabbitmq.yml:23
<127.0.0.1> ESTABLISH SSH CONNECTION FOR USER: vagrant
<127.0.0.1> SSH: EXEC ssh -vvv -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o Port=2205 -o 'IdentityFile="/home/freitafr/dev/repr-rabbitmq/.vagrant/machines/default/virtualbox/private_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="vagrant"' -o ConnectTimeout=30 -o ControlPath=/home/freitafr/.ansible/cp/6776d839fb 127.0.0.1 '/bin/sh -c '"'"'echo ~vagrant && sleep 0'"'"''
<127.0.0.1> (0, b'/home/vagrant\n', b'OpenSSH_8.4p1, OpenSSL 1.1.1h  22 Sep 2020\r\ndebug1: Reading configuration data /home/freitafr/.ssh/config\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug2: resolve_canonicalize: hostname 127.0.0.1 is address\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 99757\r\ndebug3: mux_client_request_session: session request sent\r\ndebug1: mux_client_request_session: master session id: 2\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Received exit status from master 0\r\n')
<127.0.0.1> ESTABLISH SSH CONNECTION FOR USER: vagrant
<127.0.0.1> SSH: EXEC ssh -vvv -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o Port=2205 -o 'IdentityFile="/home/freitafr/dev/repr-rabbitmq/.vagrant/machines/default/virtualbox/private_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="vagrant"' -o ConnectTimeout=30 -o ControlPath=/home/freitafr/.ansible/cp/6776d839fb 127.0.0.1 '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo /home/vagrant/.ansible/tmp `"&& mkdir "` echo /home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128 `" && echo ansible-tmp-1605268884.2947245-99808-103654085490128="` echo /home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128 `" ) && sleep 0'"'"''
<127.0.0.1> (0, b'ansible-tmp-1605268884.2947245-99808-103654085490128=/home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128\n', b'OpenSSH_8.4p1, OpenSSL 1.1.1h  22 Sep 2020\r\ndebug1: Reading configuration data /home/freitafr/.ssh/config\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug2: resolve_canonicalize: hostname 127.0.0.1 is address\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 99757\r\ndebug3: mux_client_request_session: session request sent\r\ndebug1: mux_client_request_session: master session id: 2\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Received exit status from master 0\r\n')
redirecting (type: modules) ansible.builtin.rabbitmq_user to community.rabbitmq.rabbitmq_user
Using module file /home/freitafr/dev/repr-rabbitmq/venv/lib/python3.8/site-packages/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py
<127.0.0.1> PUT /home/freitafr/.ansible/tmp/ansible-local-99747mcuoqykc/tmpv0hjrzce TO /home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py
<127.0.0.1> SSH: EXEC sftp -b - -vvv -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o Port=2205 -o 'IdentityFile="/home/freitafr/dev/repr-rabbitmq/.vagrant/machines/default/virtualbox/private_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="vagrant"' -o ConnectTimeout=30 -o ControlPath=/home/freitafr/.ansible/cp/6776d839fb '[127.0.0.1]'
<127.0.0.1> (0, b'sftp> put /home/freitafr/.ansible/tmp/ansible-local-99747mcuoqykc/tmpv0hjrzce /home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py\n', b'OpenSSH_8.4p1, OpenSSL 1.1.1h  22 Sep 2020\r\ndebug1: Reading configuration data /home/freitafr/.ssh/config\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug2: resolve_canonicalize: hostname 127.0.0.1 is address\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 99757\r\ndebug3: mux_client_request_session: session request sent\r\ndebug1: mux_client_request_session: master session id: 2\r\ndebug2: Remote version: 3\r\ndebug2: Server supports extension "[email protected]" revision 1\r\ndebug2: Server supports extension "[email protected]" revision 2\r\ndebug2: Server supports extension "[email protected]" revision 2\r\ndebug2: Server supports extension "[email protected]" revision 1\r\ndebug2: Server supports extension "[email protected]" revision 1\r\ndebug3: Sent message fd 3 T:16 I:1\r\ndebug3: SSH_FXP_REALPATH . -> /home/vagrant size 0\r\ndebug3: Looking up /home/freitafr/.ansible/tmp/ansible-local-99747mcuoqykc/tmpv0hjrzce\r\ndebug3: Sent message fd 3 T:17 I:2\r\ndebug3: Received stat reply T:101 I:2\r\ndebug1: Couldn\'t stat remote file: No such file or directory\r\ndebug3: Sent message SSH2_FXP_OPEN I:3 P:/home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py\r\ndebug3: Sent message SSH2_FXP_WRITE I:4 O:0 S:32768\r\ndebug3: SSH2_FXP_STATUS 0\r\ndebug3: In write loop, ack for 4 32768 bytes at 0\r\ndebug3: Sent message SSH2_FXP_WRITE I:5 O:32768 S:32768\r\ndebug3: Sent message SSH2_FXP_WRITE I:6 O:65536 S:32768\r\ndebug3: Sent message SSH2_FXP_WRITE I:7 O:98304 S:22650\r\ndebug3: SSH2_FXP_STATUS 0\r\ndebug3: In write loop, ack for 5 32768 bytes at 32768\r\ndebug3: SSH2_FXP_STATUS 0\r\ndebug3: In write loop, ack for 6 32768 bytes at 65536\r\ndebug3: SSH2_FXP_STATUS 0\r\ndebug3: In write loop, ack for 7 22650 bytes at 98304\r\ndebug3: Sent message SSH2_FXP_CLOSE I:4\r\ndebug3: SSH2_FXP_STATUS 0\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Received exit status from master 0\r\n')
<127.0.0.1> ESTABLISH SSH CONNECTION FOR USER: vagrant
<127.0.0.1> SSH: EXEC ssh -vvv -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o Port=2205 -o 'IdentityFile="/home/freitafr/dev/repr-rabbitmq/.vagrant/machines/default/virtualbox/private_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="vagrant"' -o ConnectTimeout=30 -o ControlPath=/home/freitafr/.ansible/cp/6776d839fb 127.0.0.1 '/bin/sh -c '"'"'chmod u+x /home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/ /home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py && sleep 0'"'"''
<127.0.0.1> (0, b'', b'OpenSSH_8.4p1, OpenSSL 1.1.1h  22 Sep 2020\r\ndebug1: Reading configuration data /home/freitafr/.ssh/config\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug2: resolve_canonicalize: hostname 127.0.0.1 is address\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 99757\r\ndebug3: mux_client_request_session: session request sent\r\ndebug1: mux_client_request_session: master session id: 2\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Received exit status from master 0\r\n')
<127.0.0.1> ESTABLISH SSH CONNECTION FOR USER: vagrant
<127.0.0.1> SSH: EXEC ssh -vvv -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o Port=2205 -o 'IdentityFile="/home/freitafr/dev/repr-rabbitmq/.vagrant/machines/default/virtualbox/private_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="vagrant"' -o ConnectTimeout=30 -o ControlPath=/home/freitafr/.ansible/cp/6776d839fb -tt 127.0.0.1 '/bin/sh -c '"'"'sudo -H -S -n  -u root /bin/sh -c '"'"'"'"'"'"'"'"'echo BECOME-SUCCESS-cwmrbhfnehddhwkaptdlfieroprszduh ; /usr/bin/python /home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py'"'"'"'"'"'"'"'"' && sleep 0'"'"''
Escalation succeeded
<127.0.0.1> (1, b'Traceback (most recent call last):\r\n  File "/home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py", line 102, in <module>\r\n    _ansiballz_main()\r\n  File "/home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py", line 94, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File "/home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py", line 40, in invoke_module\r\n    runpy.run_module(mod_name=\'ansible_collections.community.rabbitmq.plugins.modules.rabbitmq_user\', init_globals=None, run_name=\'__main__\', alter_sys=True)\r\n  File "/usr/lib64/python2.7/runpy.py", line 176, in run_module\r\n    fname, loader, pkg_name)\r\n  File "/usr/lib64/python2.7/runpy.py", line 82, in _run_module_code\r\n    mod_name, mod_fname, mod_loader, pkg_name)\r\n  File "/usr/lib64/python2.7/runpy.py", line 72, in _run_code\r\n    exec code in run_globals\r\n  File "/tmp/ansible_rabbitmq_user_payload_2cDtIG/ansible_rabbitmq_user_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py", line 463, in <module>\r\n  File "/tmp/ansible_rabbitmq_user_payload_2cDtIG/ansible_rabbitmq_user_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py", line 431, in main\r\n  File "/tmp/ansible_rabbitmq_user_payload_2cDtIG/ansible_rabbitmq_user_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py", line 299, in get\r\nValueError: need more than 1 value to unpack\r\n', b'OpenSSH_8.4p1, OpenSSL 1.1.1h  22 Sep 2020\r\ndebug1: Reading configuration data /home/freitafr/.ssh/config\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug2: resolve_canonicalize: hostname 127.0.0.1 is address\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 99757\r\ndebug3: mux_client_request_session: session request sent\r\ndebug1: mux_client_request_session: master session id: 2\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Received exit status from master 1\r\nShared connection to 127.0.0.1 closed.\r\n')
<127.0.0.1> Failed to connect to the host via ssh: OpenSSH_8.4p1, OpenSSL 1.1.1h  22 Sep 2020
debug1: Reading configuration data /home/freitafr/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: resolve_canonicalize: hostname 127.0.0.1 is address
debug1: auto-mux: Trying existing master
debug2: fd 3 setting O_NONBLOCK
debug2: mux_client_hello_exchange: master version 4
debug3: mux_client_forwards: request forwardings: 0 local, 0 remote
debug3: mux_client_request_session: entering
debug3: mux_client_request_alive: entering
debug3: mux_client_request_alive: done pid = 99757
debug3: mux_client_request_session: session request sent
debug1: mux_client_request_session: master session id: 2
debug3: mux_client_read_packet: read header failed: Broken pipe
debug2: Received exit status from master 1
Shared connection to 127.0.0.1 closed.
<127.0.0.1> ESTABLISH SSH CONNECTION FOR USER: vagrant
<127.0.0.1> SSH: EXEC ssh -vvv -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o Port=2205 -o 'IdentityFile="/home/freitafr/dev/repr-rabbitmq/.vagrant/machines/default/virtualbox/private_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="vagrant"' -o ConnectTimeout=30 -o ControlPath=/home/freitafr/.ansible/cp/6776d839fb 127.0.0.1 '/bin/sh -c '"'"'rm -f -r /home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/ > /dev/null 2>&1 && sleep 0'"'"''
<127.0.0.1> (0, b'', b'OpenSSH_8.4p1, OpenSSL 1.1.1h  22 Sep 2020\r\ndebug1: Reading configuration data /home/freitafr/.ssh/config\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug2: resolve_canonicalize: hostname 127.0.0.1 is address\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 99757\r\ndebug3: mux_client_request_session: session request sent\r\ndebug1: mux_client_request_session: master session id: 2\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Received exit status from master 0\r\n')
The full traceback is:
Traceback (most recent call last):
  File "/home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py", line 102, in <module>
    _ansiballz_main()
  File "/home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py", line 94, in _ansiballz_main
    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
  File "/home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py", line 40, in invoke_module
    runpy.run_module(mod_name='ansible_collections.community.rabbitmq.plugins.modules.rabbitmq_user', init_globals=None, run_name='__main__', alter_sys=True)
  File "/usr/lib64/python2.7/runpy.py", line 176, in run_module
    fname, loader, pkg_name)
  File "/usr/lib64/python2.7/runpy.py", line 82, in _run_module_code
    mod_name, mod_fname, mod_loader, pkg_name)
  File "/usr/lib64/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/tmp/ansible_rabbitmq_user_payload_2cDtIG/ansible_rabbitmq_user_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py", line 463, in <module>
  File "/tmp/ansible_rabbitmq_user_payload_2cDtIG/ansible_rabbitmq_user_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py", line 431, in main
  File "/tmp/ansible_rabbitmq_user_payload_2cDtIG/ansible_rabbitmq_user_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py", line 299, in get
ValueError: need more than 1 value to unpack
fatal: [default]: FAILED! => {
    "changed": false,
    "module_stderr": "OpenSSH_8.4p1, OpenSSL 1.1.1h  22 Sep 2020\r\ndebug1: Reading configuration data /home/freitafr/.ssh/config\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug2: resolve_canonicalize: hostname 127.0.0.1 is address\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 99757\r\ndebug3: mux_client_request_session: session request sent\r\ndebug1: mux_client_request_session: master session id: 2\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Received exit status from master 1\r\nShared connection to 127.0.0.1 closed.\r\n",
    "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py\", line 102, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py\", line 94, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/vagrant/.ansible/tmp/ansible-tmp-1605268884.2947245-99808-103654085490128/AnsiballZ_rabbitmq_user.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.rabbitmq.plugins.modules.rabbitmq_user', init_globals=None, run_name='__main__', alter_sys=True)\r\n  File \"/usr/lib64/python2.7/runpy.py\", line 176, in run_module\r\n    fname, loader, pkg_name)\r\n  File \"/usr/lib64/python2.7/runpy.py\", line 82, in _run_module_code\r\n    mod_name, mod_fname, mod_loader, pkg_name)\r\n  File \"/usr/lib64/python2.7/runpy.py\", line 72, in _run_code\r\n    exec code in run_globals\r\n  File \"/tmp/ansible_rabbitmq_user_payload_2cDtIG/ansible_rabbitmq_user_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py\", line 463, in <module>\r\n  File \"/tmp/ansible_rabbitmq_user_payload_2cDtIG/ansible_rabbitmq_user_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py\", line 431, in main\r\n  File \"/tmp/ansible_rabbitmq_user_payload_2cDtIG/ansible_rabbitmq_user_payload.zip/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py\", line 299, in get\r\nValueError: need more than 1 value to unpack\r\n",
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
    "rc": 1
}

Additional details

The playbook in the steps to reproduce gives the expected results for Ansible 2.9.15.

rabbitmq_user can't determine the version of RabbitMQ server

SUMMARY

I'm trying to create rabbitmq users with the rabbitmq_user module, but this keeps failing with the error message:
Could not determine the version of the RabbitMQ server.
I'm using the Ansible version 2.10.3 and the Rabbitmq Cluster has the version 3.7.13 and Erlang version 21.3.

ISSUE TYPE
  • Bug Report
COMPONENT NAME

rabbitmq_user

ANSIBLE VERSION
ansible 2.10.3
  config file = /home/eugen/.ansible.cfg
  configured module search path = ['/home/eugen/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/eugen/virtualenvironments/ansible2.10/lib/python3.6/site-packages/ansible
  executable location = /home/eugen/virtualenvironments/ansible2.10/bin/ansible
  python version = 3.6.9 (default, Oct  8 2020, 12:12:24) [GCC 8.4.0]
CONFIGURATION
Default configuration
OS / ENVIRONMENT

Host: Mint 19.2
Target: Debian 9 (Docker container)

STEPS TO REPRODUCE

First install the Rabbitmq and Erlang version listed above. Try to create or delete users with the rabbitmq_user module. This will result in a Could not determine the version of the RabbitMQ server. error.
However when you execute rabbitmqctl status on one node you will see the output which also contains the rabbitmq version.

rabbitmqctl status output:

[{pid,7497},
 {running_applications,
     [{rabbitmq_shovel_management,
          "Management extension for the Shovel plugin","3.7.13"},
      {rabbitmq_management,"RabbitMQ Management Console","3.7.13"},
      {rabbitmq_management_agent,"RabbitMQ Management Agent","3.7.13"},
      {rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.7.13"},
      {rabbitmq_shovel,"Data Shovel for RabbitMQ","3.7.13"},
      {rabbit,"RabbitMQ","3.7.13"},
      {sysmon_handler,"Rate-limiting system_monitor event handler","1.1.0"},
      {cowboy,"Small, fast, modern HTTP server.","2.6.1"},
      {amqp_client,"RabbitMQ AMQP Client","3.7.13"},
      {rabbit_common,
          "Modules shared by rabbitmq-server and rabbitmq-erlang-client",
          "3.7.13"},
      {ranch,"Socket acceptor pool for TCP protocols.","1.7.1"},
      {amqp10_client,"AMQP 1.0 client from the RabbitMQ Project","3.7.13"},
      {ssl,"Erlang/OTP SSL application","9.2"},
      {public_key,"Public key infrastructure","1.6.5"},
      {asn1,"The Erlang ASN1 compiler version 5.0.8","5.0.8"},
      {recon,"Diagnostic tools for production use","2.3.6"},
      {cowlib,"Support library for manipulating Web protocols.","2.7.0"},
      {crypto,"CRYPTO","4.4.1"},
      {jsx,"a streaming, evented json parsing toolkit","2.9.0"},
      {os_mon,"CPO  CXC 138 46","2.4.7"},
      {inets,"INETS  CXC 138 49","7.0.6"},
      {amqp10_common,
          "Modules shared by rabbitmq-amqp1.0 and rabbitmq-amqp1.0-client",
          "3.7.13"},
      {mnesia,"MNESIA  CXC 138 12","4.15.6"},
      {xmerl,"XML parser","1.3.19"},
      {lager,"Erlang logging framework","3.6.5"},
      {goldrush,"Erlang event stream processor","0.1.9"},
      {compiler,"ERTS  CXC 138 10","7.3.2"},
      {syntax_tools,"Syntax tools","2.1.7"},
      {sasl,"SASL  CXC 138 11","3.3"},
      {stdlib,"ERTS  CXC 138 10","3.8"},
      {kernel,"ERTS  CXC 138 10","6.3"}]},
 {os,{unix,linux}},
 {erlang_version,
     "Erlang/OTP 21 [erts-10.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:128]\n"},
 {memory,
     [{connection_readers,0},
      {connection_writers,0},
      {connection_channels,0},
      {connection_other,2732},
      {queue_procs,0},
      {queue_slave_procs,0},
      {plugins,888476},
      {other_proc,31525764},
      {metrics,207268},
      {mgmt_db,160616},
      {mnesia,78608},
      {other_ets,2931976},
      {binary,136136},
      {msg_index,30080},
      {code,28049863},
      {atom,1172689},
      {other_system,13737952},
      {allocated_unused,15769168},
      {reserved_unallocated,0},
      {strategy,rss},
      {total,[{erlang,78922160},{rss,85061632},{allocated,94691328}]}]},
 {alarms,[]},
 {listeners,
     [{clustering,25672,"::"},{amqp,5672,"172.17.0.2"},{http,15672,"::"}]},
 {vm_memory_calculation_strategy,rss},
 {vm_memory_high_watermark,0.4},
 {vm_memory_limit,6548978073},
 {disk_free_limit,50000000},
 {disk_free,182969389056},
 {file_descriptors,
     [{total_limit,32668},
      {total_used,2},
      {sockets_limit,29399},
      {sockets_used,0}]},
 {processes,[{limit,1048576},{used,401}]},
 {run_queue,1},
 {uptime,150},
 {kernel,{net_ticktime,60}}]
EXPECTED RESULTS

Users should be created or deleted.

ACTUAL RESULTS

See above.


Rename repo to community.rabbitmq

SUMMARY

Hi,
To be more consistent with the other repos https://github.com/ansible-collections/ I'd like to rename this GitHub Repo to be community.rabbitmq

  • Old URLs for issues and PRs will still work
  • Old git URLs will work, though it will be good to update them locally
  • We will need to update the URLs in galaxy.yml

Are you happy with this?

ISSUE TYPE
  • Bug Report

Important information for collection maintainers

SUMMARY

Dear maintainers,

This is important for your collections!

  • In accordance with the Community decision, we have created the news-for-maintainers repository for announcements of changes impacting collection maintainers (see the examples) instead of Issue 45 that will be closed soon.

    • To keep yourself well-informed and, therefore, things in your collection working, please subscribe to the repository by using the Watch button in the upper right corner on the repository's home page.
    • If you do not want to get notifications about related discussions, please subscribe only to Issues.
    • Please read the brief guidelines on how the repository should be used.
    • Please avoid unnecessary discussions in issues, use the Discussions feature. Every comment posted will notify a lot of folks!
  • Also we would like to remind you about the Bullhorn contributor newsletter which has recently started to be released weekly. To learn what it looks like, see the past releases. Please subscribe and talk to the Community via Bullhorn!

  • Join us in #ansible-social (for news reporting & chat), #ansible-community (for discussing collection & maintainer topics), and other channels on Matrix/IRC.

  • Help the Community and the Steering Committee to make right decisions by taking part in discussing and voting on the Community Topics that impact the whole project and the collections in particular. Your opinion there will be much appreciated!

Thank you!

Azure Pipelines: add Ubuntu 20.04 to .azure-pipelines/azure-pipelines.yml to devel branch section

SUMMARY

Azure Pipelines: add Ubuntu 20.04 to .azure-pipelines/azure-pipelines.yml to devel branch section
Relates to ansible-collections/overview#45 (comment)

Also consider adding alpine3 and macos/11.1 if possible

Now on Ubuntu 20.04 the tests fail with

01:26 TASK [setup_rabbitmq : Install RabbitMQ Server] ********************************
01:26 task path: /root/ansible_collections/community/rabbitmq/tests/output/.tmp/integration/lookup_rabbitmq-hlx13s_t-ÅÑŚÌβŁÈ/tests/integration/targets/setup_rabbitmq/tasks/ubuntu.yml:38
01:26 <testhost> ESTABLISH LOCAL CONNECTION FOR USER: root
01:26 <testhost> EXEC /bin/sh -c 'echo ~root && sleep 0'
01:26 <testhost> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1613630821.4291763-2301-157860801771273/ /root/.ansible/tmp/ansible-tmp-1613630821.4291763-2301-157860801771273/AnsiballZ_apt.py && sleep 0'
01:26 <testhost> EXEC /bin/sh -c '/usr/bin/python3.8 /root/.ansible/tmp/ansible-tmp-1613630821.4291763-2301-157860801771273/AnsiballZ_apt.py && sleep 0'
01:28 <testhost> EXEC /bin/sh -c 'rm -f -r /root/.ansible/tmp/ansible-tmp-1613630821.4291763-2301-157860801771273/ > /dev/null 2>&1 && sleep 0'
01:28 fatal: [testhost]: FAILED! => {
01:28     "changed": false,
01:28     "invocation": {
01:28         "module_args": {
01:28             "allow_unauthenticated": false,
01:28             "autoclean": false,
01:28             "autoremove": false,
01:28             "cache_valid_time": 0,
01:28             "deb": "/root/.ansible/tmp/ansible-tmp-1613630821.4291763-2301-157860801771273/rabbitmq-server_3.7.14-1_all12_g7e_q.deb",
01:28             "default_release": null,
01:28             "dpkg_options": "force-confdef,force-confold",
01:28             "fail_on_autoremove": false,
01:28             "force": false,
01:28             "force_apt_get": false,
01:28             "install_recommends": null,
01:28             "only_upgrade": false,
01:28             "package": null,
01:28             "policy_rc_d": null,
01:28             "purge": false,
01:28             "state": "present",
01:28             "update_cache": null,
01:28             "update_cache_retries": 5,
01:28             "update_cache_retry_max_delay": 12,
01:28             "upgrade": null
01:28         }
01:28     },
01:28     "msg": "Dependency is not satisfiable: erlang-base (< 1:22)|erlang-base-hipe (< 1:22)|esl-erlang (< 1:22)\n"
01:28 }

So they need to be adjusted

ISSUE TYPE
  • Feature Pull Report
COMPONENT NAME

tests/integration/targets/setup_rabbitmq
.azure-pipelines/azure-pipelines.yml

OS / ENVIRONMENT

Ubuntu 20.04

Add an option to allow rabbitmq_user to use API for managing users

SUMMARY

Currently rabbitmq_user uses rabbitmqctl for managing users. The idea is to add a choice for allowing to use API as well.

ISSUE TYPE
  • Other plays in this collection already support using the API (like for managing exchanges, queues and bindings). My proposal is to add the option of using API for users as well without breaking backwards compatibility with the current implementation.

The is to use providers to allow implementations to be kept and maintained apart from each other. I've done that before in the certifica role from linux system roles (https://github.com/linux-system-roles/certificate/).

I would probably turn module_utils/rabbitmq.py in a package and add a directory providers inside it. The contents of rabbitmq.py could stay inside the package init.py.

ADDITIONAL INFORMATION

Using the 2 examples of the documentation that's how it would look:

# Add user to server and assign full access control on / vhost.
# The user might have permission rules for other vhost but you don't care.
- community.rabbitmq.rabbitmq_user:
    user: joe
    password: changeme
    vhost: /
    configure_priv: .*
    read_priv: .*
    write_priv: .*
    state: present
    provider: api
    login_user: user
    login_password: secret
    login_host: remote.example.org

# Add user to server and assign full access control on / vhost.
# The user doesn't have permission rules for other vhosts
- community.rabbitmq.rabbitmq_user:
    user: joe
    password: changeme
    permissions:
      - vhost: /
        configure_priv: .*
        read_priv: .*
        write_priv: .*
    state: present
    provider: api
    login_user: user
    login_password: secret
    login_host: remote.example.org

Simple code refactoring needed

SUMMARY

Relates #89 (comment)

the modules use the same function _exec. We could move it (and other shared things if exist), to plugins/module_utils/something.py, document it there, and use everything instead of having the code duplicated.

  1. Move the code to a library under plugins/module_utils
  2. It could be a parental class but i personally prefer composition.
  3. Or it could be just a function, say, rabbitmqctl_exec (obj, args, force_exec_in_check_mode=False) where obj is an argument via which the objects will pass themselves.

the class could look like:

class RabbitMQ():
    """Doc explaining purpose, args, etc."""
    def __init__(self, obj):
    self. obj = obj

    def exec(self, args, force_exec_in_check_mode=False):
        """Doc explaining purpose, args, etc."""
        if not self.obj.module.check_mode or (self.obj.module.check_mode and force_exec_in_check_mode):
            cmd = [self.obj._rabbitmqctl, '-q', '-n', self.obj.node]
            rc, out, err = self.obj.module.run_command(cmd + args, check_rc=True)
            return out.splitlines()
        return list()

in the target classes you're changing here in __init__ we could initialize `self.rabbitmq = RabbitMQ(self)

and then _exec() method could look like:

    def _exec(self, args, force_exec_in_check_mode=False):
        return self.rabbitmq.exec(args, force_exec_in_check_mode)
ISSUE TYPE
  • Feature Idea
COMPONENT NAME

Many modules

Add unit testing for plugins/lookup/rabbitmq.py

SUMMARY

There is no unit testing for this lookup. Add unit testing to ensure that the lookup behaves consistently with all changes made to it. Try to add some negative testing too.

ISSUE TYPE
  • Feature Idea
COMPONENT NAME
ADDITIONAL INFORMATION

Cannot use exchange type `x-delayed-message`

SUMMARY

Hello, the rabbitmq_exchange module does not accept the x-delayed-message type. It used to work in version 0.1.0.
The delayed message exchange is a rabbitmq plugin: https://github.com/rabbitmq/rabbitmq-delayed-message-exchange

ISSUE TYPE
  • Bug Report
COMPONENT NAME

rabbitmq_exchange

ANSIBLE VERSION
ansible 2.10.4
  config file = /home/rolandthiolliere/.ansible/conf.cfg
  configured module search path = ['/home/rolandthiolliere/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/rolandthiolliere/anaconda3/lib/python3.8/site-packages/ansible
  executable location = /home/rolandthiolliere/anaconda3/bin/ansible
  python version = 3.8.5 (default, Sep  4 2020, 07:30:14) [GCC 7.3.0]
CONFIGURATION
DEFAULT_ROLES_PATH(/home/rolandthiolliere/.ansible/conf.cfg) = ['/home/rolandthiolliere/.ansible/roles']
DEFAULT_VAULT_PASSWORD_FILE(env: ANSIBLE_VAULT_PASSWORD_FILE) = /home/rolandthiolliere/.ansible/vault_password_file
INTERPRETER_PYTHON(/home/rolandthiolliere/.ansible/conf.cfg) = /usr/bin/env python
OS / ENVIRONMENT

Ubuntu 20.04.1 LTS

STEPS TO REPRODUCE
  - name: Create the rabbitmq exchange
    rabbitmq_exchange:
      name: myapp
      type: x-delayed-message
      arguments:
        x-delayed-type: direct
      vhost: "{{ rb_vhost }}"
      login_host: "{{ rb_host }}"
      login_port: "{{ rb_port }}"
      login_protocol: "{{ rb_protocol }}"
      login_user: "{{ rb_admin_user }}"
      login_password: "{{ rb_admin_password }}"
      state: present
EXPECTED RESULTS

rabbitmq exchange created

ACTUAL RESULTS
fatal: [localhost]: FAILED! => {"changed": false, "msg": "value of exchange_type must be one of: fanout, direct, headers, topic, got: x-delayed-message"}

This can be solved by simply allowing x-delayed-message as a valid type and I can provide the PR is you want (tested locally), but that may not be the cleanest solution.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.