24.29/24.30 playbook管理配置文件linux
24.29/24.30 playbook管理配置文件(部署及更改文件)nginx
生產環境中大多時候是須要管理配置文件的,安裝軟件包只是在初始化環境的時候用一下。下面咱們來寫個管理nginx配置文件的playbookshell
咱們已經把nginx部署到機器上去了。後期咱們會常常的去修改配置文件,加載等等。那麼這時候就用到了管理配置文件。這個時候就會遇到一個問題,就是好比配置文件改錯了,我想回滾一下,就是把原來的配置文件回滾回去並作一個加載:vim
1.mkdir -p /etc/ansible/nginx_config/roles/{new,old}/{files,handlers,vars,tasks}rest
其中new爲更新時用到的,old爲回滾時用到的,files下面爲nginx.conf和vhosts目錄,handlers爲重啓nginx服務的命令對象
關於回滾,須要在執行playbook以前先備份一下舊的配置,因此對於老配置文件的管理必定要嚴格,千萬不能隨便去修改線上機器的配置,而且要保證new/files下面的配置和線上的配置一致rem
2.先把nginx.conf和vhosts目錄放到files目錄下面部署
cd /usr/local/nginx/conf/同步
cp -r nginx.conf vhost /etc/ansible/nginx_config/roles/new/files/ !!#此處的vhost目錄名字要跟第5步的核心任務裏的vhost目錄名保持一致。若是你的機器上是vhosts,在此處以及在第5步的vhosts名字要保持一致it
3.vim /etc/ansible/nginx_config/roles/new/vars/main.yml //定義變量
nginx_basedir: /usr/local/nginx
4.vim /etc/ansible/nginx_config/roles/new/handlers/main.yml //定義從新加載nginx服務
- name: restart nginx
shell: /etc/init.d/nginx reload
5.vim /etc/ansible/nginx_config/roles/new/tasks/main.yml //這是核心的任務 #就是把對應的而配置文件拷貝過去,而後加載handlers
- 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/ } #!!注意目錄名不要寫錯,axin把vhost寫成vhosts就報錯了
notify: restart nginx
6.vim /etc/ansible/nginx_config/update.yml // 最後是定義總入口配置
---
- hosts: testhost
user: root
roles:
- new
7.執行: ansible-playbook /etc/ansible/nginx_config/update.yml
實例:
[root@axinlinux-01 ~]# mkdir -p /etc/ansible/nginx_config/roles/{new,old}/{files,handlers,vars,tasks}
[root@axinlinux-01 ~]# cd /etc/ansible/nginx_config #這個nginx_config做爲咱們的總目錄(總項目)
[root@axinlinux-01 nginx_config]# cd roles/
[root@axinlinux-01 roles]# ls
new old #new用來安裝,old用來回滾
[root@axinlinux-01 roles]# cd /usr/local/nginx/conf/
[root@axinlinux-01 conf]# cp -r nginx.conf vhost /etc/ansible/nginx_config/roles/new/files/ #拷貝目錄要加-r
[root@axinlinux-01 conf]# vim /etc/ansible/nginx_config/roles/new/vars/main.yml #定義變量
nginx_basedir: /usr/local/nginx #就一個變量,其實就是basedir
[root@axinlinux-01 conf]# vim /etc/ansible/nginx_config/roles/new/handlers/main.yml #定義從新加載
- name: restart nginx
shell: /etc/init.d/nginx reload
[root@axinlinux-01 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
#以上,src是一個循環,dest是前面定義的變量,item.dest是一個循環。也就是item被分紅兩部分,一個是item.src一個是item.dest。
with_items:
- { src: nginx.conf, dest: conf/nginx.conf } #循環對象裏面有兩個子對象,用逗號分隔。這個就是把nginx.conf拷貝到/usr/local/nginx/conf/nginx.conf
- { src: vhosts, dest: conf/ } #這個同理,vhost目錄拷貝到/usr/local/nginx/conf/目錄下
notify: restart nginx #調用handlers(restart nginx),handlers去剛纔定義的 /etc/ansible/nginx_config/roles/new/handlers/目錄下的main.yml去找
[root@axinlinux-01 conf]# vim /etc/ansible/nginx_config/update.yml #總入口,ansible-playbook時的指定文件
---
- hosts: axinlinux-02 #能夠爲testhost(機器組)
user: root
roles:
- new
[root@axinlinux-01 conf]# ansible-playbook /etc/ansible/nginx_config/update.yml #執行。報錯了
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: If you are using a module and expect the file to exist on the remote, see the remote_src option
failed: [axinlinux-02] (item={u'dest': u'conf/', u'src': u'vhosts'}) => {"changed": false, "item": {"dest": "conf/", "src": "vhosts"}, "msg": "Could not find or access 'vhosts'\nSearched in:\n\t/etc/ansible/nginx_config/roles/new/files/vhosts\n\t/etc/ansible/nginx_config/roles/new/vhosts\n\t/etc/ansible/nginx_config/roles/new/tasks/files/vhosts\n\t/etc/ansible/nginx_config/roles/new/tasks/vhosts\n\t/etc/ansible/nginx_config/files/vhosts\n\t/etc/ansible/nginx_config/vhosts on the Ansible Controller.\nIf you are using a module and expect the file to exist on the remote, see the remote_src option"}
to retry, use: --limit @/etc/ansible/nginx_config/update.retry
PLAY RECAP *****************************************************************************************************************************************
axinlinux-02 : ok=1 changed=0 unreachable=0 failed=1
解決:
[root@axinlinux-01 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: vhosts, dest: conf/ } #這裏的vhost目錄要跟一開始建立的目錄名保持一致,應該爲vhost
notify: restart nginx
[root@axinlinux-01 conf]# ansible-playbook /etc/ansible/nginx_config/update.yml #再次執行
[root@axinlinux-01 conf]# cd /etc/ansible/nginx_config/roles/new/files/ #咱們實驗一下
[root@axinlinux-01 files]# ls
nginx.conf vhost
[root@axinlinux-01 files]# vim nginx.conf #把nginx.conf目錄作一個變動
[root@axinlinux-01 files]# ansible-playbook /etc/ansible/nginx_config/update.yml #而後在執行一下
[root@axinlinux-02 ~]# cat /usr/local/nginx/conf/nginx.conf #而後去02機器查看一下
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24.29/24.30 playbook管理配置文件(回滾)
咱們在變動文件的時候,要把以前的配置作備份。就是把new下的文件拷貝到old下去。由於回滾是針對備份文件作回滾的:
1.rsync -av /etc/ansible/nginx_config/roles/new/ /etc/ansible/nginx_config/roles/old/
#首先咱們要把new下面的拷貝到old下面去,new是什麼樣的,old就要是什麼樣的
2.rsync -av /etc/ansible/nginx_config/roles/new/files /etc/ansible/nginx_config/roles/old/files #每次變動以前都要把new下的files拷貝到old下的files
回滾操做就是把舊的配置覆蓋,而後從新加載nginx服務, 每次改動nginx配置文件以前先備份到old裏,對應目錄爲/etc/ansible/nginx_config/roles/old/files
3.vim /etc/ansible/nginx_config/rollback.yml // 最後是定義總入口配置 #總入口文件名就爲rollback.yml了
---
- hosts: testhost
user: root
roles:
- old
回滾的backup.yml對應的roles爲old
實例:
[root@axinlinux-01 files]# rsync -av /etc/ansible/nginx_config/roles/new/ /etc/ansible/nginx_config/roles/old/ #首先將new和old作一個同步
[root@axinlinux-01 old]# rsync -av /etc/ansible/nginx_config/roles/new/files /etc/ansible/nginx_config/roles/old/files #而後作一個備份,就是將new下的files拷貝到old下的files裏面去
[root@axinlinux-01 old]# vim /etc/ansible/nginx_config/rollback.yml
---
- hosts: testhost
user: root
roles:
- old #此處爲old。跟update不一樣
[root@axinlinux-01 old]# vim /etc/ansible/nginx_config/roles/new/files/nginx.conf
## include vhost/*.conf; #咱們作個修改,將這一行加個註釋
[root@axinlinux-01 old]# ansible-playbook /etc/ansible/nginx_config/update.yml #而後執行
[root@axinlinux-02 ~]# cat /usr/local/nginx/conf/nginx.conf 到02上查看就有了
[root@axinlinux-01 old]# ansible-playbook /etc/ansible/nginx_config/rollback.yml #而後咱們作回滾,直接執行rollback.yml就行了,他針對的就是咱們剛纔備份的文件
[root@axinlinux-02 ~]# cat /usr/local/nginx/conf/nginx.conf #再去02上查看就恢復到以前變動的狀態了