使用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在远程执行命令

bannerAds