Назначьте переменную из hiera как имя пользователя (с uid и gid) внутри класса кукол - PullRequest
0 голосов
/ 11 февраля 2020

Привет, участники сообщества,

У нас есть файл марионеток с основным классом, как показано ниже:

class profile::Profname::application::classname {

  $appname_homedir          = hiera('appname::appname_homedir')
  $appname_installdir       = hiera('appname::appname_installdir')
  $java_optional_args      = "${java_keystore_args} ${java_proxy_args} ${java_timezone_args}"
..
..
  $user                    = hiera('appname::appname_user')
  $gid                     = hiera('appname::appname_user_gid')
  $uid                     = hiera('appname::appname_user_uid')


exec { "Many blocks":
    command => "commands",
    ..
  }

exec { "Many blocks":
    command => "commands",
    ..
  }

#  Install and configure app

  class { 'app':
    user             => hiera('classname::appname_user'),
    jvm_opts         => $java_optional_args,
    download_url     => "s3://${s3_bucket}/${APPDIR}/appname",
    dbserver         => hiera('appname::db-endpoint'),
    notify           => Exec["Change appname gid and uid"],
    require          => [ Class['java'], Exec['Create Homedir'], Exec['Create Appdir']],
  }

#other exec blocks

exec { "blocks"
..
..
}

}

Теперь у меня есть еще две переменные в hiera: uid и gid для the appname_user.

Как я могу создать пользователя "appname_user" во внутреннем классе 'app'?

Я пытался сослаться https://puppet.com/docs/puppet/4.10/quick_start_user_group.html но не уверен, как я могу сделать это внутри класса. Любая помощь будет принята с благодарностью.

Я сделал еще один exe c блок изменения uid и gid для пользователя позже, когда пользователь создан, но, похоже, этот способ не работает для некоторых уже существующих файлов. Хотя кукольное исполнение успешно. Следовательно, я хочу создать пользователя с помощью uid и gid во время создания.

Спасибо и всего наилучшего, Саха

1 Ответ

0 голосов
/ 11 февраля 2020

Как я могу создать пользователя "appname_user" во внутреннем классе "app"?

Мое лучшее предположение, что вы подразумеваете под этой конструкцией:

  class { 'app':
    user             => hiera('classname::appname_user'),
    jvm_opts         => $java_optional_args,
    download_url     => "s3://${s3_bucket}/${APPDIR}/appname",
    dbserver         => hiera('appname::db-endpoint'),
    notify           => Exec["Change appname gid and uid"],
    require          => [ Class['java'], Exec['Create Homedir'], Exec['Create Appdir']],
  }

Ответ на этот вопрос прост: вы не можете. Но есть множество взаимосвязанных вещей, которые вы можете сделать.

Прежде всего: «внутренний класс» - это не термин, используемый в Puppet. Могут быть вложенные классы, но

  1. это не то, что вы представили, а
  2. классы вложенности широко расцениваются как плохой стиль.

Вы показали объявление класса app внутри определения класса profile::Profname::application::classname. Объявление класса, когда оно оценивается, говорит Puppet о включении назначенного класса в каталог, который находится в стадии разработки, и при необходимости связывает значения с некоторыми параметрами этого класса. В другом месте должно быть определение класса, чтобы сообщить Puppet, что это значит. Если вы хотите, чтобы он объявил ресурс, который он еще не объявил, то это определение должно быть изменено.

Обычно вы управляете пользователем, объявляя ресурс User (внутри одного определения класса или еще один). В вашем случае вы можете найти определение класса app и поместить его туда, но вы также можете поместить его в свой класс профиля вместе с существующим объявлением класса app. Какой из них вам больше всего подойдет, зависит от того, чего вы пытаетесь достичь sh.

...