ansible - 何使用 ansible playbook 在“sonatype nexus”中创建“nexus 本地用户和角色”
问题描述
我正在开发一个自动化,我需要使用 ansible playbook 安装 sonatype nexus,并创建一个 nexus 用户和角色。
到目前为止,我已经使用 playbook 安装了 sonatype nexus,并且我能够登录到应用程序并创建一个“nexus 本地用户”。但是,我想使用 ansible playbook 自动化相同的角色和用户创建(在关系中)。
我将不胜感激。
解决方案
您可以查看安装nexus3并负责其配置的 Galaxy或githubansible-thoteam.nexus3-oss
上的角色。为了完全透明,我是这个开源角色的当前维护者。
您将希望查看以下用于创建用户的 groovy 脚本(作为完整示例粘贴在下面):
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
import groovy.transform.Field
import org.sonatype.nexus.security.role.RoleIdentifier
import org.sonatype.nexus.security.user.InvalidCredentialsException
import org.sonatype.nexus.security.user.UserManager
import org.sonatype.nexus.security.user.UserNotFoundException
import org.sonatype.nexus.security.user.User
List<Map<String, String>> actionDetails = []
@Field Map scriptResults = [changed: false, error: false]
scriptResults.put('action_details', actionDetails)
authManager = security.securitySystem.getAuthorizationManager(UserManager.DEFAULT_SOURCE)
def updateUser(userDef, currentResult) {
User user = security.securitySystem.getUser(userDef.username)
user.setFirstName(userDef.first_name)
user.setLastName(userDef.last_name)
user.setEmailAddress(userDef.email)
if (user != security.securitySystem.getUser(userDef.username)) {
security.securitySystem.updateUser(user)
currentResult.put('status', 'updated')
scriptResults['changed'] = true
}
Set<RoleIdentifier> existingRoles = user.getRoles()
Set<RoleIdentifier> definedRoles = []
userDef.roles.each { roleDef ->
RoleIdentifier role = new RoleIdentifier("default", authManager.getRole(roleDef).roleId);
definedRoles.add(role)
}
if (! existingRoles.equals(definedRoles)) {
security.securitySystem.setUsersRoles(user.getUserId(), "default", definedRoles)
currentResult.put('status', 'updated')
scriptResults['changed'] = true
}
try {
security.securitySystem.changePassword(userDef.username, userDef.password, userDef.password)
} catch (InvalidCredentialsException ignored) {
security.securitySystem.changePassword(userDef.username, userDef.password)
currentResult.put('status', 'updated')
scriptResults['changed'] = true
}
log.info("Updated user {}", userDef.username)
}
def addUser(userDef, currentResult) {
try {
security.addUser(userDef.username, userDef.first_name, userDef.last_name, userDef.email, true, userDef.password, userDef.roles)
currentResult.put('status', 'updated')
scriptResults['changed'] = true
log.info("Created user {}", userDef.username)
} catch (Exception e) {
currentResult.put('status', 'error')
currentResult.put('error_msg', e.toString())
scriptResults['error'] = true
}
}
def deleteUser(userDef, currentResult) {
try {
security.securitySystem.deleteUser(userDef.username, UserManager.DEFAULT_SOURCE)
log.info("Deleted user {}", userDef.username)
currentResult.put('status', 'deleted')
scriptResults['changed'] = true
} catch (UserNotFoundException ignored) {
log.info("Delete user: user {} does not exist", userDef.username)
} catch (Exception e) {
currentResult.put('status', 'error')
currentResult.put('error_msg', e.toString())
scriptResults['error'] = true
}
}
/* Main */
parsed_args = new JsonSlurper().parseText(args)
parsed_args.each { userDef ->
state = userDef.get('state', 'present')
Map<String, String> currentResult = [username: userDef.username, state: state]
currentResult.put('status', 'no change')
if (state == 'absent') {
deleteUser(userDef, currentResult)
} else {
try {
updateUser(userDef, currentResult)
} catch (UserNotFoundException ignored) {
addUser(userDef, currentResult)
} catch (Exception e) {
currentResult.put('status', 'error')
currentResult.put('error_msg', e.toString())
scriptResults['error'] = true
}
}
scriptResults['action_details'].add(currentResult)
}
return JsonOutput.toJson(scriptResults)
该脚本期望接收用户列表。您可以参考README.md以及默认 vars以了解有关预期数据结构的详细信息,如下所示:
nexus_local_users:
- username: my_user
first_name: my
last_name: user
email: my@user.com
password: "s3cr3t"
roles:
- developers
我不会再次粘贴完整的示例,但还有一个groovy 脚本和角色数据结构
您可以查看角色的其余部分以获取更多信息,更具体地说是在 nexus 中声明脚本并使用其参数调用它的任务
Even if you don't want to use the full role, this is still in my opinion a good starting example to develop you own solution if you wish.
Hope it can help.
推荐阅读
- java - 告诉 Spring 不要对特定类型的 bean 调用关闭
- javascript - 这个 Javascript 符号 { e => e } 表示/可能表示什么?
- java - 我们可以并行处理每个多管道步骤吗?
- java - 如何将 GitHub 库导入到我的 android studio 项目中?
- c - 如何从文本文件中读取,反转每个单词而不是它们的位置,然后将其写入另一个文本文件?
- java - Lambda 表达式只能在 (Java) 中定义的相同方法中使用吗?
- kettle - 在 Kettle 中加入来自不同来源的数据
- javascript - 类型错误:message.guild.emojis.map 不是函数
- java - 在我的计算器项目中,如何对两个以上的数字进行运算?
- ios - 如何解析这种类型的 json 并在 UITableView 单元格中设置