三.通过zk、kafka集群了解ansible-playbook --配置文件解读
[root@localhost stage]# ansible-playbook stage-jdk-zookeeper-kafka.yml

1.先查找/etc/ansible/hosts文件寻找[jdk-zookeeper-kafka]组所包含的主机列表及其他定义信息
2.roles:此play包含了4个role剧本任务,按从上往下顺序执行
以其中的role: user先分解
role: user 从这看到定义了5个变量值(username: apprun, ssh_pubkey: xiaoming.pub, is_sudo: "yes", state: present, tags: user)作用于roles/user/目录下的yml文件,值得注意的变量定义位置不仅限于此。。。还包括(roles/***/vars/main.yml、各角色下*.yml文件自身中、部分变量还可以定义在/etc/ansible/hosts的主机组中...等,我要了解变量的总和等于这些地方的全部,以及出现重复定义时任务取变量优先顺序)
3.获取远程主机列表,第一个角色是(role: user),会去调用执行/etc/ansible/roles/user/tasks/main.yml文件,按顺序执行,分别为【增加用户】、【发送公钥文件】、【用户提权】、【去提权】

{{ *** }}变量;
state={{ state }} 通过state的取值来决定是类似 【安装、删除】的操作,这里说的类似是因为这个字段在不同模块中的定义喊法不同,【ansible-doc -s 模块名】自行查询说明

authorized_key: user={{ username }} key="{{ item }}" 这里的user和key是authorized_key模块的俩个字段,可同行写也可分行写,同行写注意下面的with_file循环条件是跟最后一个字段key
with_file 是将每个文件的文件内容作为item的值;循环有多种可以查资料了解一下,循环是很通用的手法
when: state == "present" :条件判断,当state == "present"时,执行此步task任务
ansible-playbook stage-jdk-zookeeper-kafka.yml 中我们给变量state赋值为present了,及时就算/etc/ansible/roles/user/vars/main.yml中如果设置为其他值的话,也会被ansible-playbook stage-jdk-zookeeper-kafka.yml 中的覆盖,所以这一段用通俗语言解释就是:将"{{package_path}}/user/{{ ssh_pubkey }}"文件中的内容赋值给authorized_keys文件发送远程机器,并将修改其authorized_keys文件的远程主机上的用户名,效果如图


role: user这里用到了循环讲一下,【还运用了template模块】,其他模块不明白,自行【ansible-doc -s 模块名】查询
role: user按顺序执行完就来到role: jdk
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
role: jdk
- { role: jdk, install_path: /apprun, jdk_file: jdk1.8.0_73, state: present, tags: jdk } ;变量安装路径、安装包名、状态、标志
先执行/etc/ansible/roles/jdk/tasks/main.yml,分解task任务步骤
- name: Deploy jdk #部署远程jdk,通synchronize模块分发jdk版本包到远程主机
- name: ln -s {{ install_path }}/{{ jdk_file }} {{ install_path }}/jdk #建立软链接,方便管理
- name: Directory property change #更改部署目录的属组属主权限,所有插件的安装尽量用普通用户,安全
- name: rm jdk symbolic link #删除软链接,通过条件(when: state == "absent")时,来确定为卸载操作
- name: rm jdk #删除jdk,通过条件(when: state == "absent")时,来确定为卸载操作
jdk也很简单只用到synchronize模块和file模块
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
role: zookeeper
- { role: zookeeper, install_path: /apprun, dataDir: /apprun/data/zookeeper, dataLogDir: /apprun/data/zookeeper_log, version: 3.4.8, XMN: 213, XMS: 452, XMX: 452, clusters: [{host: kafka01, id: 1, ip: 192.168.109.138, port: 2181}, {host: kafka02, id: 2, ip: 192.168.109.139, port: 2181},{host: kafka03, id: 3, ip: 192.168.109.140, port: 2181}], state: present, tags: zookeeper }
这里变量比较多,也很好理解,这里注意一下用到了字典变量clusters:
clusters: [{host: kafka01, id: 1, ip: 192.168.109.138, port: 2181}, {host: kafka02, id: 2, ip: 192.168.109.139, port: 2181},{host: kafka03, id: 3, ip: 192.168.109.140, port: 2181}],
带着这些变量去解读首先执行的/etc/ansible/roles/zookeeper/tasks/main.yml文件
首先我们看一下task有哪些任务【下图红框中TAGS: [zookeeper]就是role: zookeeper的任务列表】:
ansible-playbook stage-jdk-zookeeper-kafka.yml --list-task

多数模块通过【ansible-doc -s 模块名】就能很好解读,这里我挑一下部分task或部分模块的字段属性讲一下

创建zk的数据目录和日志目录,这里file模块用到了 标准循环 with_items: 所以这里的file模块语句会循环执行完下面的俩个变量"{{ dataDir }}" 和 "{{ dataLogDir }}"
*************************************************************************************************************************************************************

发送配置文件zoo.cfg到远程部署主机,这里用template模块,配置了zoo.cfg模板文件,模块还用到一个字典循环with_items: "{{ clusters }}" ;
clusters: [{host: kafka01, id: 1, ip: 192.168.109.138, port: 2181}, {host: kafka02, id: 2, ip: 192.168.109.139, port: 2181},{host: kafka03, id: 3, ip: 192.168.109.140, port: 2181}],
带着这个变量来解读zoo.cfg模板文件[/etc/ansible/roles/zookeeper/templates/zoo.cfg]

这里面又用了2个循环,目的是取不同的值,来配置zk集群的zoo.cfg文件,防止不同机器端口占用取不同值
{% for item in clusters %}
{% if item.ip == ansible_ssh_host %}
clientPort={{ item.port }}
{% endif %}
{% endfor %}
循环字典clusters的项,加了个if条件,循环体结束后只会取满足if条件的值,如item.ip == ansible_ssh_host 则【clientPort={{ item.port }}】赋值对应的项的端口值给zoo.cfg配置文件,
这里clusters的项有三个:
{host: kafka01, id: 1, ip: 192.168.109.138, port: 2181},
{host: kafka02, id: 2, ip: 192.168.109.139, port: 2181},
{host: kafka03, id: 3, ip: 192.168.109.140, port: 2181},
至于ansible_ssh_host的值就是对应的远程主机的值,这个量我们在/etc/ansible/hosts中定义了;这里用了循环主要是防止不同端口

{% for item in clusters %}
server.{{item.id}}={{item.host}}:2888:3888
{% endfor %}
循环遍历,每遍历一次取一组值
结果如下图所示:

这里还用了notify: restart zookeeper通知触发器任务,因为when: state != "absent" 是安装操作,notify: restart zookeeper会在role: zookeeper所有任务结束后触发handlers执行/etc/ansible/roles/zookeeper/handlers/main.yml中的任务【这里是service模块重启zk操作】
*************************************************************************************************************************************************************
这里很多task任务用到了字典循环,不一一讲了,大同小异,我们稍微看一下zk集群的myid文件模板

首先myid文件是放在数据目录下,zk启动会去数据目录下查找;myid文件每个节点的值是不同的~

这就是上面那个不同值的情况运用
*************************************************************************************************************************************************************
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
role: kafka
- { role: kafka, install_path: /apprun, version: 2.11-0.10.1.1, log_path: /apprun/data/kafka_log, XMN: 213, XMS: 452, XMX: 452, clusters: [{id: 5, ip: 192.168.109.138, port: 9092}, {id: 6, ip: 192.168.109.139, port: 9092},{id: 7, ip: 192.168.109.140, port: 9092}], zk_clusters: "192.168.109.138:2181,192.168.109.139:2181,192.168.109.140:2181", state: present,tags: kafka }
任务列表:

带着这些变量去解读首先执行的/etc/ansible/roles/kafka/tasks/main.yml文件
上面的zk配置看懂,这里基本也差不多,没啥负赘的了,注意的是roles/***/templates/目录下是一些配置文件的模板文件,里面带变量,一般软件版本更新没有特殊说明配置文件是通用的,模板可以沿用,如果官方说明此版本废除了哪些配置项,新增了哪些配置项时,这时需注意下依据实际情况略微更改这里的模板文件
浙公网安备 33010602011771号