linux 学习笔记-099-自动化运维-playbook 管理配置文件

发布于 2018-05-31  131 次阅读


playbook 管理配置文件

生产环境中大多时候是需要管理配置文件的,安装软件包只是在初始化环境的时候用一下。下面我们来写个管理 nginx 配置文件的 playbook

创建 nginx 的配置文件保存目录

[root@am-01:/etc/ansible#] mkdir -p /etc/ansible/nginx_config/roles/{new,old}/{files,handlers,vars,tasks}

[root@am-01:/etc/ansible#] cd /etc/ansible/nginx_config/roles/

[root@am-01:/etc/ansible/nginx_config/roles#] ls

new  old

#new 为更新配置文件时用到,old 为回滚配置文件时用到,files 下面为 nginx.conf 和 vhosts 目录,handlers 为重启 nginx 服务的命令

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

拷贝配置文件到对应目录

[root@am-01:/etc/ansible/nginx_config/roles#] cd /usr/local/nginx/conf/

[root@am-01:/usr/local/nginx/conf#] mkdir vhost

[root@am-01:/usr/local/nginx/conf#] cp -r nginx.conf vhost /etc/ansible/nginx_config/roles/new/files/

#为了做实验,手工创建一下 vhost,其实也可以只使用 nginx.conf,按实际情况

定义变量的主配置文件

[root@am-01:/usr/local/nginx/conf#] vim /etc/ansible/nginx_config/roles/new/vars/main.yml

nginx_basedir: /usr/local/nginx

#这个变量指定了 nginx 的安装目录

定义一个用来重新加载 nginx 服务的主配置文件

[root@am-01:/usr/local/nginx/conf#] vim /etc/ansible/nginx_config/roles/new/handlers/main.yml

- name: restart nginx

  shell: /etc/init.d/nginx reload

#使用 shell 模块来执行重载 nginx 服务的操作

定义核心的主配置文件

[root@am-01:/usr/local/nginx/conf#] 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

#使用 copy 模块来把需要更新的配置文件拷贝到对应主机,这里循环了两遍,每一遍的 src 和 dest 都是不同的,使用"backup=yes"来创建备份文件,同时设置所有者、所属组和权限

#最后再调用 handlers 里面的重载 nginx 服务的配置文件

定义入口配置文件

[root@am-01:/usr/local/nginx/conf#] vim /etc/ansible/nginx_config/update.yml

---

- hosts: am-02

  user: root

  roles:

  - new

#这里针对 am-02 做实验,调用 new 目录下的配置文件

执行入口配置文件

[root@am-01:/usr/local/nginx/conf#] ansible-playbook /etc/ansible/nginx_config/update.yml



PLAY [am-02] *********************************************************************************************************************



TASK [Gathering Facts] ***********************************************************************************************************

ok: [am-02]



TASK [new : copy conf file] ******************************************************************************************************

ok: [am-02] => (item={u'dest': u'conf/nginx.conf', u'src': u'nginx.conf'})

ok: [am-02] => (item={u'dest': u'conf/', u'src': u'vhost'})



PLAY RECAP ***********************************************************************************************************************

am-02                      : ok=2    changed=0    unreachable=0    failed=0  

#运行一下入口配置文件,能看到是没报错的

接下来模拟实际环境对配置文件进行变更

[root@am-01:/usr/local/nginx/conf#] cd /etc/ansible/nginx_config/roles/new/files/

[root@am-01:/etc/ansible/nginx_config/roles/new/files#] vim nginx.conf

http

{

    include vhost/*.conf;

}

#把 server 模块相关的配置删除,在 http 模块中添加一句
[root@am-01:/etc/ansible/nginx_config/roles/new/files#] ansible-playbook /etc/ansible/nginx_config/update.yml



PLAY [am-02] *********************************************************************************************************************



TASK [Gathering Facts] ***********************************************************************************************************

ok: [am-02]



TASK [new : copy conf file] ******************************************************************************************************

changed: [am-02] => (item={u'dest': u'conf/nginx.conf', u'src': u'nginx.conf'})

ok: [am-02] => (item={u'dest': u'conf/', u'src': u'vhost'})



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

changed: [am-02]



PLAY RECAP ***********************************************************************************************************************

am-02                      : ok=3    changed=2    unreachable=0    failed=0

#再次运行一下入口配置文件

到 am-02 上检查

[root@am-02:~#] ps -aux | grep nginx

root       1200  0.0  0.1  20500  1176 ?        Ss   01:49   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/localnginx/conf/nginx.conf

nobody     5296  0.0  0.3  22944  3288 ?        S    17:52   0:00 nginx: worker process

nobody     5297  0.0  0.3  22944  3288 ?        S    17:52   0:00 nginx: worker process

[root@am-02:~#] date

2018 年 05 月 31 日 星期四 17:52:58 CST

[root@am-02:~#] cat /usr/local/nginx/conf/nginx.conf

include vhost/*.conf;

#查看进程,nginx 服务的确重载过,同时配置文件也被修改了

配置回滚

在日常工作中难免会遇到操作错误的情况,这时候回滚到操作之前的状态就很重要了,回滚操作就是把旧的配置覆盖,然后重新加载 nginx 服务, 每次改动 nginx 配置文件之前先把之前的 new 下面的配置文件备份到 old 里,对应目录为/etc/ansible/nginx_config/roles/old/files

先把 new 下的所有文件拷贝到 old 下

[root@am-01:/etc/ansible/nginx_config/roles/new/files#] cd /etc/ansible/nginx_config/roles/

[root@am-01:/etc/ansible/nginx_config/roles#] rsync -av new/ /etc/ansible/nginx_config/roles/old/

sending incremental file list

files/

files/nginx.conf

files/vhost/

handlers/

handlers/main.yml

tasks/

tasks/main.yml

vars/

vars/main.yml



sent 2113 bytes  received 108 bytes  4442.00 bytes/sec

total size is 1699  speedup is 0.76

#第一次操作,需要把 new 目录下所有文件都复制到 old 目录下,以后如果没对 yml 配置文件做修改的话,只需要复制 new/files/目录下的文件到 old/files/目录下即可

编写回滚的入口配置文件

[root@am-01:/etc/ansible/nginx_config/roles#] cd ..

[root@am-01:/etc/ansible/nginx_config#] cp update.yml rollback.yml

[root@am-01:/etc/ansible/nginx_config#] vim rollback.yml

---

- hosts: am-02

  user: root

  roles:

  - old

做实验,修改 new 下的 nginx 配置文件并分发

[root@am-01:/etc/ansible/nginx_config#] vim roles/new/files/nginx.conf

#    include vhost/*.conf;

[root@am-01:/etc/ansible/nginx_config#] ansible-playbook update.yml



PLAY [am-02] *********************************************************************************************************************



TASK [Gathering Facts] ***********************************************************************************************************

ok: [am-02]



TASK [new : copy conf file] ******************************************************************************************************

changed: [am-02] => (item={u'dest': u'conf/nginx.conf', u'src': u'nginx.conf'})

ok: [am-02] => (item={u'dest': u'conf/', u'src': u'vhost'})



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

changed: [am-02]



PLAY RECAP ***********************************************************************************************************************

am-02                      : ok=3    changed=2    unreachable=0    failed=0 

检查一下 am-02 有没有被修改

[root@am-02:~#] cat /usr/local/nginx/conf/nginx.conf

#    include vhost/*.conf;

回滚到没修改前的状态

[root@am-01:/etc/ansible/nginx_config#] ansible-playbook rollback.yml



PLAY [am-02] *********************************************************************************************************************



TASK [Gathering Facts] ***********************************************************************************************************

ok: [am-02]



TASK [old : copy conf file] ******************************************************************************************************

changed: [am-02] => (item={u'dest': u'conf/nginx.conf', u'src': u'nginx.conf'})

ok: [am-02] => (item={u'dest': u'conf/', u'src': u'vhost'})



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

changed: [am-02]



PLAY RECAP ***********************************************************************************************************************

am-02                      : ok=3    changed=2    unreachable=0    failed=0  

检查一下 am-02 有没有被回滚

[root@am-02:~#] cat /usr/local/nginx/conf/nginx.conf

    include vhost/*.conf;

#至此,针对配置文件的分发和回滚都是实验成功的

#切记就是,每次需要分发新的配置文件的时候,都要先把原来的配置文件备份到备份目录,以备可以回滚