【问题标题】:Ansible update authorized_keys fileAnsible 更新 authorized_keys 文件
【发布时间】:2019-09-06 01:36:51
【问题描述】:

我正在尝试编写一个通用操作来使authorized_keys 文件在我们所有的服务器上保持最新。基本上,我想保留列表开发人员并指定允许他们连接的服务器。

这就是我所拥有的......

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 }}'

vars.yaml

  - 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 的任何项目。根据authorized_keys 模块的文档,我可以使用exclusive 参数,但是,该选项不支持循环,需要我在一个批处理操作中传递所有密钥。

https://docs.ansible.com/ansible/latest/modules/authorized_key_module.html

有什么更好的方法来做到这一点?任何建议将不胜感激。

【问题讨论】:

    标签: ansible


    【解决方案1】:

    根据您在有关exclusive 选项的问题中指向的文档

    是否从 authorized_keys 文件中删除所有其他未指定的密钥。 可以在单个键字符串值中指定多个键,方法是用换行符分隔它们。

    我会尝试什么:使用 set_fact 和循环来创建具有所需内容的 var,并在下一个任务中使用 authorized_keys 模块中的 var 和 exclusive 选项。类似的东西(要经过全面测试和调整):

    tasks:
        - name: 'get keys to declare'
          set_fact:
            declare_keys: >-
              {{
                declare_keys | default([])
                +
                [item.key + ' ' + item.email])
              }}
          when:
            - "item.state == 'present'"
            - "'dev-app' in group_names"
            - "'dev-app' in item.servers or 'all' in item.servers"
          with_items:
            - '{{ users }}'
    
        - name: 'provision dev-app servers with correct keys'
          authorized_key:
            user: 'deployment'
            key: '{{ declare_keys.join("\n") }}'
            exclusive: yes
    

    【讨论】:

    • 这是一个很好的方法,特别是因为它保持一切都是幂等的。我最后的努力是清除 authorized_keys 文件。但是,这使得该游戏不是幂等的。
    • 因为您使用的是exclusive,所以我看不出事先清除文件的意义。您将放置完全相同的键并且不会发生任何更改,或者文件的全部内容将被替换为包含所有键的新计算字符串。
    【解决方案2】:

    我遇到了和你一样的问题,恕我直言,唯一的解决方案是在本地构建一个密钥文件,然后将其分发到目标服务器。我正在执行以下操作:

    - 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
    

    【讨论】:

      【解决方案3】:

      下面的播放创建字典列表“my_keys”,可用于配置专属“authorized_key”。

      - set_fact:
          my_hosts: "{{ my_hosts|default([]) + item.servers }}"
        loop: "{{ users }}"
        when: item.state == "present"
      - set_fact:
          my_keys: "{{ my_keys|default({})|combine({item: users|json_query(my_query)}) }}"
        vars:
          my_query: "[?servers.contains(@, '{{ item }}')].{key: key, state: state}"
        loop: "{{ my_hosts|unique }}"
      - debug:
          msg: "{{ item.key }} {{ item.value|json_query('[?state==`present`].key') }}"
        loop: "{{ my_keys|dict2items }}"
      

      给予:

      "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) 两个用户使用相同的服务器“dev-app” 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'
      

      【讨论】:

        猜你喜欢
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-20
        • 2013-07-29
        • 2018-04-25
        相关资源
        最近更新 更多