我有以下数据:
vars:
list_priv_keys: ['~/.ssh/id_rsa', '~/.ssh/id_ed25519']
dict_pub_keys: {'~/.ssh/id_rsa.pub': false, '~/.ssh/id_ed25519.pub': true}
只有当pub_key不存在时才需要从私有密钥检索公钥(dict_pub_keys.value == false
)
到目前为止我有什么(这显然是一个错误的方向):
- name: "[CA_User] Retrieve public key form private if pub key file doesn't exist"
command: "ssh-keygen -y -f {{ ????? }} > {{ item.key }}"
with_dict: "{{ dict_pub_keys }}"
when:
- false in dict_pub_keys.values()
- not item.value
你们如何解决这个问题?
答案 0 :(得分:-1)
因为var是开放的修改,我会建议一个字典元素列表,每个元素包含3个属性:2个文件名和控制我们是否应该采取行动的真/假值:
vars:
dict_pub_keys: [{public_key: '~/.ssh/id_rsa.pub', priv_key: '~/.ssh/id_rsa', keyexists: false}, { public_key: '~/.ssh/id_ed25519.pub', priv_key: '~/.ssh/id_ed25519', keyexists: true}]
这是一个循环遍历此列表并运行ssh-keygen命令的任务,如果keyexists == false
将是(我已经评论了ssh-keygen命令,并使用了一个" wall&#34 ;我们将运行的命令):
tasks:
- name: "[CA_User] Retrieve public key form private if pub key file doesn't exist"
# command: "ssh-keygen -y -f {{ item.priv_key }} > {{ item.public_key }}"
command: "wall 'ssh-keygen -y -f {{ item.priv_key }} > {{ item.public_key }}'"
when: item.keyexists == false
loop: "{{ dict_pub_keys }}"
希望有所帮助
<强>更新强>
关于变量结构:你有2个列表变量,包含有关同一对象的部分信息(ssh键):第一个变量有私钥文件名,第二个变量是公钥文件名,是否存在。我们可以将它们组合成一个包含以下内容的字典变量:
{ public_key_filename: xxxx,
private_key_filename: yyyy,
file_exists: zzzz
}
字典变量基本上是一个对象,你可以为它定义key = value对。
顺便说一句,变量声明也可以用这种替代语法(yml格式)编写,但是plz要注意缩进:
dict_pub_keys:
- public_key: '~/.ssh/id_rsa.pub'
priv_key: '~/.ssh/id_rsa'
keyexists: false
- public_key: '~/.ssh/id_ed25519.pub'
priv_key: '~/.ssh/id_ed25519'
keyexists: true