• ansible概述


    一、ansible相关文档:

    中文权威指南:http://ansible.com.cn

    GitHub上的ansible-galaxy示例:http://galaxy.ansible.com

    参考链接:https://www.jianshu.com/p/03e5822a31ba

     二、ansible特性: 最多管理500台主机,更多效率会降低

    1、模块化:调用特定的模块,完成特定的任务
    2、有paramiko、pyyaml、jinja2三个关键模块
    3、支持自定义模块
    4、基于python语言实现
    5、部署简单,基于python和ssh,agentless(无自己的代理服务)
    6、安全,基于openssh
    7、支持playbook编排任务,类似于脚本功能,多个脚本的集合称为roles
    8、幂等性,一个任务执行一次和执行n次效果一样,不因重复执行带来意外情况
    9、无需代理,不依赖pki
    10、可使用任何编程语言写模块
    11、yaml格式,编排任务,支持丰富的数据结构
    12、较强大的多层解决方案

    ansible命令执行过程

    1、加载自己的配置文件,默认/etc/ansible/ansible.cfg
    2、加载自己对应的模块文件,如command
    3、通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数组/xxx.py文件
    4、给文件赋予执行权限
    5、执行并返回结果
    6、删除临时py文件,sleep 0退出
    执行状态:(颜色定义在/etc/ansible/ansible.cfg中)
        绿色:执行成功并且不需要做改变的操作
        黄色:执行成功并且对目标主机做变更
        红色:执行失败

    1、ansible基本命令使用

    ansible软件安装:多种安装方法

    1、基于epel源的yum安装:yum -y install ansible,非服务,只是一个管理工具
    2、编译安装
    3、GitHub方式安装
    4、pip安装

    ansible的重要和主要文件

    配置文件:
    /etc/ansible/ansible.cfg  配置ansible的工作特性
    /etc/ansible/hosts   主机清单
    /etc/ansible/roles    存放的角色目录
    程序文件:
    /usr/bin/ansible    ansible的可执行命令
    /usr/bin/ansible-doc    查看配置文档,模块功能查看工具,man帮助
    /usr/bin/ansible-galaxy    上传/下载优秀代码或roles模块的官网平台
    /usr/bin/ansible-playbook    管理执行编排的playbook剧本服务
    /usr/bin/ansible-vault    文件加密工具
    /usr/bin/ansible-console    基于console界面与用户交互的执行工具

    ansible主机清单配置:/etc/ansible/hosts

    # 支持分组或不分组等方式
    [beijing]
    193.168.1.112
    193.168.1.153
    193.168.1.167 ansible_ssh_private_key_file=/etc/ansible/ssh_keys/bj-intranet-root-id_rsa ansible_ssh_user=root 
    193.168.1.136 ansible_ssh_private_key_file=/etc/ansible/ssh_keys/bj-intranet-root-id_rsa ansible_ssh_user=root 
    193.168.1.193
    193.168.1.192
    193.168.1.116
    193.168.1.108
    193.168.1.123
    193.168.1.126
    
    [develop]
    193.168.1.167 ansible_ssh_private_key_file=/etc/ansible/ssh_keys/bj-intranet-root-id_rsa ansible_ssh_user=root 
    193.168.1.136 ansible_ssh_private_key_file=/etc/ansible/ssh_keys/bj-intranet-root-id_rsa ansible_ssh_user=root 
    
    [shenzhen]
    10.0.13.216 
    10.0.13.217
    10.0.14.201 
    10.0.14.202
    10.0.14.203
    10.0.14.204
    10.0.14.205
    10.0.14.206
    10.0.14.207
    10.0.14.208
    
    [beijing:vars]
    ansible_ssh_private_key_file=/etc/ansible/ssh_keys/bj-intranet-ali-yunxiao-id_rsa
    ansible_ssh_user=ali-yunxiao
    ansible_ssh_port=60622
    
    [shenzhen:vars]
    ansible_ssh_private_key_file=/etc/ansible/ssh_keys/bj-intranet-ali-yunxiao-id_rsa
    ansible_ssh_user=ali-yunxiao
    ansible_ssh_port=60622
    #ansible_su_user=root
    ansible_su_pass=456123
    #ansible_become_pass=123456
    
    [all:vars]
    ansible_ssh_private_key_file=/etc/ansible/ssh_keys/bj-intranet-root-id_rsa
    ansible_ssh_user=root
    ansible_ssh_port=60622
    ansible_su_user=root
    ansible_su_pass=456123
    ansible_become_pass=123456

    ansible配置文件:/etc/ansible/ansible.cfg

    配置文件只提供默认值,但可以通过playbook的设置进行覆盖
    配置文件可以放在/etc/ansible/ansible.cfg中,也可以放到一个工作目录下命名为.ansible.cfg
    
    [defaults]
    inventory = /etc/ansible/hosts - 主机列表配置文件
    library = /usr/share/my_modules/ - 库文件存放目录
    remote_tmp = $HOME/.ansible/tmp -临时py命令文件存放在远程主机目录
    local_tmp = $HOME/.ansible/tmp - 本机的临时命令执行目录
    forks = 5 - 默认并发数
    sudo_user = root - 默认sudo 用户
    ask_sudo_pass = True -每次执行ansible命令是否询问ssh密码
    ask_pass = True
    remote_port = 22
    host_key_checking = False  -检查对应服务器的host_key,建议取消注释
    log_path=/var/log/ansible.log -建议启用日志文件,利于排错
    [color] 定义ansible命令的执行结果颜色的

    配置文件说明和建议修改的项:

    local_tmp和remote_tmp:
        本地临时文件和远程临时文件:把playbook转化成python程序,先放在本地
        家目录的.ansible/tmp下,然后再通过ssh协议复制到远程主机的.ansible/tmp下,执行完毕后自动删除.
    host_key_checking = False -检查对应服务器的host_key,建议取消注释
    log_path=/var/log/ansible.log -建议启用日志文件,利于排错
    module_name = command   -默认使用的命令模块,可以修改成shell
        建议修改为:module_name = shell

    2、ansible常用模块详解

    ansible-doc: 显示模块帮助
    ansible-doc  【options】 【module】
        -a  显示所有模块的文档
        -l   --list,列出可用模块
        -s  --snippet  显示指定模块的playbook片段
    示例:
        ansible-doc -l  列出所有功能模块
        ansible-doc ping  查看ansible中的ping用法
        ansible-doc -s shell  查看shell模块的使用方法 

    ansible的常用基本选项

    ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议使用密钥认证的方式管理被管理节点
    ansible语法:
    ansible  【host-pattern】 【-m module_name】 【-a args】
    --version  显示版本
    -m module  指定模块
    -v 详细过程 -vv -vvv更详细
    --list-hosts  显示主机列表,可简写 --list
    -k  --ask-pass  提示输入ssh链接密码
    -K  --ask-become-apss  提示输入sudo时的口令
    -C  --check  检查,并不执行
    -T   --timeout=3  执行命令的超时时间,默认10s
    -u   --user=REMOTE_USER  执行远程执行的用户
    -b   --become  代替旧版的sudo切换

    ansible主机清单表时方法:host-pattern

    1、all:表示所有inventory中的主机
    2、*:通配符
    如:ansible  192168.* 
    3、:或的关系
    如:ansible  “web:db” 对两个组的主机执行操作
    4、:&  且的关系
    如:ansible  “web:&db” 对既在web组又在db组的主机执行操作
    5、:! 非,取反
    如:ansible "web:!db"  对在web组但不在db组的主机执行操作
    6、正则
    如:ansible  "~(web|db).*.centos.com"

    ansible之playbook

     playbook中的核心元素

    1、Hosts执行的远程主机列表
    2、remote_user: 可用于Host和task中
    3、Tasks  任务集
    4、variables 内置变量或自定义变量,在playbook中调用
    5、templates  模板,可替换模板文件中的变量并实现一些简单逻辑的文件
    6、handlers和notify结合使用,由特定条件触发的操作,满足条件方才执行
    7、tags  标签,指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然非常长。此时,如果确信其没有变化,就可以通过tags跳过这些代码片段
    8、handlers和notify

    运行playbook

    ansible-playbook  [filename.yaml]  ... [options]
    常见选项:
    -C  --check 只检测可能会发送的改变,但不真正执行操作
    -l  --list-hosts  列出运行任务的主机
    --limit  主机列表  只针对主机列表中的主机执行
    -v 显示过程 -vv  -vvv更详细

    示例1:

    示例1:写一个安装启动httpd的playbook:install_httpd.yml
            包括创建用户,安装httpd包,开启服务,并设置开机启动
    - hosts: all
      remote_user: root
      tasks:
        - name: creat user
          user: name=httpd shell=/sbin/nologin uid=1234 home=/data/httpd
        - name: copy config
          copy: src=/data/httpd.conf dest=/etc/httpd/conf/httpd.conf
        - name: install package
          yum: name=httpd
        - name: service
          service: name=httpd state=started enabled=yes
    备注:
        执行完通过以下命令判断每个任务都否都执行成功了
        1.ansible all -a 'getent passwd httpd'
        2.ansible all -a 'rpm -q httpd'
        3..ansible all -a 'ss -ntlp|grep 80'
    
    示例2:写一个删除上面的playbook:remove_httpd.yml
            包括:删除用户,卸载httpd包
    - hosts: all
      remote_user: root
      tasks:
        - name: del user
          user: name=httpd state=absent remove=yes
        - name: remove package
          yum: name=httpd state=absent
    备注:
        如果只删除特定主机的httpd,而不是全部,需要加--limit选项
        ansible-playbook --limit 192.168.34.105 remove_httpd.yml
            只限制在192.168.34.105的主机执行

    上面的playbook只是实现了简单的安装配置功能,但是不能根据在更改配置文件后,再次执行,因为服务设置是start,不合理,所以要用到触发条件来达到更改控制的目的。

    handlers:是task列表,这些task与前述的task并没有本质不同,用于当关注的资源发送变化时,才会采取一定的操作
    notify:此action可用于在每个play的最后触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作成为handler,也即notify中调用handler中定义的操作
    示例:将memcached的配置文件的端口更改后再复制到各主机上,服务需要重启,则用到了handlers和notify功能 (端口11211改成11200)
    - hosts: all
      remote_user: root
      tasks:
        - name: creat user
          user: name=memcached shell=/sbin/nologin uid=2345
        - name: install package
          yum: name=memcached
        - name: copy config
          copy: src=/data/memcached dest=/etc/sysconfig/memcached
          notify: restart service   和handlers名称一致
        - name: service
          service: name=memcached state=started enabled=yes
      handlers:
        - name: restart service  和notify名称一致
          service: name=memcached state=restarted 
    备注:停止并删除用户和安装包
        ansible all -a 'service memcached stop'
        ansible all -a 'ss -ntl'
        ansible all -a 'rpm -q memcached'
        ansible all -a 'getent passwd memcached'

    可以多个notify对应一个handlers,也可以多个notify对应多个handlers

    示例:多个notify对应一个handlers
    - hosts: websrvs
      remote_user: root
      tasks:
        - name: Install httpd
          yum: name=httpd state=present
        - name: Install configure file
          copy: src=files/httpd.conf dest=/etc/httpd/conf/
          notify: restart httpd  第一个notify
        - name: ensure apache is running
          service: name=httpd state=started enabled=yes
          notify: restart httpd  第二个notify
      handlers:  
        - name: restart httpd   对应一个handlers
          service: name=httpd status=restarted
      - hosts: websrvs
        remote_user: root
        tasks:
          - name: config
            copy: src=/root/config.txt dest=/etc/nginx/nginx.conf
            notify:
              - Restart Nginx
              - Check Nginx Process  多个notify的写法
         
        handlers:
          - name: Restart Nginx     对应写多个handlers
            service: name=nginx state=restarted enabled=yes
          - name: Check Nginx process
            shell: killall -0 nginx > /tmp/nginx.log

    tags的用法:作用为挑选某一段的task来执行

    将安装memcached的yml,在拷贝的动作后加一个标签,执行时指定标签运行
    然后执行:ansible-plsybook -t ceshi install_memcached.yml
            只会触发拷贝文件和handlers的动作
    ---
    #test yaml file
    - hosts: all
      remote_user: root
      tasks:
        - name: creat user
          user: name=memcached shell=/sbin/nologin uid=2345
        - name: install package
          yum: name=memcached
        - name: copy config
          copy: src=/data/memcached dest=/etc/sysconfig/memcached
          notify: restart service   和handlers名称一致
          tags: ceshi   对拷贝动作加一个标签
        - name: service
          service: name=memcached state=started enabled=yes
      handlers:
        - name: restart service  和notify名称一致
          service: name=memcached state=restarted

    playbook中变量的使用,可以多处定义,但存在优先级: -e  var > yaml中的var  > hosts中的普通变量  >  hosts公共变量

    变量名:仅能由字母、数字和下划线组成,且只能以字母开头
    变量来源:
    1 ansible setup facts 远程主机的所有变量都可直接调用
        setup是一个模块,收集所有主机的各种信息,如果要用变量,需要先在里面找出对应的
            代码块,然后用代码块当变量
        比如:ansible all -m setup | grep "version" 过滤和版本有关的
              ansible all -m setup | grep "name" 过滤和主机名有关的
    2 在/etc/ansible/hosts中定义
     普通变量:主机组中主机单独定义,优先级高于公共变量
     公共(组)变量:针对主机组中所有主机定义统一变量
    3 通过命令行指定变量,优先级最高
        可以对单个变量赋值:ansible-playbook –e varname=value 
        也可以对多个变量赋值:ansible-playbook –e "var1=1 var2=2"
    4 在playbook中定义
        vars:
             - var1: value1
             - var2: value2
    5 在独立的变量YAML文件中定义,即roles下的var目录下的var.yml文件
                很适合在roles中进行单独定义
    6 在role中定义(下文中有介绍)

    从setup模块中查找有用的变量,然后可以通过判断变量的值,然后执行不同操作

        ansible_fqdn 主机名的变量
        ansible_hostname 主机名
        ansible_distribution_major_version: "6" 版本名变量
        ansible_processor_vcpus 虚拟cpu个数变量
        ansible_memtotal_mb 内存的变量
    示例:   
    ansible all -m setup -a "filter=ansible_memtotal_mb" 
        用此命令来查看系统内变量的值

    调用不同变量来源的示例:得出变量的优先级顺序

    示例:调用setup中的ansible_hostname主机名变量,来生成对应文件 var.yml
    - hosts: all
      remote_user: root
      tasks:
        - name: touch file
          file: name=/data/{{ ansible_hostname }}.log state=touch 
    
    示例2:将变量定义在/etc/ansible/hosts中(濮普通变量和公共变量),然后调用变量
        /etc/ansible/hosts:中定义的变量:
            [websrvs]
            192.168.34.105 port1=80
            192.168.34.106 port1=90   -普通变量
            [websrvs:vars]   -公共组变量
            mark="-"
            [appsrvs]
            192.168.34.101 port1=100
            [appsrvs:vars]
            mark="="
        vars.yml中书写格式:
            - hosts: all
              remote_user: root
              tasks:
                - name: touch file
                  file: name=/data/app{{mark}}{{ port1 }}.log state=touch
    最后生成的文件为:
                app=100.log,app-80.logapp-90.log
    
    示例3:在示例1的基础上,再通过命令行中定义变量:
        在外部定义ansible_hostname="hahaha",对比示例1的执行结果:
        ansible-playbook -e ansible_hostname="hahaha" vars.yml
        可以看出,最后新建的文件名为hahaha.log
    
    示例4:在playbook中定义变量
        - hosts: all
          remote_user: root
          vars:
            - port1: 200
            - mark: +++
          tasks:
            - name: touch file
              file: name=/data/app{{mark}}{{ port1 }}.log state=touch
        生成的文件:
            app+++200.log
    
    示例5:先写在var.yml中定义变量,
        1.先准备cat vars.yml:文件内容格式
            var1: httpd
            var2: nginx
        2.在cat var.yml,中调用准备好的vars.yml文件这种方式适用于在roles中单独定义
            - hosts: web
              remote_user: root
              vars_files:
                - vars.yml
             tasks:
               - name: create httpd log
                 file: name=/app/{{ var1 }}.log state=touch
               - name: create nginx log
                 file: name=/app/{{ var2 }}.log state=touch

    模板tmplates:

    文本文件,嵌套脚本(使用模板编程语言编写)
    jinja2语言,使用字面量,有多种形式:
    字符串:使用单引号或双引号
    数字:整数,浮点数
    列表:[item1, item2, ...]
    元组:(item1, item2, ...)
    字典:{k1:v1, k2:v2,...}
    布尔型:true/false
    算术运算:+ - * / // % **
    比较操作:==  !=  >  >=  <  <=
    逻辑运算:and  or  not
    流表达式:for  if   when

    templates功能:根据模块文件动态生产对应的配置文件

    templates文件必须存放于template目录下,且命名为.j2结尾,而*.yaml是和templates同一层目录

     yaml/yml 文件需和templates目录平级,目录结构如下:
     ./
     ├── temnginx.yml
     └── templates
        └── nginx.conf.j2
    通过templates模板配置文件安装nginx
    1.先生成nginx.conf.j2模板
    cp /etc/nginx/nginx.conf templates/nginx.conf.j2
    2.创建playbook
    - hosts: all
      remote_user: root
      tasks:
        - name: inastll nginx
          yum: name=nginx
        - name: template
          template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf                                 
          notify: service
        - name: start service
          service: name=nginx state=started
      handlers:
        - name: service
          service: name=nginx state=restarted

    when配合templates实现不同版本执行不同功能

    条件测试:
        如果需要根据变量、facts或此前任务的执行结果来做为某task执行与
        否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法
        格式
    when语句
        在task后添加when子句即可使用条件测试;when语句支持Jinja2表达式语法
    示例:
    tasks:
         - name: "shutdown RedHat flavored systems"
         command: /sbin/shutdown -h now
         when: ansible_os_family == "RedHat" 非赋值,而是比较是否为某个值
    步骤:涉及到多个notify对应一个handlers,定义端口变量
    1.hosts文件配置:修改了4台主机httpd的端口
        [centos6]
        192.168.34.105 http_port=86
        192.168.34.106 http_port=87
        192.168.34.101 http_port=88
        [centos7]
        192.168.34.107 http_port=89 
    2.将centos6&centos7的httpd配置文件复制到templates/并改名为*.j2文件
        httpd_6.conf.j2  
        httpd_7.conf.j2
    3.将端口都自定义:修改httpd_6.conf.j2和httpd_7.conf.j2的
        Listen {{http_port}} 调用hosts列表中的端口变量
    4.plsybook如下:
    ---
    - hosts: all
      remote_user: root
      tasks:
        - name: install httpd
          yum: name=httpd
        - name: templates 6
          template: src=httpd_6.conf.j2 dest=/etc/httpd/conf/httpd.conf
          notify: restart service
          when: ansible_distribution_major_version == "6"
        - name: templates 7
          template: src=httpd_7.conf.j2 dest=/etc/httpd/conf/httpd.conf                          
          when: ansible_distribution_major_version == "7"
          notify: restart service
        - name: service
          service: name=httpd state=started
      handlers:
        - name: restart service
          service: name=httpd state=restarted

    迭代:with_items,类似于shell中的for循环

    迭代:当有需要重复性执行的任务时,可以使用迭代机制
    对迭代项的引用,固定变量名为”item“
    要在task中使用with_items给定要迭代的元素列表
    列表格式:
        字符串
        字典   字典构成一个键值对{key:vavul}
    示例:比如创建user1.user2.user3个用户
        - hosts: all
          remote_user: root
          tasks:
            - name: touch users
              user: name={{item}}
              with_items:
                - haha1
                - haha2
                - haha3
    示例2:拷贝3个文件,file1 file2 file3
        - hosts: all 
        remote_user: root
        tasks:
          - name: copy files
            copy: src=/data/playbook/{{item}} dest=/data/
            with_items:
              - file1
              - file2
              - file3

    迭代嵌套自变量:涉及到多个键值对的表达式

    示例:创建3个组,再创建3个用户,指定加入一一对应的组
        - hosts: all
          remote_user: root
          tasks:
            - name: creat groups
              group: name={{item}}
              with_items:
                - group1
                - group2
                - group3
            - name: creat users
              user: name={{item.name}} group={{item.group}}
              with_items:
                - { name: 'haha1', group: 'group1' }
                - { name: 'haha2', group: 'group2' }
                - { name: 'haha3', group: 'group3' }
    备注:注意创建用户时,键值对的表达和使用方法
        上面的执行结果是:先用单个迭代创建多个组,再通过多个键值对创建用户和组的一一对应关系:即:haha1属于group1;haha2属于group2;haha3属于group3;

    playbook中template结合for循环生成具有复制性的代码段

    语法:
    for的写法:
        {% for vhost in nginx_vhosts %}
        server {
        listen {{ vhost.listen | default('80 default_server') }}
    if的写法和表达的意思:如果键值对中的vhost.server_name被定义了,则使用
                        如果没定义,则不执行接下来的代码:示例2
        {% if vhost.server_name is defined %}
                server_name {{ vhost.server_name }};
        {% endif %}
        {% if vhost.root is defined %}
                root {{ vhost.root }};
        {% endif %}

    for和if示例:

    示例:生成listen加不同端口的和fqdn文件,由多个键值对组成
    先创建for.j2文件:
                {% for i in ports %}
                server{
                        listen {{i.listen}}
                        name {{i.name}}
                        root {{i.root}}
                }
                {% endfor %}
            创建playbook:再其中调用for.j2文件
                - hosts: all
                  remote_user: root
                  vars:
                    ports:
                      - web1:
                        listen: 81
                        name: www.baidu.com
                        root: /data/web1
                      - web2:
                        listen: 82
                        name: www.baidu1.com
                        root: /data/web2
                  tasks:
                    - name: test for
                      template: src=for.j2 dest=/data/for1.conf
        效果为:
            server{
                listen 81
                name www.baidu.com
                root /data/web1
            }
            server{
                listen 82
                name www.baidu1.com
                root /data/web2
            }
    
    示例2:template配合if的涵义:
        在示例1中的playbook中,把name注释掉,即不定义name的值
                - web1:
                        listen: 81
                       # name: www.baidu.com
                        root: /data/web1
        然后playbook:再调用for.j2文件
            {% for i in ports %}
            server{
                    listen {{i.listen}}
            {% if i.name is defined%} 表示:如果i.name的值定义了,就用,没定义不用
                    name {{i.name}}
            {% endif %}
                    root {{i.root}}
            }
            {% endfor %}
        结果:则web1没有name的值,即可以理解if的用法
            server{
                listen 81
                root /data/web1  少了web1的name的值
            }
            server{
                listen 82
                name www.baidu1.com
                root /data/web2
            }

    roles:

     ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles
        能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需
        要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、
        文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一
        种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程
        等场景中
    复杂场景:建议使用roles,代码复用度高
    变更指定主机或主机组
    如命名不规范维护和传承成本大
    某些功能需多个Playbook,通过Includes即可实现

    roles的意义和适用场景

    角色(roles):角色集合
        适用场景:如系统内有多台数据库服务器,httpd服务器,nginx服务器,可以事先把
        同一类的服务器所需的软件,数据库等写成各自的角色roles,然后就可以批量部署了,
        当需要临时增加扩容一台服务器时,就可以使用事先编排好的role来对一台或多台服务器进行部署,从而提高了安装部署的效率。
            如系统内会存在如下的各类服务,可以先编排好角色
            roles/
            ├── httpd/
            ├── memcached/
            ├── mysql/
            └── nginx/

    roles的目录结构

    Roles各目录作用:
    /roles/project/ :项目名称,有以下子目录
        如创建http,memcached,nginx等目录
    files/ :存放由copy或script模块等调用的文件
        保存需要拷贝的配置文件
    templates/:template模块查找所需要模板文件的目录
        保存通过template的jinja2模板调用的配置文件
    tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;
            其它的文件需要在此文件中通过include进行包含
    handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此
               文件中通过include进行包含
    vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要
           在此文件中通过include进行包含,可以单独定义变量的目录
    meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为
    
    main.yml的文件,其它文件需在此文件中通过include进行包含
                tasks目录下,组合任务顺序的文件
    default/:设定默认变量时使用此目录中的main.yml文件

    roles playbook的tags的标签作用:通过标签可以灵活的调用playbook的角色

    - hosts: all
      remote_user: root
      roles:
        - {role: httpd,tags: ['httpd','web']}   
        - {role: memcached,tags: ['memcached','web']}
        - {role: nginx,tags: ['nginx','web1']}

    playbook调用角色

    方法一:把需要调用的角色写在一个playbook里
        - hosts: all
          remote_user: root
          roles:
            - role: httpd
            - role: memcached
            - role: nginx
        弊端:如果要执行次playbook,三个角色都会执行一遍,不灵活
    
    方法二;可以把变量在角色中定义
        传递变量给角色
        - hosts:
          remote_user:
          roles:
            - mysql
            - { role: nginx, username: nginx }
              键role用于指定角色名称
              后续的k/v用于传递变量给角色
              调用角色方法3:还可基于条件测试实现角色调用
    
    方法三:还可基于条件测试实现角色调用
        roles:
          - { role: nginx, username: nginx, when: ansible_distribution_major_version == ‘7’ }

    roles目录结构

        roles
        ├── httpd
        │   ├── files
        │   │   ├── index_6.html
        │   │   └── index_7.html
        │   ├── handlers
        │   │   └── main.yml
        │   ├── tasks
        │   │   ├── copyhtml_6.yml
        │   │   ├── copyhtml_7.yml
        │   │   ├── group.yml
        │   │   ├── main.yml
        │   │   ├── package.yml
        │   │   ├── service.yml
        │   │   ├── tempconfig_6.yml
        │   │   ├── tempconfig_7.yml
        │   │   └── user.yml
        │   ├── templates
        │   │   ├── httpd_6.conf.j2
        │   │   └── httpd_7.conf.j2
        │   └── vars
        ├── memcached
        │   ├── files
        │   ├── handlers
        │   │   └── main.yml
        │   ├── tasks
        │   │   ├── group.yml
        │   │   ├── main.yml
        │   │   ├── package.yml
        │   │   ├── service.yml
        │   │   ├── tempconfig.yml
        │   │   └── user.yml
        │   ├── templates
        │   │   └── memcached.j2
        │   └── vars
        └── nginx
            ├── files
            │   ├── index_6.html
            │   └── index_7.html
            ├── handlers
            │   └── main.yml
            ├── tasks
            │   ├── copyhtml_6.yml
            │   ├── copyhtml_7.yml
            │   ├── group.yml
            │   ├── main.yml
            │   ├── package.yml
            │   ├── service.yml
            │   ├── tempconfig.yml
            │   └── user.yml
            ├── templates
            │   └── nginx.conf.j2
            └── vars
               └── main.yml

    调用角色的playbook

        vim /data/roles.yml    
            - hosts: all  
              remote_user: root
              roles:
            - {role: httpd,tags: ['httpd','web'],when: ansible_distribution_major_version == "6“}
            - {role: memcached,tags: ['memcached','web']}
            - {role: nginx,tags: ['nginx','web1']}
    比如:
         1.ansible-playbook -C -t httpd roles.yml 选择测试安装httpd,检查语法
         2.ansible-playbook -t httpd roles.yml 只选择安装httpd
         3.ansible-playbook -t nginx roles.yml 只选择安装nginx
         4.ansible-playbook -t web roles.yml 安装httpd和memcached
         5.ansible-playbook -t web1 roles.yml 只选择安装nginx
  • 相关阅读:
    《数据结构与算法之美》03——数组
    设计模式系列三-代理模式
    Docker系列2-image详解
    docker系列2-centos7下安装docker
    docker系列1-简介
    idea设置JDK无效
    java引用传递还是值传递问题解析
    MySQL优化系列4-全文索引
    MySQL优化系列3-存储引擎
    Redis深入解析系列:分布式锁详解
  • 原文地址:https://www.cnblogs.com/caibao666/p/12173033.html
Copyright © 2020-2023  润新知