Linux下Ansible Playbooks中模板及变量的使用(四)

续我的上篇博文:https://mp.csdn.net/postedit/88874695。即httpd.yml文件已经编写好自动化部署zabbix已经配置好(但是需要在此基础上再添加一个主机server3)本篇博文只是修改上篇博文编写的httpd.yml文件

一、temaplate的使用方法

25-Ansible-Playbook-template模板_qq_41417660的博客-CSDN博客

  

二、实验环境

1.selinux和firewalld状态为disabled

2.各主机信息如下:

主机ip
server1(ansible的服务端,rhel7版本)172.25.83.1
server2(ansible的服务端,rhel7版本)172.25.83.2
server3(ansible的客户端,rhel6版本)172.25.83.3

三、编写,并运行带有模板及变量的“安装httpd服务,拷贝httpd服务的配置文件httpd.conf,开启httpd服务“的playbook

1、编写带有模板及变量的“安装httpd服务,拷贝httpd服务的配置文件httpd.conf,开启httpd服务“的playbook文件

[root@server1 httpd]# ls
httpd.conf  httpd.yml
[root@server1 httpd]# mv httpd.conf httpd.conf.j2
[root@server1 httpd]# vim httpd.conf.j2 
42 Listen {{ http_port }}
[root@server1 httpd]# vim httpd.yml 
---
# httpd部署
- hosts: all   #控制所有的主机(server1和server2)(变化的内容)
  vars:   #定义变量(变化的内容)
    http_port: 80   #添加http_port变量(变化的内容)
  remote_user: root
  tasks:
    - name: install httpd
      yum: name=httpd state=present

    - name: config httpd
      template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf   #将上篇博文的copy改为template;src=httpd.conf改为src=httpd.conf.j2(变化的内容)。
      notify: restart httpd

    - name: start httpd
      service: name=httpd state=started

  handlers:
    - name: restart httpd
      service: name=httpd state=restarted

2、运行带有模板及变量的“安装httpd服务,拷贝httpd服务的配置文件httpd.conf,开启httpd服务“的playbook文件

[root@server1 httpd]# ansible-playbook httpd.yml --syntax-check
[root@server1 httpd]# ansible-playbook httpd.yml

  • 查看server2的httpd服务的端口是否为80端口

  • 查看server1端的httpd服务是否已经安装,httpd服务是否已经开启


从运行的结果图,我们可以得知主机server1和主机server2是同时进行操作的,只要有一步过不去,就会导致整个过程失败。


3、从1中编辑的配置文件,我们可以得知所有的主机(包括server1和server2)定义的httpd服务的端口都是相同的,那么如果我们想让server1主机的httpd服务的端口设置为8080,而server2主机的httpd服务的端口设置为80,那又该如何做呢?

[root@server1 httpd]# vim /etc/ansible/hosts
 44 [web]
 45 server1 http_port=8080
 46 
 47 [db]
 48 server2 http_port=80
[root@server1 httpd]# vim httpd.yml   #删除之前的定义的http_port变量
---
# httpd部署
- hosts: all
  remote_user: root
  tasks:
    - name: install httpd
      yum: name=httpd state=present

    - name: config httpd
      template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify: restart httpd

    - name: start httpd
      service: name=httpd state=started

  handlers:
    - name: restart httpd
      service: name=httpd state=restarted



[root@server1 httpd]# ansible-playbook httpd.yml --syntax-check
[root@server1 httpd]# ansible-playbook httpd.yml

  • 查看server2的httpd服务的端口是否为80端口

  • 查看server1端的httpd服务的端口是否为8080端口

4、从3中运行的结果图,我们可以得知所有的主机(包括server1和server2)的httpd服务监听的主机都是0.0.0.0,那如果我们想各自的httpd服务只监听本机(server1监听172.25.83.1,server2监听172.25.83.2)。那又该如何做呢?

[root@server1 httpd]# vim httpd.conf.j2
 42 Listen {{ http_host }}:{{ http_port }}
[root@server1 httpd]# vim /etc/ansible/hosts 
 44 [web]
 45 server1 http_host=172.25.83.1
 46 
 47 [db]
 48 server2 http_host=172.25.83.2
 49 
 50 [webserver:children]   
 51 web
 52 db
 53 
 54 [webserver:vars]
 55 http_port=80

#解释:其中http_port端口的设置,可以有好多种写法,我这里列出三种
1.设置只有db组中的成员的http_port=80
[db:vars]   
http_port=80
2.设置所有组中的成员的http_port=80
[all:vars]   
http_port=80
3.如果主机有很多,又位与许多不同的组。那么可以使用下面的方法。先定义一个组,将要设置的组添加进去,然后再对这个组进行操作即可。
[webserver:children]   
web
db
[webserver:vars]
http_port=8



[root@server1 httpd]# ansible-playbook httpd.yml --syntax-check 
[root@server1 httpd]# ansible-playbook httpd.yml

  • 查看server2的httpd服务监听的端口是否为172.25.83.2:80

  • 查看server1的httpd服务监听的端口是否为172.25.83.1:80

5、4中的主机比较少,只有两台主机(server1和server2),如果主机个数变多。要使各自的httpd服务只监听本机,那么又该怎么做

[root@server1 httpd]# vim httpd.conf.j2
 42 Listen {{ http_host }}:{{ http_port }}
[root@server1 httpd]# vim /etc/ansible/hosts 
 44 [web]
 45 server1   #此处删除了之前定义的http_port
 46 
 47 [db]
 48 server2   #此处删除了之前定义的http_port
 49 
 50 [webserver:children]   
 51 web
 52 db
 53 
 54 [webserver:vars]
 55 http_port=8
 55 http_port=80
 56 
 57 [all:vars]   #相比4增加的内容
 58 http_host={{ ansible_all_ipv4_address[-1] }}   #相比4增加的内容

#解释:其中http_port端口的设置,可以有好多种写法,我这里列出三种
1.设置只有db组中的成员的http_port=80
[db:vars]   
http_port=80
2.设置所有组中的成员的http_port=80
[all:vars]   
http_port=80
3.如果主机有很多,又位与许多不同的组。那么可以使用下面的方法。先定义一个组,将要设置的组添加进去,然后再对这个组进行操作即可。
[webserver:children]   
web
db
[webserver:vars]
http_port=8



[root@server1 httpd]# ansible-playbook httpd.yml --syntax-check 
[root@server1 httpd]# ansible-playbook httpd.yml
  • 其中httpd.conf.j2文件中"ansible_all_ipv4_addresses"的来源(因为两个IP所在的位置不同,但都位于倒数第一个位置,所以这里取-1)


  • 查看server2的httpd服务监听的端口是否为172.25.83.2:80

  • 查看server1的httpd服务监听的端口是否为172.25.83.1:80

6、同5一样,只是写法不同而已

[root@server1 httpd]# vim httpd.conf.j2
 42 Listen {{ http_host }}:{{ http_port }}
[root@server1 httpd]# vim /etc/ansible/hosts 
 44 [web]
 45 server1
 46 
 47 [db]
 48 server2
 49 
 50 [webserver:children]   
 51 web
 52 db
 53 
 54 [webserver:vars]
 55 http_port=8
 55 http_port=80
 56 
 57 [all:vars]   #相比4增加的内容
 58 http_host={{ ansible_eth0['ipv4']['address'] }}   #不同于5的内容

#解释:其中http_port端口的设置,可以有好多种写法,我这里列出三种
1.设置只有db组中的成员的http_port=80
[db:vars]   
http_port=80
2.设置所有组中的成员的http_port=80
[all:vars]   
http_port=80
3.如果主机有很多,又位与许多不同的组。那么可以使用下面的方法。先定义一个组,将要设置的组添加进去,然后再对这个组进行操作即可。
[webserver:children]   
web
db
[webserver:vars]
http_port=8



[root@server1 httpd]# ansible-playbook httpd.yml --syntax-check 
[root@server1 httpd]# ansible-playbook httpd.yml
  • 其中httpd.conf.j2文件中"ansible_eth0['ipv4']['address']]"的来源

  • 查看server2的httpd服务监听的端口是否为172.25.83.2:80

  • 查看server1的httpd服务监听的端口是否为172.25.83.1:80

7、4中的http_port变量的值以及http_host变量的值都定义在/etc/ansible/hosts文件中,如果我们想将http_host变量的值定义在http.conf.j2模板文件,将http_port变量的值定义在http.yml文件中,那又该如何做呢?

[root@server1 httpd]# vim /etc/ansible/hosts   #将该文件的内容恢复成部署Ansible时的样子
 44 [web]
 45 server1
 46 
 47 [db]
 48 server2
[root@server1 httpd]# vim httpd.yml
---
# httpd部署
- hosts: all
  vars:   #x相比4增加的内容
    http_port: 80   #相比4增加的内容
  remote_user: root
  tasks:
    - name: install httpd
      yum: name=httpd state=present

    - name: config httpd
      template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify: restart httpd

    - name: start httpd
      service: name=httpd state=started

  handlers:
    - name: restart httpd
      service: name=httpd state=restarted
[root@server1 httpd]# vim httpd.conf.j2 
 42 Listen {{ ansible_all_ipv4_addresses[-1] }}:{{ http_port }}


[root@server1 httpd]# ansible-playbook httpd.yml --syntax-check
[root@server1 httpd]# ansible-playbook httpd.yml

  • 查看server2的httpd服务监听的端口:172.25.83.2:80

  • 查看server1的httpd服务监听的端口是否为172.25.83.1:80

8、同7一样,只是写法不同而已

[root@server1 httpd]# vim /etc/ansible/hosts   #将该文件的内容恢复成部署Ansible时的样子
 44 [web]
 45 server1
 46 
 47 [db]
 48 server2
[root@server1 httpd]# vim httpd.yml
---
# httpd部署
- hosts: all
  vars:   
    http_port: 80   
  remote_user: root
  tasks:
    - name: install httpd
      yum: name=httpd state=present

    - name: config httpd
      template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify: restart httpd

    - name: start httpd
      service: name=httpd state=started

  handlers:
    - name: restart httpd
      service: name=httpd state=restarted
[root@server1 httpd]# vim httpd.conf.j2 
 42 Listen {{ ansible_eth0['ipv4']['address'] }}:{{ http_port }}   #不同于7的地方


[root@server1 httpd]# ansible-playbook httpd.yml --syntax-check
[root@server1 httpd]# ansible-playbook httpd.yml

  • 查看server2的httpd服务监听的端口:172.25.83.2:80

  • 查看server1的httpd服务监听的端口是否为172.25.83.1:80

9、有时我们会遇到这样的问题,不同版本的主机(比如6版本和7版本),那httpd.conf文件的模板也是不一样的。那么又该如何进行操作呢?

<1>

[root@server1 httpd]# vim /etc/hosts   #编辑本地解析文集,确保有server3的解析
172.25.83.1    server1 
172.25.83.2    server2
172.25.83.3    server3
[root@server1 httpd]# ssh-copy-id server3   #将server1生成的密码发送给server3,以实现server1-server3的免密
[root@server1 httpd]# vim /etc/ansible/hosts   #编辑ansible的主机文件,将server3加入该主机文件中
 44 [web]
 45 server1
 46 server3
 47
 48 [db]
 49 server2
 50 
 51 [all:vars]
 52 http_host={{ ansible_eth0['ipv4']['address'] }}
[root@server1 httpd]# ansible all -m ping   #免密测试ansible

<2>

[root@server1 httpd]# vim httpd.yml
---
# httpd部署
- hosts: all
  vars:
    http_port: 80
  remote_user: root
  tasks:
    - name: install httpd
      yum: name=httpd state=present
      tags: install   #给一个标签,便于执行单独任务时进行区分

    - name: config httpd
      template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify: restart httpd
      tags: config   #给一个标签,便于执行单独任务时进行区分

    - name: start httpd
      service: name=httpd state=started
      tags: start   #给一个标签,便于执行单独任务时进行区分

  handlers:
    - name: restart httpd
      service: name=httpd state=restarted
[root@server1 httpd]# ansible-playbook httpd.yml -t install   #只执行标签为install的任务。因为config httpd还没有配置好,只想执行标签为install的任务以在server3上生成相应的配置文件httpd.conf

  • 查看server3端的httpd服务是否已经安装

###同上,补充内容,想说明的是:只要标签是always,不管执行哪个标签的任务,标签是always的任务都会执行
[root@server1 httpd]# vim httpd.yml 
---
# httpd部署
- hosts: all
  vars:
    http_port: 80
  remote_user: root
  tasks:
    - name: install httpd
      yum: name=httpd state=present
      tags: install

    - name: config httpd
      template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify: restart httpd
      tags: config

    - name: start httpd
      service: name=httpd state=started
      tags: always   #标签为always

  handlers:
    - name: restart httpd
      service: name=httpd state=restarted

  • 查看server3上的httpd服务是否已经安装成功,并启动成功

<3>

[root@server3 ~]# scp /etc/httpd/conf/httpd.conf server1:/etc/ansible/playbooks/httpd   #因为server1上没有6版本的httpd服务的配置文件httpd.conf,所以需要将server3上生成的httpd.conf文件发送到server1端

<4>

[root@server1 httpd]# ls
httpd.conf  httpd.conf.j2  httpd.retry  httpd.yml
[root@server1 httpd]# mv httpd.conf.j2 httpd.conf7.j2
[root@server1 httpd]# mv httpd.conf httpd.conf6.j2
[root@server1 httpd]# ls
httpd.conf6.j2  httpd.conf7.j2  httpd.retry  httpd.yml
[root@server1 httpd]# vim httpd.conf6.j2
 136 Listen {{ http_host }}:{{ http_port }}
[root@server1 httpd]# vim httpd.conf7.j2
 42 Listen {{ http_host }}:{{ http_port }}
[root@server1 httpd]# vim httpd.yml
---
# httpd部署
- hosts: all
  vars:
    http_port: 80
  remote_user: root
  tasks:
    - name: install httpd
      yum: name=httpd state=present
      tags: install

    - name: config httpd
      template: src=httpd.conf{{ ansible_distribution_major_version }}.j2 dest=/etc/httpd/conf/httpd.conf   #指定系统的版本对应的变量
      notify: restart httpd
      tags: config

    - name: start httpd
      service: name=httpd state=started
      tags: start

  handlers:
    - name: restart httpd
      service: name=httpd state=restarted


[root@server1 httpd]# ansible-playbook httpd.yml --syntax-check
[root@server1 httpd]# ansible-playbook httpd.yml -C   #测试一下,该命令该改变哪些内容,而并不会取真正的执行httpd.yml文件中所写的内容
[root@server1 httpd]# ansible-playbook httpd.yml
  • 其中参数"ansible_distribution_major_version"的来源

  • 查看server1端httpd的监听端口是否为172.25.83.1:80

  • 查看server2端httpd的监听端口是否为172.25.83.2:80

  • 查看server3端httpd的监听端口是否为172.25.83.3:80

###补充内容,httpd.yml文件也可以写成下面的形式,即利用判断语句
[root@server1 httpd]# vim httpd.yml 
---
# httpd部署
- hosts: all
  vars:
    http_port: 80
  remote_user: root
  tasks:
    - name: install httpd
      yum: name=httpd state=present
      tags: install

    - name: config httpd
      template: src=httpd.conf6.j2 dest=/etc/httpd/conf/httpd.conf
      notify: restart httpd
      when: ansible_distribution_major_version == "6"   #写成条件判断的形式。when条件判断放在哪里都可以,只要在该- name模块中就可以。
      tags: config

    - name: config httpd
      template: src=httpd.conf7.j2 dest=/etc/httpd/conf/httpd.conf   #写成条件判断的形式。when条件判断放在哪里都可以,只要在该- name模块中就可以。
      notify: restart httpd
      when: ansible_distribution_major_version == "7"  
      tags: config


    - name: start httpd
      service: name=httpd state=started
      tags: start

  handlers:
    - name: restart httpd
      service: name=httpd state=restarted

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值