Ansible变量文件中避免authorized_key重复,如何引用其他用户SSH密钥
解决Ansible变量中引用其他用户SSH密钥的问题
我来帮你搞定这个避免重复写SSH密钥的需求!在Ansible的vars/main.yml里直接用Jinja2表达式引用变量完全可行,只是你之前的语法用错了,下面给你几种靠谱的实现方式:
方法1:用selectattr+map过滤查找(无需额外依赖)
直接在user2的ssh_key里通过过滤器提取user1的密钥,这种方式不需要额外安装库,兼容性好:
# roles/manageuser/vars/main.yml users: - username: user1 ssh_key: "someExampleValidRSAPublicKEYValueInHereForAuthorizedKeys user1@localhost" - username: user2 ssh_key: | someExampleValidRSAPublicKEYValueInHereForAuthorizedKeys user2@localhost {{ users | selectattr('username', 'equalto', 'user1') | map(attribute='ssh_key') | first }}
selectattr('username', 'equalto', 'user1'):从users列表中筛选出用户名是user1的条目map(attribute='ssh_key'):提取该条目的ssh_key字段first:取结果列表的第一个值(因为用户名唯一,只会有一个结果)
方法2:提前构建密钥字典(更清晰高效)
如果用户数量较多,建议把密钥单独存到一个字典里,再让users列表引用这个字典的值,结构更清晰,后续维护也方便:
# roles/manageuser/vars/main.yml # 先定义所有用户的密钥字典 user_ssh_keys: user1: "someExampleValidRSAPublicKEYValueInHereForAuthorizedKeys user1@localhost" user2: | someExampleValidRSAPublicKEYValueInHereForAuthorizedKeys user2@localhost {{ user_ssh_keys.user1 }} # 再定义用户列表,引用字典中的密钥 users: - username: user1 ssh_key: "{{ user_ssh_keys.user1 }}" - username: user2 ssh_key: "{{ user_ssh_keys.user2 }}"
方法3:用json_query(适合复杂查询场景)
如果你习惯JMESPath语法,可以用json_query过滤器,但需要确保你的Ansible环境安装了jmespath库(大部分现代Ansible版本默认自带):
# roles/manageuser/vars/main.yml users: - username: user1 ssh_key: "someExampleValidRSAPublicKEYValueInHereForAuthorizedKeys user1@localhost" - username: user2 ssh_key: | someExampleValidRSAPublicKEYValueInHereForAuthorizedKeys user2@localhost {{ users | json_query('[?username==`user1`].ssh_key') | first }}
注意这里JMESPath的字符串要用反引号`包裹,避免和外层的双引号冲突。
关于你之前尝试的错误说明
query(users[?username=='user1'].ssh_key):query模块通常用于查找外部资源,不能直接在变量里这么用;如果要做JMESPath查询,应该用json_query过滤器lookup('dict', ssh_key, users.username='user1'):lookup('dict')是用来遍历字典的,用法不符合你的场景,所以会失效
内容的提问来源于stack exchange,提问作者lonewolf
相关产品推荐
相关产品推荐

