puppet-rabbitmq
puppet-rabbitmq copied to clipboard
Error while using class rabbitmq_user
Affected Puppet, Ruby, OS and module versions/distributions
- Puppet: 6.0 ( Enterprise)
- Ruby:
- Distribution: Centos 7
- Module version: 9.0.0
How to reproduce (e.g Puppet code you use)
i am trying to use rabbitmq module to create users but i am getting this error using rabbitmq_user class using below code,
class role::rabbitmq::rabbitmqusers (
$admin_user_create = $role::rabbitmq::rmqparams::admin_user_create,
$admin_user = $role::rabbitmq::rmqparams::admin_user,
$admin_password = $role::rabbitmq::rmqparams::admin_password,
$application_user = $role::rabbitmq::rmqparams::application_user,
$application_password = $role::rabbitmq::rmqparams::application_password,
) inherits role::rabbitmq::rmqparams {
rabbitmq_user {'admin':
admin => true,
password => $admin_password,
}
}
What are you seeing
Error: Failed to apply catalog: Cannot parse invalid user line: warning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (which can be verified by running "locale" in your shell)
and when i see locale is set to LC_ALL=en_US.UTF-8 on the VM. and when i comment out the above code and run a puppet agent -t then it is working as expected.
What behaviour did you expect instead
rabbitmq creating users.
Output log
[root@l-aer-lin-app03 ~]# puppet agent -t
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Retrieving locales
Info: Loading facts
Info: Caching catalog for l-aer-lin-app03.
Info: Applying configuration version 'l-aer-apl-pe01-production-8bb30257e45'
Error: Failed to apply catalog: Cannot parse invalid user line: warning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (which can be verified by running "locale" in your shell)
Any additional information you'd like to impart
is it still related to https://github.com/voxpupuli/puppet-rabbitmq/issues/671
- Puppet 5.5 OS
- Distribution FreeBSD 12.0
- Module version: 9.0.0
- RabbitMQ version: 2.7.8
I think that #671 needs opening again because even with the environment variables line in the rabbitmq class I still get the same error about the locale.
So, I forked the repo and have managed to get past the issue by adding a utf entry for LC_ALL into the environment in the lib/puppet/provider/rabbitmq_cli.rb file:
def self.home_tmp_command(name, path)
has_command name, path do
environment HOME: '/tmp'
+ environment LC_ALL: 'en_GB.UTF-8'
end
end
I think that the language locale just has to be available on the system and utf-8. I don't think that this is the end solution, there must be a much better way to get this working (if it was python I could actually write the tests and get something better together to create an acutal PR to submit), but this worked for me whereas everything else was failing.
@JayH5: you have any thoughts about this one? I’d rather not hard-code env in here, and in the past, setting it in environment_variables (default updated in #694) seemed to work.
If we hard coded it, we’d have to pick a locale, and then things wouldn’t work if the user didn’t have that locale installed.
I don’t think there are actual cases where the output requires a non-ascii character set, but this is a requirement of the underlying tool that RabbitMQ uses for CLI
@wyardley 😬 not really, haven't had this problem myself.
Adding the LC_ALL variable to the home_tmp_command function could work but..
- When I wrote that function I was mostly just looking at list operations. There may be other areas where it's not used.
- The function should probably get a new name.
- It might make sense to only set
LC_ALLto a default likeen_US.UTF-8only if it's not already set.
Just as a note, I didn't check whether other language settings worked here, like LANG.
LANG would work too, I just feel like LC_ALL is a little narrower. It’s already supposed to be defaulted in environment_variables- @rick-pri - you’re not setting that in your Puppet code, right?
@JayH5: yeah, that’s what #694 was supposed to do, I think it sets it in the RMQ config vs in Puppet’s env directly, so wondering if somehow the new changes are causing that to get ignored or overridden, or if we can take those env vars and merge them in (that seems like it might not be a good idea though?)
Agree about renaming the function.
All of this is just one more reason that hitting the API directly is the cleanest solution.
And FWIW, setting the locale correctly on the instance itself should fix the problem. However, this affects enough users that we still need to set some kind of default.
@wyardley Sorry for the excessively long wait for me to reply to this. We're deploying on FreeBSD and I am setting a default in the login.conf with the line:
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K,LC_ALL=en_GB.UTF-8:\
What I'm wondering is if when puppet is run and it executes the rabbitmqctl command but that command doesn't inherit the shell's locale, and I can see from the rabbitmqctl script that it doesn't set the locale:
#!/bin/sh
## The contents of this file are subject to the Mozilla Public License
## Version 1.1 (the "License"); you may not use this file except in
## compliance with the License. You may obtain a copy of the License
## at http://www.mozilla.org/MPL/
##
## Software distributed under the License is distributed on an "AS IS"
## basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
## the License for the specific language governing rights and
## limitations under the License.
##
## The Original Code is RabbitMQ.
##
## The Initial Developer of the Original Code is GoPivotal, Inc.
## Copyright (c) 2007-2017 Pivotal Software, Inc. All rights reserved.
##
# Exit immediately if a pipeline, which may consist of a single simple command,
# a list, or a compound command returns a non-zero status
set -e
# Each variable or function that is created or modified is given the export
# attribute and marked for export to the environment of subsequent commands.
set -a
# shellcheck source=/dev/null
#
# TODO: when shellcheck adds support for relative paths, change to
# shellcheck source=./rabbitmq-env
. "${0%/*}"/rabbitmq-env
HOME=/var/db/rabbitmq
run_escript rabbitmqctl_escript "${ESCRIPT_DIR:?must be defined}"/rabbitmqctl "$@"
The puppet daemon explicitly sets this when it runs:
...
# An UTF-8 locale is required
: LC_ALL=${LC_ALL:=C.UTF-8}
case $LC_ALL in
*.UTF-8)
;;
*.*)
LC_ALL="${LC_ALL%.*}.UTF-8"
;;
*)
LC_ALL=C.UTF-8
;;
esac
export LC_ALL
run_rc_command "$1"
I am having the same issue where default_user and default_password have been defined in a manifest. Interestingly the error does not happen on any of my 3.6 version rabbit servers, only 3.7.