使用Ansible管理CoreOS

Managing CoreOS With Ansible演示

  • 系统环境:CoreOS Stable Current
  • 系统用户:core
  • 目标主机:hostname=coreos.example.com,ipaddr=192.168.0.1,
    1. disk1=/dev/sda(系统盘),disk2=/dev/sdb(数据盘)
  • 内容的首行注释表示文件的路径

CoreOS安装python环境

  • 登录目标主机,在系统用户的~/.ssh/authorized_keys里添加用户主机的ssh public key

  • 用户主机安装ansible

    1. $ sudo pip install ansible
    2. $ ansible --verison
  • 用户主机上创建目录ansible

    1. $ mkdir ~/ansible
  • 添加inventory file hosts,内容如下

    1. # ~/ansible/hosts
    2. [coreos]
    3. coreos.example.com
    4. # 为coreos组中的节点定义Ansbile参数
    5. [coreos:vars]
    6. ansible_ssh_user=core
    7. ansible_python_interpreter="PATH=/home/core/bin:$PATH python"
  • 创建目录roles,并安装defunctzombie.coreos-bootstrap

    1. $ mkdir ~/ansible/roles
    2. $ ansible-galaxy install defunctzombie.coreos-bootstrap -p ~/ansible/roles
  • 创建bootstrap.yml,内容如下:

    1. ---
    2. # ~/ansible/bootstrap.yml
    3. - hosts: coreos
    4. roles:
    5. - bootstrap
  • 在目标主机上执行bootstrap playbook,CoreOS上通过pypy提供python环境

    1. $ ansible-playbook -i ~/ansible/hosts ~/ansible/bootstrap.yml
  • 目标主机的bootstrap完成后,系统用户目录下新增了bin和pypy目录

  • 用户主机上检查目标主机的状态

    1. $ ansible -i ~/ansible/hosts coreos.example.com -m ping
    2. $ ansible -i ~/ansible/hosts coreos.example.com -a 'uname -a'

加固CoreOS系统

  • 首次安装后即可使用CoreOS部署容器服务,官方已经优化过系统参数。建议根据实际情况来加固系统安全
  • 以下演示使用Ansible加固CoreOS的sshd服务(强烈推荐)
  • 用户主机创建目录roles/common,可以把基础系统的相关任务都归类到这个目录的playbook

    1. $ mkdir -p ~/ansible/roles/common/{tasks,handlers,files}
  • 创建playbookroles/common/tasks/sshd.yml,内容如下

    1. ---
    2. # ~/ansible/roles/common/tasks/sshd.yml
    3. - name: Configure sshd file
    4. # `src`对应的文件或者目录必须位于`roles/common/files`里
    5. copy: src=sshd_confg dest=/etc/ssh/sshd_config
    6. owner=root group=root mode=0600
    7. # `reload-sshd`在handlers里被定义
    8. notify: reload-sshd
    9. tags: sshd
    10. - name: Start sshd service
    11. service: name=sshd state=started enabled=yes
    12. tags: sshd
  • 创建playbookroles/common/tasks/main.yml,内容如下

    1. ---
    2. # ~/ansible/roles/common/tasks/main.yml
    3. # main.yml没有包含实际的任务,只是用作其他playbook的入口
    4. - include: sshd.yml
  • 创建playbookroles/common/handlers/main.yml,内容如下

    1. ---
    2. # ~/ansible/roles/common/handlers/main.yml
    3. - name: reload sshd
    4. service: name=sshd state=reloaded
  • 创建配置文件roles/common/files/sshd_config,内容如下

    1. # Use most defaults for sshd configuration.
    2. UsePrivilegeSeparation sandbox
    3. Subsystem sftp internal-sftp
    4. ClientAliveInterval 180
    5. UseDNS no
    6. # 禁止root帐号的ssh登录(强烈建议)
    7. PermitRootLogin no
    8. # 禁止密码登录(强烈建议)
    9. ChallengeResponseAuthentication no
    10. PasswordAuthentication no
    11. # 只允许core用户的ssh登录(建议,可选)
    12. AllowUsers core
  • 用户目录创建playbookansible/site.yml,内容如下

    1. ---
    2. # ~/ansible/site.yml
    3. # 将角色common绑定到coreos节点组
    4. - hosts: coreos
    5. roles:
    6. - common
  • 执行playbookansible/site.yml,使目标主机上的服务生效(-t表示只运行对应tag的任务;-D表示显示文件内容差异;-C表示模拟运行,不会实际更改目标主机)

    建议每次执行前都先在参数上加上-DC
    1. $ ansible-playbook -i ~/ansible/hosts ~/ansible/site.yml -t sshd -DC
    2. $ 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属性

  • 用户主机上创建playbookroles/common/tasks/docker.yml(docker是CoreOS默认自带的服务,可以把它归类为基础系统服务),内容如下

    1. ---
    2. # ~/ansible/roles/common/tasks/docker.yml
    3. # 强烈不推荐直接更改/usr/lib/systemd/system/docker.socket
    4. # 应该在/etc/systemd/system/docker.socket.d/里定义用户配置
    5. # systemd unit规范请参考:http://www.freedesktop.org/software/systemd/man/systemd.unit.html
    6. - name: Create directory /etc/systemd/system/docker.socket.d/
    7. file: path=/etc/systemd/system/docker.socket.d
    8. owner=root group=root state=directory
    9. tags: docker
    10. - name: Configure docker socket in /etc/systemd/system/docker.socket.d/10-ListenStream.conf
    11. copy: content="[Socket]\nListenStream=0.0.0.0:2375\n"
    12. dest=/etc/systemd/system/docker.socket.d/10-ListenStream.conf
    13. owner=root group=root mode=0644
    14. # systemd规定服务修改配置后必须执行`systemctl daemon-reload`
    15. notify: systemctl daemon-reload
    16. tags: docker
  • 在playbookroles/common/handlers/main.yml中添加如下内容

    1. - name: systemctl daemon-reload
    2. command: /usr/bin/systemctl daemon-reload
  • 在playbookroles/common/tasks/main.yml中添加- include: docker.yml

  • 执行playbookansible/site.yml

    1. $ ansible-playbook -i ~/ansible/hosts ~/ansible/site.yml -t docker -DC
    2. $ ansible-playbook -i ~/ansible/hosts ~/ansible/site.yml
    3. $ 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

    1. $ docker -H tcp://192.168.0.1:2375 info

CoreOS挂载文件系统

  • 推荐CoreOS使用LVM卷动态调整分区
  • 建议安装CoreOS的服务器本地磁盘应该分为两种:系统盘和数据盘,非系统生成的数据应该全部写入数据盘内
  • 以下演示使用Ansible通过systemd挂载文件系统
  • 用户主机上创建playbookroles/common/tasks/mount.yml,内容如下

    1. ---
    2. # ~/ansible/roles/common/tasks/mount.yml
    3. # 将数据盘/dev/sdb加入LVM卷组VG0
    4. - name: vgcreate vg0 /dev/sdb
    5. lvg: pvs=/dev/sdb vg=VG0 state=present
    6. tags: mount
    7. # 创建100G的LVM分区/dev/VG0/LV0
    8. - name: lvcreate -L 100G -n LV0 VG0
    9. lvol: lv=LV0 vg=VG0 size=100G state=present
    10. tags: mount
    11. # 使用xfs格式化LVM分区,如果已经存在文件系统则不操作
    12. # force=true会强制执行格式化
    13. - name: mkfs.xfs /dev/VG0/LV0
    14. filesystem: dev=/dev/VG0/LV0 fstype=xfs
    15. tags: mount
    16. # 创建systemd mount file
    17. # /dev/VG0/LV0将被挂载到/srv/www
    18. # systemd mount的规范请参考:http://www.freedesktop.org/software/systemd/man/systemd.mount.html
    19. - name: Configure srv-www.mount
    20. copy: src=srv-www.mount dest=/etc/systemd/system/srv-www.mount
    21. owner=root group=root mode=0644
    22. tags: mount
    23. # 启动服务挂载文件系统
    24. - name: Start srv-www.mount
    25. service: name=srv-www.mount state=started enabled=yes
    26. tags: mount
  • 创建文件roles/common/files/srv-www.mount,内容如下

    1. # ~/ansible/roles/common/files/srv-www.mount
    2. [Mount]
    3. What=/dev/VG0/LV0
    4. Where=/srv-www
    5. Type=xfs
    6. Options=noatime,nobarrier
    7. [Install]
    8. WantedBy=multi-user.target
  • 在playbookroles/common/tasks/main.yml添加- include: mount.yml

  • 执行playbookansible/site.yml

    1. $ ansible-playbook -i ~/ansbile/hosts ~/ansible/site.yml -t mount -DC
    2. $ ansible-playbook -i ~/ansbile/hosts ~/ansible/site.yml -t mount

后记

  • 本文因为篇幅有限,目前只提供了部分Ansible配置示例。未来还会不定期更新。
  • 有兴趣的用户可以在官方和社区获得更多的帮助。