これはなに?
単体で使える ansible-playbook の紹介です。
サーバで ssh ログインできるユーザを作成するものです。
主に Jenkins ノード用ユーザやデプロイ用ユーザの作成に利用できると思います。
ファイルは?
main.yml
- hosts: localhost
connection: local
become: yes
vars:
user_name: jenkins_worker
group_name: ...
tasks:
- name: Useradd {{user_name}}
user:
name: "{{user_name}}"
group: "{{group_name}}"
generate_ssh_key: yes
home: /var/lib/{{user_name}}
- name: Allow {{user_name}} to ssh
copy:
src: /var/lib/{{user_name}}/.ssh/id_rsa.pub
dest: /var/lib/{{user_name}}/.ssh/authorized_keys
- name: Add user "{{user_name}}" to sudo
lineinfile:
path: /etc/sudoers.d/{{user_name}}
line: '{{user_name}} ALL=(ALL) NOPASSWD: ALL'
state: present
mode: 0440
create: yes
validate: 'visudo -cf %s'
いくつか解説があります
1. local 接続している
hosts
, connection
でローカル接続設定をしています。
Ansible はリモートのPCへ実行することもできるので、その際はそれぞれ変更します。
2. ユーザ作成部分
- name: Useradd {{user_name}}
user:
name: "{{user_name}}"
group: "{{group_name}}"
generate_ssh_key: yes
home: /var/lib/{{user_name}}
ユーザは Ansible 標準の User モジュールで作成しています。
generate_ssh_key
の設定で ssh キーを作成するようにしています。
3. authorized_keys 作成部分
ユーザのホームディレクトリに .ssh/authorized_keys に公開鍵を登録することで外部から ssh ログインができるようになります。
copy モジュールで .ssh/id_rsa.pub
を .ssh/authorized_keys
にコピーしています。
4. 追加したユーザが sudo できるようにする
今回は Jenkins のノードになるようなユーザを作っています。
ジョブ内で sudo を使うことがあるので sudo をパスワードなしで実行できるようにします。
方法としては、「/etc/sudoers
に設定を追加する」または「/etc/sudoer.d/
ディレクトリ以下に設定を含むファイルを追加する(/etc/sudoers
に #includedir /etc/sudoers.d
の記載が必要)」があります。
今回は後者の方法を選んでいます。
lineinfile モジュールはファイルに文字列を追加するモジュールです。
複数回実行しても重複なく文字列を追加できます。(冪等性)
実行方法は?
今回はローカルなので以下のように実行できます。
sudo ansible-playbook --connection=local main.yml
ssh ログインするには?
作成したユーザの秘密鍵をクライアントにコピーします。
id_rsa というファイルにした場合、以下のコマンドで ssh ログインできます。
ssh -i id_rsa -l jenkins_worker localhost
今回はサーバでユーザと鍵を生成しましたが、秘密鍵をコピーして渡すのがよろしくないときはクライアントで鍵を作って公開鍵を渡す方法の検討が必要です。
参考