gpt4 book ai didi

ansible - 在一个角色中创建 set_fact 变量并在另一个角色中使用它们

转载 作者:行者123 更新时间:2023-12-04 21:33:33 24 4
gpt4 key购买 nike

我有一个复杂的环境,包含多个系统的阶段和用户。

阶段是:dev、int等。

每个阶段都有一个应用程序的用户,我们称用户为 john。这导致
给用户johnd for dev 和johni for int 等等。

对系统管理进行抽象,由于各个阶段的系统都是相同的,
我创建了这个数据结构:

users:
john:
dev:
name: "johnd"
int:
name: "johni"

现在我有一个角色“collect_user_information”,它从 LDAP 收集所有类型的信息,并在 set_fact 的帮助下将它们存储在一个变量中。
- name: Get the userhome out of LDAP
shell: 'getent passwd {{ users[ user ][ stage ].name }} | cut -d: -f6'
register: user_home

和 set_fact:
- name: set facts for LDAP user
set_fact:
"{{user}}":
name: "{{ users[ user ][ stage ].name }}"
home: "{{ user_home.stdout }}"

要转储变量,我使用:
- name: debug output for myuser
debug: var="{{user}}"

调试输出看起来很有希望。
TASK [collect_user_information : debug output for user] *******
ok: [host1] => {
"john": {
"home": "/home/johni",-
"name": "johni"
}
}

现在我想执行一个角色来创建用户主页。
- { role: create_user_home, user: "john" }

首先,我转储变量的条目:
- name: debug role create_user_home output for variable user
debug: var=user

TASK [create_user_home : debug role create_user_home output for variable user] ***********
ok: [host1] => {
"user": "john"
}

- name: debug role create_user_home output for variable john
debug: var={{ user }}

TASK [create_user_home : debug role create_user_home output for variable john] **********
ok: [host1] => {
"john": {
"home": "/home/johni",-
"name": "johni"
}
}

现在我想使用这个数据结构。我想我可以通过引用“{{user.name}}”或“{{user['name']}}'来访问这些值,但两者都不起作用。
TASK [create_user_home : Create home directories for john] ***********************
fatal: [host1]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'ansible.parsing.yaml.objects.AnsibleUnicode object' has no attribute 'home'\n\nThe error appears to have been in '/etc/ansible/roles/create_user_home/tasks/main.yml': line 37, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n#-------------------------------------------------------------------------------\n- name: Create home directories for john\n ^ here\n"}

嗯,它是如何工作的?

最佳答案

好的,我自己找到了解决方案。

首先,我在我的数据结构中创建一个附加层 (myuser) 并使用不同的表示法。

- name: set facts for LDAP user
set_fact:
myuser: '{ "{{user}}": { "name": "{{ users[ user ][ stage ].name }}", "home": "{{ user_home.stdout }}", "gid": "{{ user_gid.stdout}}", "group": "{{ user_primarygroup.stdout }}" } }'

这会返回一个像这样的调试转储:
TASK [collect_user_information : debug output for myuser] ***********
ok: [host1] => {
"myuser": {
"john": {
"home": "/home/johni",
"name": "johni"
}
}
}

现在我可以使用我的数据结构值了。请记住,“用户”已通过参数传递给角色。
- name: Create home directories for user
user:
name: "{{ myuser[ user ].name }}"
home: "{{ myuser[ user ].home }}"
shell: "/bin/bash"
register: "create_user_home"
tags: [ 'user' ]

希望有帮助。

关于ansible - 在一个角色中创建 set_fact 变量并在另一个角色中使用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44525573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com