playbook管理配置文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了playbook管理配置文件相关的知识,希望对你有一定的参考价值。

上一篇,使用playbook安装nginx

http://blog.51cto.com/zero01/2067444

笔记内容:playbook管理配置文件
笔记日期:2018-01-31

  • 24.29/24.30 playbook管理配置文件

playbook管理配置文件

上一篇文章中我们成功的通过playbook安装了nginx,而生产环境中大多时候是需要管理配置文件的,例如修改配置文件然后进行重启服务,修改配置文件时可能会出现误修改的情况,所以我们还需要准备一个回滚的操作。至于安装软件包只是在初始化环境的时候用一下。下面我们来写个管理nginx配置文件的playbook。

1.创建相应的目录:

[[email protected] ~]# mkdir -p /etc/ansible/nginx_config/roles/{new,old}/{files,handlers,vars,tasks}
[[email protected] ~]# cd /etc/ansible/nginx_config/
[[email protected] /etc/ansible/nginx_config]# ls
roles
[[email protected] /etc/ansible/nginx_config]# ls roles/
new  old
[[email protected] /etc/ansible/nginx_config]# ls roles/new/
files  handlers  tasks  vars
[[email protected] /etc/ansible/nginx_config]# ls roles/old/
files  handlers  tasks  vars
[[email protected] /etc/ansible/nginx_config]# 

其中new为更新时用到的,old为回滚时用到的,files下面为nginx.conf和vhosts目录,handlers为重启nginx服务的命令。

关于回滚,需要在执行playbook之前先备份一下旧的配置,所以对于老配置文件的管理一定要严格,千万不能随便去修改线上机器的配置,并且要保证new/files下面的配置和线上的配置一致。

2.把nginx.conf和vhost目录放到files目录下面,我这里是之前创建了vhost目录的,如果你没有创建过这个目录的话,就只需要拷贝nginx.conf即可:

[[email protected] /etc/ansible/nginx_config]# cd /usr/local/nginx/conf/
[[email protected] /usr/local/nginx/conf]# cp -r nginx.conf vhost  /etc/ansible/nginx_config/roles/new/files/
[[email protected] /usr/local/nginx/conf]# 

3.编辑用于定义变量的文件:

[[email protected] ~]# vim /etc/ansible/nginx_config/roles/new/vars/main.yml
nginx_basedir: /usr/local/nginx

4.编辑用于定义重新加载nginx服务的文件:

[[email protected] ~]# vim /etc/ansible/nginx_config/roles/new/handlers/main.yml
- name: restart nginx
  shell: /etc/init.d/nginx reload

5.编辑用于执行核心任务的文件:

[[email protected] ~]# vim /etc/ansible/nginx_config/roles/new/tasks/main.yml
- name: copy conf file
  copy: src={{ item.src }} dest={{ nginx_basedir }}/{{ item.dest }} backup=yes owner=root group=root mode=0644
  with_items:
    - { src: nginx.conf, dest: conf/nginx.conf }
    - { src: vhost, dest: conf/ }
  notify: restart nginx

6.最后是定义总入口配置文件:

[[email protected] ~]# vim /etc/ansible/nginx_config/update.yml
---
- hosts: testhost
  user: root
  roles:
  - new

7.执行总入口配置文件:

[[email protected] ~]# ansible-playbook /etc/ansible/nginx_config/update.yml

PLAY [testhost] *************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************
ok: [192.168.77.128]

TASK [new : copy conf file] *************************************************************************************************
ok: [192.168.77.128] => (item={u‘dest‘: u‘conf/nginx.conf‘, u‘src‘: u‘nginx.conf‘})
ok: [192.168.77.128] => (item={u‘dest‘: u‘conf/‘, u‘src‘: u‘vhost‘})

PLAY RECAP ******************************************************************************************************************
192.168.77.128             : ok=2    changed=0    unreachable=0    failed=0   

[[email protected] ~]# 

8.然后更改一下配置文件的内容:

[[email protected] ~]# vim /etc/ansible/nginx_config/roles/new/files/nginx.conf 
# 增加一行注释内容

9.再次执行以下命令:

[[email protected] ~]# ansible-playbook /etc/ansible/nginx_config/update.yml

PLAY [testhost] *************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************
ok: [192.168.77.128]

TASK [new : copy conf file] *************************************************************************************************
changed: [192.168.77.128] => (item={u‘dest‘: u‘conf/nginx.conf‘, u‘src‘: u‘nginx.conf‘})
ok: [192.168.77.128] => (item={u‘dest‘: u‘conf/‘, u‘src‘: u‘vhost‘})

RUNNING HANDLER [new : restart nginx] ***************************************************************************************
changed: [192.168.77.128]

PLAY RECAP ******************************************************************************************************************
192.168.77.128             : ok=3    changed=2    unreachable=0    failed=0   

[[email protected] ~]# 

10.然后到客户端上查看一下nginx.conf文件,是否有我们加上的那一行内容:

[[email protected] ~]# tail -n2 /usr/local/nginx/conf/nginx.conf
    # 增加一行注释内容
}
[[email protected] ~]#

以上的操作是针对于更新、修改配置文件的,下面来介绍一下回滚操作:

1.回滚对应的roles为old,所以首先把new目录下的所有文件同步到old目录下,这一步相当于是备份一份在old目录下,之后回滚就是从old目录下进行拷贝文件:

[[email protected] ~]# rsync -av  /etc/ansible/nginx_config/roles/new/ /etc/ansible/nginx_config/roles/old/
sending incremental file list
files/
files/nginx.conf
files/vhost/
files/vhost/aaa.com.conf
files/vhost/default.conf
files/vhost/ld.conf
files/vhost/proxy.conf
files/vhost/ssl.conf
files/vhost/test.com.conf
handlers/
handlers/main.yml
tasks/
tasks/main.yml
vars/
vars/main.yml

sent 5171 bytes  received 222 bytes  10786.00 bytes/sec
total size is 4391  speedup is 0.81
[[email protected] ~]# 

回滚操作就是把旧的配置覆盖,然后重新加载nginx服务, 每次改动nginx配置文件之前先备份到old里,对应目录为/etc/ansible/nginx_config/roles/old/files。如果你修改nginx配置文件之前没有备份old里,那么你就无法进行回滚操作了。

编辑总入口配置文件:

[[email protected] ~]# vim /etc/ansible/nginx_config/rollback.yml
---
- hosts: testhost
  user: root
  roles:
  - old 

ok,完成以上操作后,我们来演示一个简单的回滚操作:

1.例如我现在要修改nginx配置文件,我在要这个文件的末尾增加一行注释,但是注意了,在增加这行注释之前需要先将配置文件同步到old目录下:

[[email protected] ~]# rsync -av  /etc/ansible/nginx_config/roles/new/files/nginx.conf /etc/ansible/nginx_config/roles/old/files/nginx.conf 
sending incremental file list
nginx.conf

sent 1465 bytes  received 31 bytes  2992.00 bytes/sec
total size is 1387  speedup is 0.93
[[email protected] ~]# 

2.然后才增加这行注释:

[[email protected] ~]# echo "# 这是一行注释内容" >> /etc/ansible/nginx_config/roles/new/files/nginx.conf
[[email protected] ~]# 

3.执行update.yml文件向客户端更新文件:

[[email protected] ~]# ansible-playbook /etc/ansible/nginx_config/update.yml

PLAY [testhost] *************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************
ok: [192.168.77.128]

TASK [new : copy conf file] *************************************************************************************************
changed: [192.168.77.128] => (item={u‘dest‘: u‘conf/nginx.conf‘, u‘src‘: u‘nginx.conf‘})
ok: [192.168.77.128] => (item={u‘dest‘: u‘conf/‘, u‘src‘: u‘vhost‘})

RUNNING HANDLER [new : restart nginx] ***************************************************************************************
changed: [192.168.77.128]

PLAY RECAP ******************************************************************************************************************
192.168.77.128             : ok=3    changed=2    unreachable=0    failed=0   

[[email protected] ~]# 

4.然后到客户端上查看是否有我们增加的那一行注释:

[[email protected] ~]# tail -n1 /usr/local/nginx/conf/nginx.conf
# 这是一行注释内容
[[email protected] ~]#

5.确认之后,执行rollback.yml文件进行回滚操作:

[[email protected] ~]# ansible-playbook /etc/ansible/nginx_config/rollback.yml 

PLAY [testhost] *************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************
ok: [192.168.77.128]

TASK [old : copy conf file] *************************************************************************************************
changed: [192.168.77.128] => (item={u‘dest‘: u‘conf/nginx.conf‘, u‘src‘: u‘nginx.conf‘})
ok: [192.168.77.128] => (item={u‘dest‘: u‘conf/‘, u‘src‘: u‘vhost‘})

RUNNING HANDLER [old : restart nginx] ***************************************************************************************
changed: [192.168.77.128]

PLAY RECAP ******************************************************************************************************************
192.168.77.128             : ok=3    changed=2    unreachable=0    failed=0   

[[email protected] ~]# 

6.然后到客户端上查看是否已恢复:

[[email protected] ~]# tail -n1 /usr/local/nginx/conf/nginx.conf
}
[[email protected] ~]# 

如上,可以看到,之前增加的那一行注释没有了。

所以,所谓的回滚就是在进行改动前,先备份一份,然后如果出现误修改了,就将之前备份的文件覆盖上去,这样就起到了一个回滚的效果。

以上是关于playbook管理配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Ansible-playbook管理复杂任务

ansible-管理nginx配置文件

Ansible-playbook

ansible使用二(ansible playbook)

playbook 基本使用

Jenkins + Gitlab + Ansible--playbook 代码上线流程(文末有免费视频)