Search code examples
puppet

Array iteration with position in puppet


I'm planning to implement the possibility to add multiple ssh keys per user. For a single key, I used:

  if ($sshkey) {
    ssh_authorized_key { $resourcename:
      ensure  => 'present',
      type    => 'ssh-rsa',
      key     => '$sshkey',
      user    => $title,
      require => User[$title],
    }
  }

For multiple keys, i thought that this might work:

  if ($sshkeyarray != []) {
    $sshkeyarray.each |String $singlesshkey| {
      ssh_authorized_key { $resourcename:
        ensure  => 'present',
        type    => 'ssh-rsa',
        key     => '$singlesshkey',
        user    => $title,
        require => User[$title],
      }
    }
  }

But the resourcename can only be used once, so I want to give names like "resourcename_1" for the first ssh key and "resourcename_n" for the n-th key.

How can I do this? Can i get the position of the singlesshkey from the array and add it to the resourdcename?


Solution

  • As described in the docs here you can do this:

      $sshkeyarray.each |$index, String $singlesshkey| {
        ssh_authorized_key { "${resourcename}_${index}":
          ensure  => 'present',
          type    => 'ssh-rsa',
          key     => $singlesshkey,
          user    => $title,
          require => User[$title],
        }
      }
    

    Notice that there's no need to test for an empty array either. Looping over an empty array causes nothing to happen anyway.