一般部署分布式集群的时候都会用到hosts文件,我们一般会把ip地址和主机名写进去,那么编写Ansible的时候渲染如何实现? 首先定义这个roles角色

[root@ansible kubeadm-high-install]# ls
ansible.cfg  group_vars  hosts  roles  site-all.yml

第一个文件将默认的etc/ansible的cfg文件拿过来,将key去掉,不然会报ssh的问题,group_vars/all.yml放变量的,写这个hosts也用不到,最重要的就是后面三个hosts、roles、site-all.yml,用来编写整个playbook

[root@ansible kubeadm-high-install]# cat hosts
[master]
192.168.30.51 node_name=k8s-master1
192.168.30.52 node_name=k8s-master2
192.168.30.53 node_name=k8s-master3

[node]
192.168.30.54 node_name=node1

[k8s:children]
master  
node

roles就是这个角色,init就是系统初始化的这个角色,tasks具体的任务细节都通过main.yml来实现编写,这里使用的template模块,如果下面templates的J2就会直接引用上

[root@ansible kubeadm-high-install]# cat roles/init/tasks/main.yaml 

---
#这个playbook需要初始化每个节点

- name: 添加hosts
  template: src=host.j2 dest=/etc/hosts
而这个j2文件里面说的是通过k8s这个组,也就是我们在hosts定义的k8s:children这个组下来的,hostvars来获取k8s组下面的ip ,后面定义我们hosts里面的主机名node_name是什么hostname定义的直接也就获取到了
 inventory_hostname 获取被操作的当前主机主机名
 以及自定义的node_name,这样就渲染过来了
[root@ansible kubeadm-high-install]# cat roles/init/templates/host.j2 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
{% for host in groups['k8s'] %}
{{ hostvars[host].inventory_hostname }} {{ hostvars[host].node_name }}
{% endfor %} 

测试执行

[root@ansible kubeadm-high-install]# ansible-playbook -i hosts site-all.yml 

PLAY [1、主机初始化] **********************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************
ok: [192.168.30.53]
ok: [192.168.30.52]
ok: [192.168.30.54]
ok: [192.168.30.51]

TASK [init : 添加hosts] ***************************************************************************************************************
changed: [192.168.30.52]
changed: [192.168.30.51]
changed: [192.168.30.54]
changed: [192.168.30.53]

PLAY RECAP **************************************************************************************************************************
192.168.30.51              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.30.52              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.30.53              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.30.54              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

查看是否成功渲染

[root@ansible kubeadm-high-install]# ansible all -a "cat /etc/hosts"
192.168.30.51 | CHANGED | rc=0 >>
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.30.51 k8s-master1
192.168.30.52 k8s-master2
192.168.30.53 k8s-master3
192.168.30.54 node1
 
192.168.30.54 | CHANGED | rc=0 >>
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.30.51 k8s-master1
192.168.30.52 k8s-master2
192.168.30.53 k8s-master3
192.168.30.54 node1
 
192.168.30.52 | CHANGED | rc=0 >>
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.30.51 k8s-master1
192.168.30.52 k8s-master2
192.168.30.53 k8s-master3
192.168.30.54 node1
 
192.168.30.53 | CHANGED | rc=0 >>
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.30.51 k8s-master1
192.168.30.52 k8s-master2
192.168.30.53 k8s-master3
192.168.30.54 node1

使用when模块的最大的好处就是可以在一套ansible当中配置安装不同的所需要的配置或者服务,比如一套ansible里面或许安装了一套k8s集群,但是这个服务高可用的版本,不需要安装比如pod的某些服务,比如微服务组件,但是其他的版本需要安装微服务,那么就可以在全局里面定义一个变量比如mode: 1,或者其他的都可以,这个可以写到hosts或者group_vars/all.yml也都行,如果在hosts里面可以定义[all:vars] 下面自定义自己的变量,定义好之后,比如不在某个roles下面去做某些动作

- name: create file
  file:
    dest: /tmp
    state: directory
  when: mode == 0

这样的话,这个就会跳过这个操作,原因是我们的变量如果是在等于1的情况下才会去执行相关的动作

或者这种方式是在tasks下面去定义的,也可以在j2去定义 比如,if等于0的情况下才去执行j2里面的一些配置

 {% if mode == 0 %}
     upstream gateway {
       ip_hash;
       server  gateway:8080;
     }
     upstream initializr{
       ip_hash;
       server  initializr:8080;
     }
 {% endif %}