Ansibleで複数ユーザ追加と鍵作成
あけましておめでとうございます!
1/1にブログ担当がまわってきた為、ジャスト更新を狙った當間です
中々こういう機会はないですからね!
2018年になりましたが、今回もブレずに長々と続いている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.pubsshdデフォルト設定では公開鍵として「.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: yesansibleの機能ではないですが、シェルのブレース展開で 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_usersで pyo, 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についての記事が出ると良いなー等と考えております
若手エンジニアにエールを送る中堅エンジニアとして、サポートは惜しまない所存ですし、会社としても若手エンジニアの育成には力を入れていきます
そんなネットアシストを本年も宜しくお願い致します!