AnsibleでUbuntuに接続可能にする

プレイブックの実行

ansible-playbook add-user-ssh.yml -i hosts

インベントリファイル「hosts」

初期設定を行うinitグループを設定する。

  • ansible_user/ansible_passwordは対象Ubuntuのログインユーザ、パスワード
  • ansible_become_passwordはsudo時のパスワード
1
2
3
4
5
6
7
8
9
[init]
target

[init:vars]
ansible_python_interpreter=/usr/bin/python3
ansible_port=22
ansible_user=※ユーザ名※
ansible_password=※パスワード※
ansible_become_password=※パスワード※

プレイブック「add-user-ssh.yml」

Ansible用のユーザ追加とSSHDの初期設定を行う。

  • lookup(‘env’,’XXXXX’)はAnsible実行ホストの環境変数を参照する
  • sudo実行可能なユーザとしてANSIBLE_USERNAMEで指定したユーザを追加する
  • 追加したユーザにSSH用の公開鍵を登録する
  • SSHDのポート番号変更やルートログイン禁止の設定を行いsshdをリスタートする
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
---
- hosts: init

vars:
- ansible_user_name: "{{ lookup('env', 'ANSIBLE_USERNAME') }}"
- ansible_user_password: "{{ lookup('env', 'ANSIBLE_PASSWORD') }}"
- sshd_port: "{{ lookup('env', 'SSHD_PORT') }}"
gather_facts: no
become: true

tasks:
- name: Add a new user named {{ ansible_user_name }}
user:
name: "{{ ansible_user_name }}"
shell: /bin/bash
password: "{{ ansible_user_password }}"

- name: Add ansible user to the sudoers
copy:
dest: "/etc/sudoers.d/{{ ansible_user_name }}"
content: "{{ ansible_user_name }} ALL=(ALL) NOPASSWD: ALL"

- name: Deploy SSH Key
authorized_key:
user: "{{ ansible_user_name }}"
key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
state: present

- name: Change port to {{ sshd_port }}
lineinfile:
dest: /etc/ssh/sshd_config
regexp: "^Port"
insertafter: "^#Port"
line: "Port {{ sshd_port }}"

- name: Disable Root Login
lineinfile:
dest: /etc/ssh/sshd_config
regexp: "^PermitRootLogin"
line: "PermitRootLogin no"
state: present
backup: yes
notify:
- restart sshd

handlers:
- name: restart sshd
service:
name: sshd
state: restarted

発生したエラーと対策

エラー「sudo: a password is required」

sudoのパスワードが指定されていない。

1
fatal: [target]: FAILED! => {"changed": false, "module_stderr": "Shared connection to target closed.\r\n", "module_stdout": "sudo: a password is required\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}

ansible_become_passwordでsudoパスワードを指定する

エラー「/usr/bin/python: not found」

pythonが見つからない。

ansible_python_interpreter=/usr/bin/python3でpythonのパスを明示する

1
fatal: [target]: FAILED! => {"changed": false, "module_stderr": "Shared connection to target closed.\r\n", "module_stdout": "\r\n/bin/sh: 1: /usr/bin/python: not found\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 127}