续我的上篇博文: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