使用Ansible管理CoreOS
- 官方教程请参考:https://coreos.com/blog/managing-coreos-with-ansible/
- CoreOS标准的Init程序和配置平台是systemd,任何服务都应当参照systemd的规范部署
- CoreOS Systemd官方文档请参考:https://coreos.com/using-coreos/systemd/
Managing CoreOS With Ansible演示
- 系统环境:CoreOS Stable Current
- 系统用户:core
- 目标主机:hostname=coreos.example.com,ipaddr=192.168.0.1,
disk1=/dev/sda(系统盘),disk2=/dev/sdb(数据盘)- 内容的首行注释表示文件的路径
CoreOS安装python环境
登录目标主机,在系统用户的~/.ssh/authorized_keys里添加用户主机的ssh public key
用户主机安装ansible
$ sudo pip install ansible$ ansible --verison
用户主机上创建目录
ansible$ mkdir ~/ansible
添加inventory file
hosts,内容如下# ~/ansible/hosts[coreos]coreos.example.com# 为coreos组中的节点定义Ansbile参数[coreos:vars]ansible_ssh_user=coreansible_python_interpreter="PATH=/home/core/bin:$PATH python"
创建目录
roles,并安装defunctzombie.coreos-bootstrap$ mkdir ~/ansible/roles$ ansible-galaxy install defunctzombie.coreos-bootstrap -p ~/ansible/roles
创建
bootstrap.yml,内容如下:---# ~/ansible/bootstrap.yml- hosts: coreosroles:- bootstrap
在目标主机上执行bootstrap playbook,CoreOS上通过pypy提供python环境
$ ansible-playbook -i ~/ansible/hosts ~/ansible/bootstrap.yml
目标主机的bootstrap完成后,系统用户目录下新增了bin和pypy目录
用户主机上检查目标主机的状态
$ ansible -i ~/ansible/hosts coreos.example.com -m ping$ ansible -i ~/ansible/hosts coreos.example.com -a 'uname -a'
加固CoreOS系统
- 首次安装后即可使用CoreOS部署容器服务,官方已经优化过系统参数。建议根据实际情况来加固系统安全
- 以下演示使用Ansible加固CoreOS的sshd服务(强烈推荐)
用户主机创建目录
roles/common,可以把基础系统的相关任务都归类到这个目录的playbook$ mkdir -p ~/ansible/roles/common/{tasks,handlers,files}
创建playbook
roles/common/tasks/sshd.yml,内容如下---# ~/ansible/roles/common/tasks/sshd.yml- name: Configure sshd file# `src`对应的文件或者目录必须位于`roles/common/files`里copy: src=sshd_confg dest=/etc/ssh/sshd_configowner=root group=root mode=0600# `reload-sshd`在handlers里被定义notify: reload-sshdtags: sshd- name: Start sshd serviceservice: name=sshd state=started enabled=yestags: sshd
创建playbook
roles/common/tasks/main.yml,内容如下---# ~/ansible/roles/common/tasks/main.yml# main.yml没有包含实际的任务,只是用作其他playbook的入口- include: sshd.yml
创建playbook
roles/common/handlers/main.yml,内容如下---# ~/ansible/roles/common/handlers/main.yml- name: reload sshdservice: name=sshd state=reloaded
创建配置文件
roles/common/files/sshd_config,内容如下# Use most defaults for sshd configuration.UsePrivilegeSeparation sandboxSubsystem sftp internal-sftpClientAliveInterval 180UseDNS no# 禁止root帐号的ssh登录(强烈建议)PermitRootLogin no# 禁止密码登录(强烈建议)ChallengeResponseAuthentication noPasswordAuthentication no# 只允许core用户的ssh登录(建议,可选)AllowUsers core
用户目录创建playbook
ansible/site.yml,内容如下---# ~/ansible/site.yml# 将角色common绑定到coreos节点组- hosts: coreosroles:- common
执行playbook
建议每次执行前都先在参数上加上-DCansible/site.yml,使目标主机上的服务生效(-t表示只运行对应tag的任务;-D表示显示文件内容差异;-C表示模拟运行,不会实际更改目标主机)$ ansible-playbook -i ~/ansible/hosts ~/ansible/site.yml -t sshd -DC$ ansible-playbook -i ~/ansible/hosts ~/ansible/site.yml -t sshd
调整CoreOS系统服务
- docker damon默认的socket文件是/var/run/docker.sock,只允许在本地使用Docker Remote API
- 以下演示使用Ansible通过systemd开启docker的TCP Socket
CoreOS上默认的Docker Socket在
/usr/lib/systemd/system/docker.socket中定义,需要调整ListenStream属性用户主机上创建playbook
roles/common/tasks/docker.yml(docker是CoreOS默认自带的服务,可以把它归类为基础系统服务),内容如下---# ~/ansible/roles/common/tasks/docker.yml# 强烈不推荐直接更改/usr/lib/systemd/system/docker.socket# 应该在/etc/systemd/system/docker.socket.d/里定义用户配置# systemd unit规范请参考:http://www.freedesktop.org/software/systemd/man/systemd.unit.html- name: Create directory /etc/systemd/system/docker.socket.d/file: path=/etc/systemd/system/docker.socket.downer=root group=root state=directorytags: docker- name: Configure docker socket in /etc/systemd/system/docker.socket.d/10-ListenStream.confcopy: content="[Socket]\nListenStream=0.0.0.0:2375\n"dest=/etc/systemd/system/docker.socket.d/10-ListenStream.confowner=root group=root mode=0644# systemd规定服务修改配置后必须执行`systemctl daemon-reload`notify: systemctl daemon-reloadtags: docker
在playbook
roles/common/handlers/main.yml中添加如下内容- name: systemctl daemon-reloadcommand: /usr/bin/systemctl daemon-reload
在playbook
roles/common/tasks/main.yml中添加- include: docker.yml执行playbook
ansible/site.yml$ ansible-playbook -i ~/ansible/hosts ~/ansible/site.yml -t docker -DC$ ansible-playbook -i ~/ansible/hosts ~/ansible/site.yml$ ansible -i ~/ansible/hosts coreos.example.com -m shell -a 'sudo systemctl stop docker.service && sudo systemctl restart docker.socket && sudo systemctl start docker.service'
在目标主机上验证Docker TCP Socket
$ docker -H tcp://192.168.0.1:2375 info
CoreOS挂载文件系统
- 推荐CoreOS使用LVM卷动态调整分区
- 建议安装CoreOS的服务器本地磁盘应该分为两种:系统盘和数据盘,非系统生成的数据应该全部写入数据盘内
- 以下演示使用Ansible通过systemd挂载文件系统
用户主机上创建playbook
roles/common/tasks/mount.yml,内容如下---# ~/ansible/roles/common/tasks/mount.yml# 将数据盘/dev/sdb加入LVM卷组VG0- name: vgcreate vg0 /dev/sdblvg: pvs=/dev/sdb vg=VG0 state=presenttags: mount# 创建100G的LVM分区/dev/VG0/LV0- name: lvcreate -L 100G -n LV0 VG0lvol: lv=LV0 vg=VG0 size=100G state=presenttags: mount# 使用xfs格式化LVM分区,如果已经存在文件系统则不操作# force=true会强制执行格式化- name: mkfs.xfs /dev/VG0/LV0filesystem: dev=/dev/VG0/LV0 fstype=xfstags: mount# 创建systemd mount file# /dev/VG0/LV0将被挂载到/srv/www# systemd mount的规范请参考:http://www.freedesktop.org/software/systemd/man/systemd.mount.html- name: Configure srv-www.mountcopy: src=srv-www.mount dest=/etc/systemd/system/srv-www.mountowner=root group=root mode=0644tags: mount# 启动服务挂载文件系统- name: Start srv-www.mountservice: name=srv-www.mount state=started enabled=yestags: mount
创建文件
roles/common/files/srv-www.mount,内容如下# ~/ansible/roles/common/files/srv-www.mount[Mount]What=/dev/VG0/LV0Where=/srv-wwwType=xfsOptions=noatime,nobarrier[Install]WantedBy=multi-user.target
在playbook
roles/common/tasks/main.yml添加- include: mount.yml执行playbook
ansible/site.yml$ ansible-playbook -i ~/ansbile/hosts ~/ansible/site.yml -t mount -DC$ ansible-playbook -i ~/ansbile/hosts ~/ansible/site.yml -t mount
后记
- 本文因为篇幅有限,目前只提供了部分Ansible配置示例。未来还会不定期更新。
- 有兴趣的用户可以在官方和社区获得更多的帮助。
