前言
我个人对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…