一、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¢os7的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