Skip to content

Latest commit

 

History

History
243 lines (171 loc) · 9.09 KB

management.md

File metadata and controls

243 lines (171 loc) · 9.09 KB

使用Ansible管理CoreOS

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=core
    ansible_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: coreos
      roles:
        - 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}
    
  • 创建playbookroles/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_config
        owner=root group=root mode=0600
      # `reload-sshd`在handlers里被定义
      notify: reload-sshd
      tags: sshd
    
    - name: Start sshd service
      service: name=sshd state=started enabled=yes
      tags: sshd
    
  • 创建playbookroles/common/tasks/main.yml,内容如下

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

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

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

    ---
    # ~/ansible/site.yml
    
    # 将角色common绑定到coreos节点组
    - hosts: coreos
      roles:
        - common
    
  • 执行playbookansible/site.yml,使目标主机上的服务生效(-t表示只运行对应tag的任务;-D表示显示文件内容差异;-C表示模拟运行,不会实际更改目标主机)
    建议每次执行前都先在参数上加上-DC

    $ 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属性

  • 用户主机上创建playbookroles/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.d
        owner=root group=root state=directory
      tags: docker
    
    - name: Configure docker socket in /etc/systemd/system/docker.socket.d/10-ListenStream.conf
      copy: content="[Socket]\nListenStream=0.0.0.0:2375\n"
        dest=/etc/systemd/system/docker.socket.d/10-ListenStream.conf
        owner=root group=root mode=0644
      # systemd规定服务修改配置后必须执行`systemctl daemon-reload`
      notify: systemctl daemon-reload
      tags: docker
    
  • 在playbookroles/common/handlers/main.yml中添加如下内容

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

  • 执行playbookansible/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挂载文件系统
  • 用户主机上创建playbookroles/common/tasks/mount.yml,内容如下

    ---
    # ~/ansible/roles/common/tasks/mount.yml
    
    # 将数据盘/dev/sdb加入LVM卷组VG0
    - name: vgcreate vg0 /dev/sdb
      lvg: pvs=/dev/sdb vg=VG0 state=present
      tags: mount
      
    # 创建100G的LVM分区/dev/VG0/LV0
    - name: lvcreate -L 100G -n LV0 VG0
      lvol: lv=LV0 vg=VG0 size=100G state=present
      tags: mount
    
    # 使用xfs格式化LVM分区,如果已经存在文件系统则不操作
    # force=true会强制执行格式化
    - name: mkfs.xfs /dev/VG0/LV0
      filesystem: dev=/dev/VG0/LV0 fstype=xfs
      tags: 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.mount
      copy: src=srv-www.mount dest=/etc/systemd/system/srv-www.mount
        owner=root group=root mode=0644
      tags: mount
      
    # 启动服务挂载文件系统
    - name: Start srv-www.mount
      service: name=srv-www.mount state=started enabled=yes
      tags: mount
    
  • 创建文件roles/common/files/srv-www.mount,内容如下

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

  • 执行playbookansible/site.yml

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

后记

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