ansible迭代字典和列表

时间:2018-05-21 23:22:41

标签: ansible

我有以下数据:

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

你们如何解决这个问题?

1 个答案:

答案 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