Roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles 。
角色(roles)是ansible自1.2版本开始引入的新特性,用于层次性,结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单的说,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中。
角色是ansible自带的工具,在我之前的博客学习了playbook的用法,将所有的操作写入playbook里面,但是如果hosts较多,写在一起容易混淆并且读起来也不方便。所以我们引入了roles,roles将每个部分分割开来,生成不同的目录,每个目录有每个目录的作用。
讲解每个目录的作用,其实不难发现,每个目录就是我们之前写playbook中所用到的,将每个部分分离出来。
defaults目录 | 为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件 |
---|---|
files目录 | 存放由copy或script等模块调用的文件,为静态文件一般文件里面没有需要变量就存放在此目录下面 |
tasks目录 | 至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;此文件可以使用include包含其他的位于此目录中的task文件 |
handlers目录 | 此目录中应当包含一个main.yml文件 |
templates目录 | 存储由template模快调用的模板文件 |
meta目录 | 定义当前角色的特殊设定及其依赖关系,会有main.yml文件 |
tests目录 | 这个目录为测试,但是我们一般不适用它 可删掉 |
vars目录 | 定义variables,有main.yml文件,存放roles中涉及到的变量 |
ansible-galaxy 是一个可以免费共享和下载ansible角色的网站,可以帮助我们好的定义和学习roles。
使用角色,就必须使用ansible-galaxy init xxx 生成相对应的角色目录,生成角色后,进入目录,可以看到系统已经自动生成了相对应的目录,在目录下面有main.yml文件,方便我们书写。通过tree . 可以查看到哪些目录下面有main.yml文件。
通过官方网站来辅助学习
也可以借助中文权威指南来学习ansible
创建一个apache角色。
续上一个博客中在devops用户下面创建的ansible目录,编写好自己的配置文件ansible.cfg,以及管理节点的配置文件hosts。
在此处的学习我们可以借助ansiible的官方网站以及ansible的中文权威指南两个网站来学习。
步骤一:在ansible目录下面,建立roles目录
修改配置文件,使系统能够读取roles目录
步骤二:进入到roles目录下面,利用ansible-galaxy工具生成anpache角色
(ansible-galaxy --help查看帮助)
列出所有已经安装的galaxy:ansible-galaxy list,这个命令的使用必须在~absible目录下使用才生效
步骤三:生成相应的角色
ansible-galaxy init apache
cd apache
切换到ansinble目录下面,再次使用ansible-glaxy list 可以看到产生了apache角色
步骤四:通过树形展示apache目录下面
没有tree命令,下载:yum install -y tree
tree . :可以看到相对应的目录下面有main.yml文件
步骤五:书写任务
vim tasks/main.yml
任务内容,安装apache---->配置apache---->打开服务
可以通过ansible all -a “systemctl stop firewalld 使所有组都执行某某条命令”
步骤六:添加静态文件,在任务里面我们使用copy模块拷贝文件,那么需要在files目录下面放入我们src对应的文件。
步骤七:任务书写中还有template模块,将模板文件放到templates目录下面
修改文件
templates目录下面放的是模板文件。必修加j2
步骤八:notify引发触发器,编写handlers/main.yml文件,没有出发的话,意味着任务中的操作不作数。模板文件中涉及到变量,将变量写进vars/main…yml
步骤九:apache角色的配置就基本结束,最后在ansible目录下面编辑yml文件,指出运行的主机和角色。
步骤十:测试。
通过curl 安装apache主机的ip
得到index.html的内容
当然我们也可以更改端口,但是需要注意的是,更改端口时有优先级。即便我们ansible目录下面的yml文件里面定义了变量端口,但是我们角色下面的vars变量里面没有改变端口,他的端口依然不会改变。
表示地址的方式:
运行:
出错的原因是因为我们没有切片
在我们安装apache服务的主机上查看配置文件
同样的,在ansible目录下面,
ansible-galaxy search nginx查找nginx角色
点击官网查看
下载已有的角色
ansible-galaxy install nginxinc.nginx
ansible db -m setup | grep ansible_hostname
ansible db -m setup | grep ip
vim info.j2写入我们想要获取的与主机有关的信息
当然可以通过ansible db -m setup | less查询如何写相对应的变量
最后获取到每个主机上的相关信息
查看官方文档,学习when判断
我们之前在书写yml文件之后,推的时候,如果出错,就会停止,那么我们选择跳过错误,直接运行下面的内容
当然也可以是在远程主机时也可以使用,哪个主机满足条件,哪个主机就进行相应的操作,当不满足时直接跳过。