テックブログ

技術ネタ

Ansibleで複数ユーザ追加と鍵作成

あけましておめでとうございます!
1/1にブログ担当がまわってきた為、ジャスト更新を狙った當間です
中々こういう機会はないですからね!

2018年になりましたが、今回もブレずに長々と続いているAnsibleのユーザ追加について紹介します
……決して他にネタがないわけではないです

前回までのリンク

  1. Ansible 2.0 導入
  2. Ansibleでユーザ追加
  3. Ansibleでユーザパスワード設定
  4. Ansibleで楽にパスワード設定

今回は以下の2点について紹介します

  • 追加ユーザのssh-key設定
  • 複数ユーザの追加

追加ユーザのssh-key設定

第2回で少し触れましたが、userモジュールの「generate_ssh_key」オプションでssh-key作成が可能です

---
- hosts: target

  vars:
    - username: pyo
    - password: super-ultra-hyper-miracle-passw0rd

  tasks:
    - name: Add User
      user:
        name: "{{ username }}"
        password: "{{ password | password_hash('sha512') }}"
        update_password: on_create
        generate_ssh_key: yes
      become: yes

上記実行後、作成ユーザの~/.ssh/配下は秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が存在している状態となります

[pyo@target ~]$ ls .ssh/
id_rsa id_rsa.pub

sshdデフォルト設定では公開鍵として「.ssh/authorized_keys」を読み込むようになっているため、id_rsa.pubの名称変更と、
次回このユーザでssh-keyによるログインが可能となるよう、秘密鍵(id_rsa)のダウンロードを行っておきましょう
Playbookに以下の2タスクを追加します

    - name: Rename id_rsa.pub -> authorized_keys
      shell: "mv ~{{ username }}/.ssh/{id_rsa.pub,authorized_keys}"
      args:
        creates: "~{{ username }}/.ssh/authorized_keys"
      become: yes

    - name: Download ssh-key
      fetch:
        src: "~{{ username }}/.ssh/id_rsa"
        dest: "~/.ssh/{{ ansible_nodename }}/{{ username }}"
        flat: yes
      become: yes

ansibleの機能ではないですが、シェルのブレース展開で mv A/B A/C を mv A/{B,C}と書けるので利用してます
creates は shell モジュールのオプションで、後述のファイルが既に在る場合は そのシェルを実行しない、というものです

fetch モジュールは対象サーバの src ファイルを ローカルの dest へ保存
flatがnoの場合、下記のようにsrcのPATHまるごと保存してしまうのでファイル名だけ取り出すためflat yesとします

~/.ssh/{{ ansible_nodename }}/{{ username }}/hostname/home/{{ username }}/.ssh/ud_rsa

実行すれば、サーバ側でユーザ作成・鍵作成と、ローカルの~/.ssh/サーバhostname/ユーザ名 として秘密鍵がダウンロードされます

複数ユーザの追加

実際の利用シーンではユーザを複数作成する事もあります
ユーザの数だけ上記3タスクを実行するのは骨が折れるため、with_itemsとハッシュリストを利用してループさせましょう
varsの変数ssh_userspyo, toma, netassist の3ユーザとそのパスワードを記載しています

- hosts: target
  become: yes
  vars:
    ssh_users:
      - { name: "pyo", pw: "super-ultra-hyper-miracle-passw0rd" }
      - { name: "toma", pw: "secret@pass!word" }
      - { name: "netassist", pw: "happy-new-year!2018" }

  tasks:
    - name: Add User
      user:
        name: "{{ item.name }}"
        password: "{{ item.pw | password_hash('sha512') }}"
        update_password: on_create
        generate_ssh_key: yes
      with_items: "{{ ssh_users }}"

    - name: Rename id_rsa.pub -> authorized_keys
      shell: "mv ~{{ item.name }}/.ssh/{id_rsa.pub,authorized_keys}"
      args:
        creates: "~{{ item.name }}/.ssh/authorized_keys"
      with_items: "{{ ssh_users }}"

    - name: Download ssh-key
      fetch:
        src: "~{{ item.name }}/.ssh/id_rsa"
        dest: "~/.ssh/{{ ansible_nodename }}/{{ item.name }}"
        flat: yes
      with_items: "{{ ssh_users }}"

補足:ユーザ作成関連の全てのタスクでbecome: yes が必要だったので、タスクではなくPlaybookのトップレベルで1度だけ宣言するようにしました

with_itemsはリストの数だけループするので今回、 ssh_users内の3リスト分、ループします
Add Userタスクの
1回目のループでは {{ item.name }} に piyo が、 {{ item.pw }} に super-ultra(略 が入り、
2回めのループでは {{ item.name }} に toma が、 {{ item.pw }} に secret@(略 が入り、
3回目のループが…(略)終われば Add Userのタスクは終了です

次に Rename のタスクが始まり、ここでも with_items が利用されているため
1回目のループでは {{ item.name }} に piyo が、 {{ item.pw }} に super-ultra(略 が入り、
・・・と続いていきます

この書き方であれば、追加ユーザが10人居ても vars: ssh_usersのリストを増やすだけで対応可能です

まとめ

以上、実際の利用ケースに寄った2パターンの紹介をしました

ユーザ追加についてはもうちょっとだけ書いておきたいので、次回は各オプションとデフォルト値について書く予定です

昨年はTerraformやAnsibleについての社内勉強会を結構な頻度で開催したので、今年は僕以外のメンバーからもそういったツールやInfra as Codeについての記事が出ると良いなー等と考えております

若手エンジニアにエールを送る中堅エンジニアとして、サポートは惜しまない所存ですし、会社としても若手エンジニアの育成には力を入れていきます

そんなネットアシストを本年も宜しくお願い致します!

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください