今天我们重点讲 ansible的 playbook 使用,因为它通吃所有的服务器操作,其它使用姿势本文就不演示了.

先看效果

[图1]
ansible.gif

这样一行命令,就搞定了nginx 的一个配置,都不用登录服务器

下面是本教程的demo代码:https://github.com/jackysong/docker_lnmp_swoole_efk_java
欢迎start 和 follow

如图2所示目录机构
[图2]
an3.png

操作步骤:

第一步,编辑hosts,把目标服务器信息录入到hosts 文件

[test]
192.168.10.110 ansible_ssh_user=root ansible_ssh_pass=your_password
192.168.10.111 ansible_ssh_user=root ansible_ssh_pass=your_password
    
[test-1]
127.0.0.1 ansible_ssh_user=root ansible_ssh_pass=your_password

注意事项:

  1. ansible 的 host 都是基于 ssh 的,所以请提前把 ssh远程登录配置好 默认的 hosts
  2. hosts文件一般是安装在是在ansible配置目录下,可以自定义路径,修改配置文件即可

mac 是~/.ansible.cfg

linux 是在/etc/ansible/


[defaults]
inventory       = /Users/jackysong/Work/devops/hosts  #这个是 hosts 文件目录,可以修改成你的路径
#library         = ~/.ansible/plugins/modules:/usr/share/ansible/plugins/modules
#module_utils    = ~/.ansible/plugins/module_utils:/usr/share/ansible/plugins/module_utils
#remote_tmp      = ~/.ansible/tmp
#local_tmp       = ~/.ansible/tmp
#forks           = 5
#poll_interval   = 0.001
#ask_pass        = False
#transport       = smart

第二步,编写 playbook 脚本

这个脚本是核心,playbook好比是舞台脚本,roles就是舞台中扮演的各个角色,舞台脚本是由各个角色合作去完成的,所以角色是核心的核心。

下面我们来简单的介绍下 role 的功能,如图2,我们建立了roles目录,下面建立了若干角色,一个角色一个子目录,比如 git 拉取,copy 文件,gulp 命令等,任何常规的,重复操作,你都可以自己抽象成一个角色,角色的目录构成如下

tasks/   角色要执行的任务列表
handlers/  角色执行中或执行后要执行的操作,比如改了配置文件要重启的操作,可以放这里面
library/ 角色执行中如果要执行某些脚本,可以放这里
files/  角色部署的文件
templates/ 角色部署的模板
vars/ 角色执行的其它变量
defaults/ 角色需要的变量默认值,如果playbook 调用这个角色,不单独设置变量,就以这里面默认变量为准
meta/ 角色的元数据,包括该角色的依赖关系

我在根目录下建了一个 sample.yml作为playbook 的例子,大家可以参考一下。你可以一台服务器一个 yml,或者同一类型的服务用一个 yml 都可以

---
- hosts: test  # 对应 hosts文件里的主机标签,该标签下放多个主机地址,这个脚本就会在多台主机上执行相关脚本,100台服务器同时安装一个软件的奥秘在此

  vars: #这边推荐放一些公共变量,比如下面roles 都会用到的变量,如果只是某个 roles 执行时需要用到的私有变量,可以放 roles下面

  roles:
    - { role: yum, app: ["git", "curl", "python-pip"], tags: ["software"] }
    - { role: docker, tags: ["docker"] }

    - {
        role: git, # git参照 roles 下面的 git
        tags: ["git.devops"], # tag,playbook 执行的时候需要,可以打多个tag,用逗号隔开
        project_name: "devops", #项目名
        repository: "git@github.com:jackysong/docker_lnmp_swoole_efk_java.git", # 这边改成你自己的 git 地址
        dest_path: "/opt/web/devops", # 服务器上目录
        branch: "master", # git所在分支
      }


    - {
        role: templates,
        tags: ["nginx", "nginx.frontend"],
        file: sites-enabled/vue.conf.j2,
        path: "/opt/web/devops/dockerFile/nginx/sites-enabled/test.xx.com.conf",
        nginx_domain: "test.xx.com",
        nginx_path: "/opt/web/test",
      }

  tasks:
    - name: restartnginx
      shell: cd /opt/web/devops/dockerFile && docker-compose up -d --build nginx
      tags:
        - restartnginx

这就是一个完整的 playbook的例子,那怎么执行它呢?

ansible-playbook 脚本本地绝对路径 -t tags标签名(多个逗号隔开) -vv

例子

ansible-playbook ~/Work/docker_lnmp_swoole_efk_java/ansible/sample.yml  -t git.devops,nginx.frontend -vv