Ansible更新授权密钥文件

Ansible更新授权密钥文件,ansible,Ansible,我正在尝试编写一个通用操作,以使所有服务器上的授权密钥文件保持最新。基本上,我希望列出开发人员,并指定允许他们连接的服务器 这是我所拥有的 ssh.yaml tasks: - name: 'provision dev-app servers with correct keys' authorized_key: user: 'deployment' key: '{{ item.key }}' comment: '{{ item

我正在尝试编写一个通用操作,以使所有服务器上的
授权密钥
文件保持最新。基本上,我希望列出开发人员,并指定允许他们连接的服务器

这是我所拥有的

ssh.yaml

  tasks:
    - name: 'provision dev-app servers with correct keys'
      authorized_key:
        user: 'deployment'
        key: '{{ item.key }}'
        comment: '{{ item.email }}'
        state: '{{ item.state }}'
      when: "('dev-app' in group_names) and ('dev-app' in item.servers or 'all' in item.servers)"
      with_items:
        - '{{ users }}'
  - name: 'Jacob Haug'
    username: 'jacob'
    email: 'jacob@jacobhaug.com'
    key: "{{ lookup('file', 'permissions/keys/jacob.pub') }}"
    servers:
      - 'all'
    state: 'present'

  - name: 'Some Developer'
    username: 'developer'
    email: 'developer@example.com'
    key: "{{ lookup('file', 'permissions/keys/developer.pub') }}"
    servers:
      - 'dev-app'
      - 'dev-admin'
      - 'prd-app'
      - 'prd-admin'
      - 'prd-scraper'
    state: 'present'
vars.yaml

  tasks:
    - name: 'provision dev-app servers with correct keys'
      authorized_key:
        user: 'deployment'
        key: '{{ item.key }}'
        comment: '{{ item.email }}'
        state: '{{ item.state }}'
      when: "('dev-app' in group_names) and ('dev-app' in item.servers or 'all' in item.servers)"
      with_items:
        - '{{ users }}'
  - name: 'Jacob Haug'
    username: 'jacob'
    email: 'jacob@jacobhaug.com'
    key: "{{ lookup('file', 'permissions/keys/jacob.pub') }}"
    servers:
      - 'all'
    state: 'present'

  - name: 'Some Developer'
    username: 'developer'
    email: 'developer@example.com'
    key: "{{ lookup('file', 'permissions/keys/developer.pub') }}"
    servers:
      - 'dev-app'
      - 'dev-admin'
      - 'prd-app'
      - 'prd-admin'
      - 'prd-scraper'
    state: 'present'
这很好用。但是,我希望以其他方式删除添加到
授权密钥中的所有项目。根据authorized_keys模块的文档,我可以使用
exclusive
参数,但是,该选项不支持循环,需要我在一个批处理操作中传递所有密钥


有什么更好的方法可以做到这一点?如果您有任何建议,我们将不胜感激。

请参阅您在关于
独家
选项的问题中所指的文档

是否从授权密钥文件中删除所有其他非指定密钥通过使用换行符分隔多个键,可以在单个键字符串值中指定多个键

我将尝试的是:使用带有循环的
set\u fact
创建具有所需内容的var,并在下一个任务中使用
authorized\u keys
模块中带有
exclusive
选项的var。类似(待全面测试和调整):


我遇到了与您和imho相同的问题,唯一的解决方案是在本地构建一个密钥文件,然后将其分发到目标服务器。我正在做以下工作:

- name: Create authorized_keys file
  local_action: "shell cat {{ ssh_user_key_path }}/{{ item }} >>{{ authorized_keys  }}"
  check_mode: False
  changed_when: False
  loop:
    - user1
    - user2
    - user3

- name: Distribute authorized_keys file to servers
  authorized_key:
    user: kvbapp
    key: "{{ lookup('file', authorized_keys) }}"
    path: "~/.ssh/authorized_keys"
    exclusive: True
    manage_dir: True

- name: remove local temporary authorized_keys file
  local_action:
    module: file
    state: absent
    path: '{{ authorized_keys }}'
  check_mode: False
  changed_when: False
  run_once: True

下面的重头戏创建了字典“my_key”列表,可用于配置独占的“authorized_key”

给出:

"msg": "dev-app [u'permissions/keys/jacob.pub', u'permissions/keys/developer.pub']"
"msg": "all [u'permissions/keys/jacob.pub']"
"msg": "dev-admin [u'permissions/keys/developer.pub']"
使用修改后的数据进行演示 1) 两个用户使用相同的服务器“开发应用程序” 2) 文件名而不是键

users:
  - name: 'Jacob Haug'
    username: 'jacob'
    email: 'jacob@jacobhaug.com'
    key: "permissions/keys/jacob.pub"
    servers:
      - 'all'
      - 'dev-app'
    state: 'present'
  - name: 'Some Developer'
    username: 'developer'
    email: 'developer@example.com'
    key: "permissions/keys/developer.pub"
    servers:
      - 'dev-app'
      - 'dev-admin'
    state: 'present'

这是一个很好的方法,特别是因为它保持了一切幂等。我最后的努力是清除授权密钥文件。但是,这使得播放不是幂等的。因为您使用的是
独占的
,所以我看不到在手之前清除文件的意义。您可以放置完全相同的键,并且不会发生任何更改,或者文件的完整内容将替换为包含所有键的新计算字符串。