-
Ansible中的基础语言元素:
-
变量
Inventory
条件测试
迭代
playbook的组成结构
-
Inventory
Modules
Ad Hoc Command
Playbooks:
Task:任务,即调用模块完成某操作
Variables:变量
Templates:模板
Handlers:处理器,由某事件触发执行的操作。
Roles:角色
基本结构:在哪台主机以什么身份运行什么任务。
- hosts: webservers
remote_user:
tasks:
- task1
- task2
- hosts: dbservers
举个栗子:
编写*.yml文件,用ansible-playbook执行此文件
可以看到我们在第一遍执行任务时,显示的状态为changed,表示这些东西我们已经按需创建了
再执行一遍任务发现结果为OK,表示这些我们所需创建的东西都存在。
安装httpd服务,修改监听端口,开启服务
现在我们向修改监听端口为80,我们先试着将/root/conf/httpd.conf文件的端口改为80,然后再次运行.yml文件
可以看到copy模块的状态为changed,证明客户端文件确实已发生改变,但service模块的状态为OK,证明这个模块还是保持之前的状态(因为playbook具有幂等性),也就是说配置文件改了,但是并没有重启服务
所以要想修改完配置文件后再重启服务就需要用到handler
这次我们将监听端口改为808
变量:
1)自定义变量:
2)引用ansible自带变量
查看facts信息
例如引用ansible_all_ipv4_addresses作为变量
再inventory中定义的变量也可以直接引用
再hosts文件中定义变量
3)引用定义的变量
如果我们没有这时ssh无密码连接,可以在inventory中定义用户和密码
而使用ssh 正常连接时还是要输密码
条件测试
when:
当ansible_nodename为server3时创建用户ansuser
可以看到server2和server4都被skipping了
迭代
重复同类task时使用
调用:item
定义循环列表:with_items
- apache
- php
- mysql-server
注意with_items的值也可以是字典,但引用时要使用item.KEY
- {name: apache conf: conffiles/httpd.conf}
- {name: php, conf: conffiles/php.ini}
- {name: mysql-server, conf: conffiles/my.cnf}
模板
server2和server3的MaxClients分别为100和200
server2和server3监听的端口分别为80和8080
server2和server3的Servername为ansible_nodename的值
编辑模板文件/root/conf/http.conf.j2
在hosts文件里定义http_port及MaxClients的值
修改apache.yml,使用template
tags标签
在playbook中为某个或某些任务定义一个标签。在执行playbook时,通过ansible-playbook命令使用–tags选项能实现仅运行指定的tag所而非所有;
在hosts修改MaxClients的值为170和180
我们希望值运行[install configuration file for httpd]这个任务
可以看到只有指定部分被运行了。
特殊情况:无论调用什么标签都会运行的tags
定义
可以看到虽然值指定了tags=–conf但是install httpd package任务也被运行了
role
(1)创建以roles命名的目录;
(2)在roles目录中分别创建以各角色名称命名的目录,如webservers
(3)在每个角色命名的目录再分别创建files,handlers,meta,tasks,templates和vars目录,用不到的目录可以创建为空目录,也可以不创建
目录结构有固定格式:
files:静态文件
templates:jinjia2模板文件
tasks:至少有一个main.yml文件,定义tasks
handlers:至少由一个main.yml文件,定义handlers
vars:至少有一个main.yml文件定义变量
meta:定义依赖关系等信息
(4)在playbook文件中调用各角色。site.yml文件中定义playbook,额外也可以有其他的yml文件
例子:1、创建以roles命名的目录
2、在roles下分别创建以角色名命名的目录
3、
给172.25.44.2安装httpd,给172.25.44.3安装mysqld,给172.25.44.4安装httpd和mysqld
在webservers目录里做一些关于web的操作
在file目录里面放入配置文件
task目录:
handlers目录:
接下来在deservers目录里面定义一些mysql的操作
files目录:
tasks目录:
files目录:
tasks目录:
handlers:
最后在playbook中调用role
执行yml文件就好了