公開鍵認証のセットアップを自動で行う(Ansible)

課題

新しいマシンを立ち上げるたびにユーザの公開鍵認証のためのセットアップを行うのが面倒くさい。自動化したい。

※ほぼ備忘録

※事前にsshdがインストールされ公開鍵認証が許可されていること

解決策

以下のようなAnsibleプレイブックを利用する。varsセクションに記載した変数は値を適宜変更またはコマンドラインから指定すること。

- name: setup public key login
  hosts: all
  gather_facts: no
  become: yes
  vars:
    user_name: "<<user_name>>"
    public_key: "<<key_name>>.pub"
    secret_key: "<<key_name>>"
  tasks:
    - name: create user
      ansible.builtin.user:
        name: "{{ user_name }}"
        password: "{{ user_name | password_hash('sha512') }}"
        shell: "/bin/bash"

    - name: create ssh directory
      ansible.builtin.file:
        path: "/home/{{ user_name }}/.ssh"
        state: "directory"
        owner: "{{ user_name }}"
        group: "{{ user_name }}"
        mode: "755"

    - name: copy secret key
      ansible.builtin.copy:
        remote_src: false
        src: "{{ secret_key }}"
        dest: "/home/{{ user_name }}/.ssh/{{ secret_key }}"
        owner: "{{ user_name }}"
        group: "{{ user_name }}"
        mode: "600"

    - name: copy public key as authorized_keys
      ansible.builtin.copy:
        remote_src: false
        src: "{{ public_key }}"
        dest: "/home/{{ user_name }}/.ssh/authorized_keys"
        owner: "{{ user_name }}"
        group: "{{ user_name }}"
        mode: "600"


利用例

$ ansible-playbook -i inventory.ini --extra-vars "user_name=hogehoge public_key=id_rsa.pub secret_key=id_rsa" playbook.yml

所感

小さいことからコツコツ自動化しましょう。