Ansible

作者: 一吻江山 | 来源:发表于2018-10-13 11:48 被阅读8次

    Ansible是配置管理和应用部署工具,
    Ansible默认通过SSH协议管理服务器。

    安 装


    pip3 install ansible
    
    # Mac也可以用brew安装
    brew install ansible
    

    定 义 服 务 器 的 清 单 列 表 文 件


    创建/etc/ansible/hosts文件,文件内容:

    [webservers]
    10.211.55.3 ansible_ssh_user=parallels
    10.211.55.4 ansible_ssh_user=root
    
    [dbservers]
    #设置别名
    Ubuntu ansible_ssh_host=10.211.55.4 ansible_ssh_user=parallels 
    #设置本地的连接类型
    localhost ansible_connection=local 
    
    # 把一个组作为另一个组的子成员
    [southeast:children]
    webservers
    servers
    
    [other]
    # foo.example.com
    # db[01:20].jason.com   #db01到db20这20个服务器
    # db-[a:f].example.com
    # db.jason.com:5501     #使用5501作为ssh连接端口 
    

    hosts文件参考:Inventory文件

    使用


    ansible

    Usage: ansible <host-pattern> [options]

    #  -m MODULE_NAME, --module-name=MODULE_NAME
    #                   module name to execute (default=command)
    #  -a MODULE_ARGS, --args=MODULE_ARGS
    #                    module arguments
    #  -f FORKS, --forks=FORKS
    #                   specify number of parallel processes to use
    #                   (default=5)
    # -f表示同时执行,提高并发效率
    
    ➜  ~ ansible all -m command -a"whoami" -f 3
    10.211.55.3 | CHANGED | rc=0 >>
    parallels
    
    Ubuntu | CHANGED | rc=0 >>
    parallels
    
    localhost | CHANGED | rc=0 >>
    zhoujie
    

    host-pattern参考Working with Patterns
    -m参考:全部模块

    # 创建一个默认权限的文件,用ansible修改文件权限
    ➜  ~ touch /tmp/file
    ➜  ~ ls -l /tmp/file
    -rw-r--r--  1 zhoujie  wheel  0 Oct 13 12:10 /tmp/file
    
    # 可以修改目标文件权限、用户组
    ➜  ~ ansible localhost -m file -a"dest=/tmp/file mode=666 owner=zhoujie group=wheel"
    
    ➜  ~ ls -l /tmp/file
    -rw-rw-rw-  1 zhoujie  wheel  0 Oct 13 12:10 /tmp/file
    
    ➜  ~ ansible 10.211.55.3 -a"ls /tmp/file"
    10.211.55.3 | FAILED | rc=2 >>
    ls: cannot access '/tmp/file': No such file or directorynon-zero return code
    
    # 把本地文件复制到目标服务器下
    ➜  ~ ansible 10.211.55.3 -m copy -a"src=/tmp/file dest=/tmp/file"
    
    ➜  ~ ansible 10.211.55.3 -a"ls /tmp/file"
    10.211.55.3 | CHANGED | rc=0 >>
    /tmp/file
    
    # “state=present”确保安装,但是不更新。
    # 如果使用“state=latest”表示确保安装到最新版;
    # “state=absent”表示确保没有安装。
    # 不同的系统安装包的模块不同,apt模块仅限Debian/Ubuntu系统
    ➜  ~ ansible 10.211.55.3 -m apt -a"name=nginx state=present"
    
    #使用Git克隆最新的代码到目录
    ➜  ~ ansible 10.211.55.3 -m git -a"repo=https://github.com/zhoujie903/superlists.git dest=/home/parallels/sites/superlists version=HEAD"
    
    # 下载文件
    ➜  ~ ansible 10.211.55.3 -m get_url -a"url=http://download.redis.io/redis-stable.tar.gz dest=/tmp/redis-stable.tar.gz"
    

    ansible-playbook

    剧本(Playbooks)是Ansible的配置、部署、编排语言。它们可以被描述为一个需要远程主机执行的命令集合。

    剧本文件:playbook.yml, 使用YAML格式

    ---
    - hosts: all
    
      vars:
        host: "www.superlist.com"
    
      tasks:
        - name: Deadsnakes PPA to get Python 3.6
          apt_repository:
            repo='ppa:fkrull/deadsnakes'
    
        - name: make sure required packages are installed
          apt: pkg=nginx,git,python3.6,python3.6-venv state=present
    
        - name: add nginx config to sites-available
          #.j2为模板文件,模板文件里一般使用上面vars字段定义的变量
          template: src=./nginx.conf.j2 dest=/etc/nginx/sites-available/{{ host }}
          notify:
            - restart nginx #这里的值为下面handlers:name的值
    
        - name: add symlink in nginx sites-enabled
          file:
            src=/etc/nginx/sites-available/{{ host }}
            dest=/etc/nginx/sites-enabled/{{ host }}
            state=link
          notify:
            - restart nginx
    
        - name: write gunicorn service script
          template:
            src=./gunicorn.service.j2
            dest=/etc/systemd/system/gunicorn-{{ host }}.service
          notify:
            - restart gunicorn
    
      handlers:
        - name: restart nginx  #上面有2个任务都发出了notify,这个handler只执行一次
          service: name=nginx state=restarted
    
        - name: restart gunicorn
          systemd:
            name=gunicorn-{{ host }}
            daemon_reload=yes
            enabled=yes
            state=restarted
    

    playbook文件里可以包含的几个重要概念:hostsvarstaskshandlers
    playbook文件里还可包含的重要概念:roles[见下文]
    大概的意思:对hosts中匹配到的每台主机按顺序执行tasks中定义的每个任务,
    handlers只有在全部tasks执行完时且有任务发出notify时,才会执行相应的操作,不然不执行。

    • 运行剧本文件:
      ansible-playbook [options] playbook.yml [playbook2 ...]
    • 检查格式是否正确:
      ansible-playbook --syntax-check playbook.yml
    • 提供密码:
      ansible-playbook playbook.yml -K
      -K"ask for privilege escalation password"
    • 运行部分任务:
      ansible-playbook -t "delete, create" playbook.yml,
      -t"-t TAGS, --tags=TAGS only run plays and tasks tagged with these values"
    • 从某个任务为起点:
      ansible-playbook playbook.yml --start-at-task="install packages"
    • 条件执行:当bool_var: false时,TASK [create file]任务不执行
    ➜  Desktop ansible-playbook playbook.yml
    
    PLAY [localhost] ***************************************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [localhost]
    
    TASK [create file] *************************************************************
    changed: [localhost]
    
    TASK [delete file] *************************************************************
    ok: [localhost]
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=3    changed=1    unreachable=0    failed=0
    
    

    Roles

    当我们刚开始学习运用 playbook 时,可能会把 playbook 写成一个很大的文件,到后来可能你会希望这些文件是可以方便去重用的,所以需要重新去组织这些文件。

    Roles基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。
    基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles

    目录结构:

    playbook.yml
    webservers.yml
    fooservers.yml
    roles/
       common/
         tasks/
         handlers/
         files/
         templates/
         vars/
         defaults/
         meta/
       rolename/
         tasks/
         defaults/
         meta/
    

    一个 playbook[playbook.yml] 如下:

    ---
    - hosts: webservers
      roles:
         - common
         - rolename
    

    这个 playbook 为一个角色 ‘x’[rolename] 指定了如下的行为:

    • 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
    • 如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
    • 如果 roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
    • 如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中
    • 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。
    • 所有 script tasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。
    • 所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路径。
    • 所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路径。

    ansible-galaxy

    Ansible Galaxy是一个免费网站,
    用于查找,下载,评级和审查各种社区开发的Ansible角色,
    可以成为您自动化项目快速启动的绝佳方式。

    比如用ansible在Mac上安装Homebrew

    ansible-galaxy install geerlingguy.homebrew
    

    ansible-galaxy: Perform various Role related operations.

    参考:geerlingguy.homebrew

    文档


    Ansible英文文档
    Ansible中文文档
    SSH原理与运用(一):远程登录
    YAML

    相关文章

      网友评论

          本文标题:Ansible

          本文链接:https://www.haomeiwen.com/subject/uckoaftx.html