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

猜你喜欢

转载自www.cnblogs.com/caibao666/p/12173033.html