使用Ansible来创建Linux用户并设置密钥认证
这是Hamee Advent Calendar第18天的文章。
这是Ansible Advent Calendar第18天的文章。
首先
我正在从事基础设施工程师的工作。
最初我做的是应用程序开发,但是入职后立即转行到基础设施领域,已经过去大约半年了。
考虑尝试一下基础设施即代码的概念,去接触一下配置管理工具。
在工作中,我们使用Chef,但我也想尝试一下看起来简单的Ansible。
Ansible可以不仅用于配置管理,还可以用作开发辅助工具,与Chef不同的是,使用Ansible不需要在目标主机上安装客户端,因此使用起来相对简单。
这次我们将介绍如何使用Ansible来创建Linux用户并设置SSH密钥验证,以此作为主题。
Ansible 是一种工具。
尽管现在才说,但Ansible是与Chef、Puppet等类似的一种配置管理工具。
在中文中,这句话可以这样表达:虽然Chef和Puppet存在一些差异,但它们的功能是相似的。Ansible相对简单,只需有两个文件,即清单文件和剧本文件,就可以运行。
如果使用常规命令在Linux上创建用户并设置密钥认证的话
创建一个名为“testuser”的用户。
如果没有认证密钥,就在本地上创建公钥和私钥。
ssh-keygen -t rsa
生成了两个文件:
私钥:id_rsa
公钥:id_rsa.pub
登录到目标主机后,
创建用户
useradd testuser
新建目录, 修改权限
mkdir -p home/testuser/.ssh/
chmod 700 home/testuser/.ssh
chmod 600 home/testuser/.ssh/authorized_keys
在“authorized_keys”文件中粘贴公钥。
echo id_rsa.pub >> .ssh/authorized_keys
如果授予sudo权限
visudo
testuser ALL=(ALL) NOPASSWD:ALL
这次我将使用Ansible来简化这个过程。
我来尝试使用Ansible编写
安装ansible
安装epel
wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6-8.noarch.rpm
安装Ansible
yum install ansible
初始设定
需要一个名为inventory的文件。
在文件中写下连接主机的信息等。
通常创建名为hosts的文件。
[web]
#ここに対象のIPアドレスを入れてください
在中国境内,只需要一种选项,将以下内容以中文进行释义:向服务器发ping命令,确认连接通畅。
首先,让我们确认能否与目标服务器进行通信。
ansible (対象のIPアドレス) -m ping -i hosts -u (サーバへのログインユーザ) --private-key="(秘密鍵のパス)"
请使用能够登录目标服务器的帐户进行此操作,同时提供该用户的私钥。
如果收到了pong作为回复,那就表示成功。
(対象のIPアドレス) | success >> {
"changed": false,
"ping": "pong"
}
执行文件(playbook)的描述
将内容记录在 yml 文件中。
执行在这个文件(playbook.yml)中所写的内容。
使用任务(task)来定义执行的内容。
name 并不是必须的,但是会写下执行的内容。
接下来根据需要充分利用模块(Module)进行定义。
- hosts: all
sudo: true
tasks:
- name: add a new user #Linuxユーザの作成
user: name=testuser2 state=present
- name: mkdir .ssh #.sshフォルダの作成
file: dest=/home/testuser2/.ssh/ state=directory owner=testuser2 group=testuser2 mode=700
- name: add authorized keys #.ssh以下にauthorized_keysファイルの作成
file: dest=/home/testuser2/.ssh/authorized_keys state=touch owner=testuser2 group=testuser2 mode=600
- name: copy publickey #公開鍵を貼付け
copy: src=~/id_rsa.pub dest=/home/testuser2/.ssh/authorized_keys
执行 (shí
您可以使用以下命令来执行该操作。
ansible-playbook -i hosts playbook.yml -u (サーバへのログインユーザ) --private-key="(秘密鍵のパス)"
请使用能够登录到目标服务器的帐户进行与该用户和私钥的操作。
执行结果
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [52.69.41.106]
TASK: [add a new user] ********************************************************
changed: [52.69.41.106]
TASK: [mkdir .ssh] ************************************************************
changed: [52.69.41.106]
TASK: [add authorized keys] ***************************************************
changed: [52.69.41.106]
TASK: [copy publickey] ********************************************************
changed: [52.69.41.106]
PLAY RECAP ********************************************************************
52.69.41.106 : ok=5 changed=4 unreachable=0 failed=0
我们成功了!
如果像下面hosts文件那样添加进去,执行命令会变得更简便。
[web]
(対象のIPアドレス)
[all:vars]
ansible_ssh_user=(サーバへのログインユーザ)
ansible_ssh_private_key_file=(秘密鍵のパス)
执行指令 (shí zhǐ
ansible-playbook -i hosts playbook.yml
试着使用变量
因为在文件中多次写入用户名很麻烦,所以我们可以将其存储在变量中,并且在文件执行时将其定义为变量。可以使用vars进行定义,并用{{}}包围以作为变量处理。
- hosts: all
sudo: true
vars:
- username: #put username
- homedir: /home/{{username}}
tasks:
- name: add a new user
user: name={{username}} state=present home={{homedir}}
- name: mkdir .ssh
file: dest={{homedir}}/.ssh/ state=directory owner={{username}} group={{username}} mode=700
- name: add authorized keys
file: dest={{homedir}}/.ssh/authorized_keys state=touch owner={{username}} group={{username}} mode=600
- name: copy publickey
template: src=public.j2 dest={{homedir}}/.ssh/authorized_keys
尝试使用template模块
由於指定复制密钥文件路径很麻烦,我将尝试使用模板模块。
在此情况下,我会在playbook.yml的同一级目录下创建一个名为public.j2的文件,并将公钥粘贴进去。
j2是jinja2的扩展名。
- name: copy publickey #公開鍵を貼付け
copy: src=~/id_rsa.pub dest=/home/testuser2/.ssh/authorized_keys
请把下面的句子用中文进行本土化改写,只需提供一种选项:
↓
请提供以下内容的中国化改写版本:
- name: copy publickey #公開鍵を貼付け
template: src=public.j2 dest={{homedir}}/.ssh/authorized_keys
总结
由于这次的主题很简单,所以无法完全介绍ansible的方便功能。
因为还有许多改进的空间,所以我会随时更新。
使用komitomo/linux-useradd-playbook。
以下是中文的一个版本:
请参考
Ansible文档 > 模块索引
Ansible教程
常用的Ansible文件操作模块
阅读Ansible文档的笔记
Ansible ~file模块~
使用Ansible指定ssh用户
使用Ansible在远程执行命令