[openstack-dev] [puppet][operators] How to specify Keystone v3 credentials?
Monty Taylor
mordred at inaugust.com
Tue May 5 05:25:25 UTC 2015
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
On 05/04/2015 08:47 PM, Emilien Macchi wrote:
>
>
> On 05/04/2015 10:37 PM, Rich Megginson wrote:
>> On 05/04/2015 07:52 PM, Mathieu Gagné wrote:
>>> On 2015-05-04 9:15 PM, Rich Megginson wrote:
>>>> On 05/04/2015 06:03 PM, Mathieu Gagné wrote:
>>>>> On 2015-05-04 7:35 PM, Rich Megginson wrote:
>>>>>> The way authentication works with the Icehouse branch is
>>>>>> that puppet-keystone reads the admin_token and
>>>>>> admin_endpoint from /etc/keystone/keystone.conf and
>>>>>> passes these to the keystone command via the
>>>>>> OS_SERVICE_TOKEN env. var. and the --os-endpoint
>>>>>> argument, respectively.
>>>>>>
>>>>>> This will not work on a node where Keystone is not
>>>>>> installed (unless you copy /etc/keystone/keystone.conf to
>>>>>> all of your nodes).
>>>>>>
>>>>>> I am assuming there are admins/operators that have
>>>>>> actually deployed OpenStack using puppet on nodes where
>>>>>> Keystone is not installed?
>>>>> We are provisioning keystone resources from a privileged
>>>>> keystone node which accepts the admin_token. All other
>>>>> keystone servers has the admin_token_auth middleware
>>>>> removed for obvious security reasons.
>>>>>
>>>>>
>>>>>> If so, how? How do you specify the authentication
>>>>>> credentials? Do you use environment variables? If so,
>>>>>> how are they specified?
>>>>> When provisioning resources other than Keystones ones, we
>>>>> use custom puppet resources and the credentials are passed
>>>>> as env variables to the exec command. (they are mainly
>>>>> based on exec resources)
>>>> I'm talking about the case where you are installing an
>>>> OpenStack service other than Keystone using puppet, and that
>>>> puppet code for that module needs to create some sort of
>>>> Keystone resource.
>>>>
>>>> For example, install Glance on a node other than the Keystone
>>>> node. puppet-glance is going to call class
>>>> glance::keystone::auth, which will call
>>>> keystone::resource::service_identity, which will call
>>>> keystone_user { $name }. The openstack provider used by
>>>> keystone_user is going to need Keystone admin credentials in
>>>> order to create the user.
>>> We "fixed" that part by not provisioning Keystone resources
>>> from Glance nodes but from Keystone nodes instead.
>>>
>>> We do not allow our users to create users/groups/projects, only
>>> a user with the admin role can do it. So why would you want to
>>> store/use admin credentials on an unprivileged nodes such as
>>> Glance? IMO, the glance user shouldn't be able to
>>> create/edit/delete users/projects/endpoints, that's the
>>> keystone nodes' job.
>>
>> Ok. You don't need the Keystone "superuser" admin credentials on
>> the Glance node.
>>
>> Is the puppet-glance code completely separable so that you can
>> call only glance::keystone::auth (or other classes that use
>> Keystone resources) from the Keystone node, and all of the other
>> puppet-glance code on the Glance node? Does the same apply to
>> all of the other puppet modules?
>>
>>>
>>> If you do not wish to explicitly define Keystone resources for
>>> Glance on Keystone nodes but instead let Glance nodes manage
>>> their own resources, you could always use exported resources.
>>>
>>> You let Glance nodes export their keystone resources and then
>>> you ask Keystone nodes to realize them where admin credentials
>>> are available. (I know some people don't really like exported
>>> resources for various reasons)
>>
>> I'm not familiar with exported resources. Is this a viable
>> option that has less impact than just requiring Keystone
>> resources to be realized on the Keystone node?
>
> I'm not in favor of having exported resources because it requires
> PuppetDB, and a lot of people try to avoid that. For now, we've
> been able to setup all OpenStack without PuppetDB in TripleO and in
> some other installers, we might want to keep this benefit.
+100
We're looking at using these puppet modules in a bit, but we're also a
few steps away from getting rid of our puppetmaster and moving to a
completely puppet apply based workflow. I would be double-plus
sad-panda if we were not able to use the openstack puppet modules to
do openstack because they'd been done in such as way as to require a
puppetmaster or puppetdb.
>>>
>>>
>>>> How are you passing those credentials? As env. vars? How?
>>> As stated, we use custom Puppet resources (defined types) which
>>> are mainly wrapper around exec. You can pass environment
>>> variable to exec through the environment parameter. I don't
>>> like it but that's how I did it ~2 years ago. I haven't changed
>>> it due to lack of need to change it. This might change soon
>>> with Keystone v3.
>>
>> Ok.
>>
>>>
>>>
>>>>> I'm starting to think about moving away from env variables
>>>>> and use a configuration file instead. I'm not sure yet
>>>>> about the implementation details but that's the main idea.
>>>> Is there a standard openrc location? Could openrc be
>>>> extended to hold parameters such as the default domain to use
>>>> for Keystone resources? I'm not talking about OS_DOMAIN_NAME,
>>>> OS_USER_DOMAIN_NAME, etc. which are used for
>>>> _authentication_, not resource creation.
>>> I'm not aware of any "standard" openrc location other than
>>> ~/.openrc which needs to be sourced before running any
>>> OpenStack client commands.
>>>
>>> I however understand what you mean. I do not have any idea on
>>> how I would implement it. I'm still hoping someday to be
>>> enlightened by a great solution.
>>>
>>> I'm starting to think about some sort of credentials vault. You
>>> store credentials in it and you tell your resource to use that
>>> specific credentials. You then no longer need to pass around
>>> 6-7 variables/parameters.
>>
>> I'm sure Adam Young has some ideas about this . . .
>>
>>>
>>>
>>>>>> There is a similar issue when creating domain scoped
>>>>>> resources like users and projects. As opposed to editing
>>>>>> dozens of manifests to add domain parameters to every
>>>>>> user and project (and the classes that call
>>>>>> keystone_user/tenant, and the classes that call those
>>>>>> classes, etc.), is there some mechanism to specify a
>>>>>> default domain to use? If not, what about using the same
>>>>>> mechanism used today to specify the Keystone
>>>>>> credentials?
>>>>> I see there is support for a default domain in
>>>>> keystone.conf. You will find it defined by the
>>>>> identity/default_domain_id=default config value.
>>>>>
>>>>> Is this value not usable?
>>>> It is usable, and will be used, _only on Keystone nodes_. If
>>>> you are on a node without Keystone, where will the default id
>>>> come from?
>>> As you probably know already, Puppet can't guess those default
>>> values, nor could Glance.
>>>
>>> I'm suggesting to not provision keystone resources from nodes
>>> other than keystone themselves. It solves (or avoid) a lot of
>>> problems.
>>
>> Yes, indeed.
>>
>>>
>>> I think we have to change the way we think about Keystone
>>> resources provisioning. I like to compare it to database
>>> provisioning:: You do not provision your database from the
>>> Glance nodes: you do it on your database node. Only the
>>> database node knows about the root password to create and
>>> provision database resources. It should be the same with
>>> Keystone resources.
>>
>> Ok.
>>
>>>
>>>
>>>>> And is it reasonable to assume the domain "default" will
>>>>> always be present?
>>>> Yes, but that may not be the "default" domain. Consider the
>>>> case where you may want to separate user accounts from
>>>> service "pseudo" accounts, by having them in separate
>>>> domains.
>>> I understand what you mean. However, won't the glance service
>>> (glance.conf) be aware of which domain its service account
>>> lives in?
>>
>> Yes. I'm also working on puppet-glance to make it domain aware
>> with respect to authentication and resources. You will be able
>> to specify the domain for the service account and the domain for
>> the service tenant.
>>
>>>
>>>
>>>>> Or is the question more related to the need to somehow
>>>>> override this value in Puppet?
>>>> If there is a standard Puppet mechanism for being able to
>>>> provide global parameters, other than something like rc files
>>>> or environment variables, then yes.
>>> All I can think of is the "data bag" concept in Chef. It
>>> contains global variables which aren't "owned" by any recipes.
>>>
>>> We might have to come up with a similar concept where
>>> credentials are stored and shared among all our modules.
>>>
>> In light of your information, I don't know if that will be
>> necessary.
>>
>> __________________________________________________________________________
>>
>>
OpenStack Development Mailing List (not for usage questions)
>> Unsubscribe:
>> OpenStack-dev-request at lists.openstack.org?subject:unsubscribe
>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
>>
>
>
> __________________________________________________________________________
>
>
OpenStack Development Mailing List (not for usage questions)
> Unsubscribe:
> OpenStack-dev-request at lists.openstack.org?subject:unsubscribe
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
iQIcBAEBCAAGBQJVSFRFAAoJEDOQ22gEGhLwiT8QAJmLqBrDdAUvnhQKsoD5TOmS
Adup1Zs2k3sOHPb7MLG/R5Ookvx1iqvfX1BScZ+7TqZ18z2T16vp8v2xxS+6cVtz
/V5ov21l10WoZvDULF0CdU9+v9ERr9hPwYfK/OmLPTmD1mD2D6ZlJH9jdz9JL9H+
WAq4IlTOFV2CDhqGjOqb+aSRKEGA5m5B6Dcr0zFRpoY3fvAtwYZf571MPSCGhtxx
bs5C75ngPSC8zKBoI5FcR7GovWjHbWGhnWyB67ch3M5NrKx1gxN5tIvovQpc/SUP
y+XwQRWFBX6ab1LrGEfL6Hj2R4pZqvke6S0sNao6QB+ewYogqKs78cz+3aWQ2dAc
fy3nuElnicR2lp7qle6qYNJLQ8lAP1pWMajgd8R553MikmHpt7dCx3gYCM36b0tf
p41ygydCDxomA6DptQT9sJUCRV1daM4zHW5Z3pXX0/n1ZMdoqANPKCergjRHvkd8
tNYuY75CuWKdXfc1fxA6lvykvaMXeYuJOPLFSc2l5f6zHVQpY2WgxYtKtb/iyUAd
pHo7YB+2hRkAnTB45iS1aGd5+fDv2nVm7eX1mwVRCKYdMXhoRj1U/9frtCtb0ZaH
6o0RMgyQbQCi6fYp6+ZRrnTtevVZRHgGdj5k4zV0XM7eUsRauwmN6rEhHaBUhkdm
ajJ76CWKy4Jd+SPtzHOH
=hmlj
-----END PGP SIGNATURE-----
More information about the OpenStack-dev
mailing list