Ansible使用小记

1,770 阅读3分钟

前言

我个人对Ansible的定位是一款自动化部署工具,它默认通过SSH协议管理机器。安装Ansible之后,不需要启动或运行一个后台进程,或是添加一个数据库。只要在一台电脑(可以是一台笔记本)上安装好Ansible,就可以通过这台电脑管理一组远程的机器。

由于Ansible是用于管理机器的,这里的机器可以用docker代替,从而实现在本地安装测试。

关于openssh:
Ansible主机与从机(被操纵机器)是通过SSH通信的,所以会用到openssh,openssh包含两个组件:openssh-server 和 openssh-client

openssh-server的功能主要是作为一个服务运行在后台,如果这个服务开启,我们就可以用一些远程工具来连接。

openssh-client则是作为一个客户端连接上openssh-server,一般Linux或者Mac都预装了openssh-client。

安装

# Ubuntu
$ sudo apt install ansible

# Mac
$ brew install ansible

部署测试机器

Linux 系统

# 下拉镜像,这里可以是其他Ubuntu镜像,我只是随便选了一个
docker pull ubuntu:16.04

# 启动容器
docker run -itd --name ansible-server1 -p 2222:22 ubuntu:16.04 /bin/bash

# 进入容器
docker exec -it ansible-server1 bash   

# 由于ansible使用ssh协议,所以被操控的机器需要安装openssh-server  
apt update && apt install openssh-server && apt install nano  

# ssh配置
nano /etc/ssh/sshd_config

# 写入以下内容(如果是注释,取消注释就好了)
RSAAuthentication yes #启用 RSA 认证
PubkeyAuthentication yes #启用公钥私钥配对认证方式
PermitRootLogin yes #root用户能使用密码和密钥登录,默认是PermitRootLogin prohibit-password,即允许root登录,但是禁用密码登录

# 启动ssh服务
$ /etc/init.d/ssh start
 * Starting OpenBSD Secure Shell server sshd

# 设置root密码,比如123456,方便宿主机连接
passwd root

这里只是实现宿主机能够使用账号密码登录容器,下一步还需要在宿主机生成公私钥,并把公钥拷贝到容器,更详细内容可以参考这篇文章《Linux-SSH免密码登录》

# 生成密钥
$ ssh-keygen -t rsa -C "ansible-server1"
Generating public/private rsa key pair.
...

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys


# 改变authorized_keys的权限,使之能够拷贝到docker容器里面
$ chmod 644 ~/.ssh/authorized_keys

# 将公钥复制到容器
$ ssh-copy-id root@172.17.0.4 # 172.17.0.4 为docker的IP(默认公钥)

# 将私钥添加到由ssh-agent 维护的列表中
$ ssh-add ~/.ssh/id_rsa


# 完成免密码登录。
$ssh root@172.17.0.4

Mac系统

Mac的流程与Linux差不多,唯一的不同就是你发现 ping 172.17.0.4 的时候出现超时的情况,具体原因参见:
Mac Docker Desktop的网络特性
如何在Mac SSH到Docker

解决办法就是创建A容器充当ansible的客户端(操纵者),创建B容器充当ansible的服务端(被操纵者),为了更快地创建,这里使用现成的镜像:

$ docker pull renzroque/ansible-client:v1.0

# 启动一个客户端
$ docker run --name ansible-client -d renzroque/ansible-client:v1.0 /usr/sbin/sshd -D

$ docker exec -it ansible-client bash

# 安装openssh-client
apt update && apt install openssh-client

# 启动一个客户端
$ docker run --name ansible-server1 -d renzroque/ansible-client:v1.0 /usr/sbin/sshd -D

免密码登录配置与上述的Linux系统一致。

Ansible连接测试

前面我们已经创建了测试机器,接下来就是Ansible的相关配置以及连接测试

1.配置IP(在ansible-client上)

vim /etc/ansible/hosts


# 填入你容器的IP, 注意指定用户,因为ansible默认使用宿主机的当前用户登录,即如果你的宿主机的当前用户是yangan,使用
# ansible root@172.17.0.5 -m ping 测试的时候实际匹配的是yangan@172.17.0.5, 这会报“Could not match supplied host pattern, # # ignoring: 172.17.0.5”的错误
[webservers]
root@172.17.0.5     ansible_ssh_user=root

2.测试

$ ansible root@172.17.0.5 -m ping
root@172.17.0.5 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

Ansible Inventory文件

其实一开始看的时候,由于看不仔细,并不知道Inventory文件的作用,后面发现其实Inventory文件就是一开始遇到的“/etc/ansible/hosts”配置文件,用于配置机器之间的关系,比如规定这几台机器属于webservers组,另外几台属于dbservers组等等。

# /etc/ansible/hosts
# 设定一个webservers组
[webservers]
foo.example.com
bar.example.com

# 指定端口和用户
[webservers]
foo.example.com  ansible_ssh_user=root  ansible_ssh_port=5555

# 指定机器别名
slave1 ansible_ssh_port=5555 ansible_ssh_host=172.17.0.3

详情参考:
ansible-tran.readthedocs.io/en/latest/d…

Ansible Patterns

作用:确定哪台机器执行服务

$ ansible root@172.17.0.3 -m ping 等同于

$ ansible webservers -m ping

Ansible Ad-Hoc

ad-hoc和ansible playbook的关系相当于 shell 和 shell脚本的关系。比如我们敲入一些执行命令,但不需要将这些执行的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令.

一些常用参数:

  • -k: 使用密码而不是密钥连接机器
  • -u: 远程用户, 等同于 ansible_ssh_user
  • -f: forks, 创建多少个子进程来执行

ad-hoc 命令实例

$ ansible webservers -m shell -a 'echo "ddd"'
root@172.17.0.3 | CHANGED | rc=0 >>
ddd

关于 ansible playbook 的使用请参见下一篇文章~

参考

ansible-tran.readthedocs.io/en/latest/d…
www.fecshop.com/topic/592
blog.csdn.net/u013015629/…
ansible-tran.readthedocs.io/en/latest/d…