nginx、ansible和tomcat

Ansible之流程控制—4

2019-10-13  本文已影响0人  静如止水yw

判断语句
循环语句
触发器 handlers
tag标签
文件复用
忽略错误
异常处理


一、判断语句


#案例一 根据不同的系统,安装不同的服务
[root@manager project1]# cat f15.yml 
- hosts: webservers
  tasks:
    - name: CentOS Installed Httpd Server
      yum:
        name: httpd
        state: present
      when: ( ansible_distribution == "CentOS" )
    - name: Ubuntu Installed Httpd Server
      yum:
        name: httpd2
        state: present
      when: ( ansible_distribution == "Ubuntu" )
# 案例二、所有为问问主机的名称的添加nginx仓库,其余的都跳过添加
[root@manager project1]# cat f16.yml 
- hosts: all
  tasks:
  - name: Add Nginx Yum Repository
    yum_repository:
      name: nginx
      description: Nginx Repository
      baseurl: http://nginx.org/packages/centos/7/$basearch/
    when: ( ansible_hostname is match ("web*"))
# 根据命令的执行结果进行判断
① 通过register将命令执行结果保存至变量,然后通过when语句进行判断
[root@manager project1]# cat f17.yml 
- hosts: webservers
  tasks:
    - name: Check Httpd Server
      command: systemctl is-active httpd
      register: Check_Httpd
      ignore_errors: yes
    #判断Check_Httpd.rc是否等于0,如果为0则执行任务,否则不执行
    - name: Restart Httpd Server
      systemd:
        name: httpd
        state: restarted
      when: ( Check_Httpd.rc == 0 )

二、Playbook循环语句


循环语句的优点就是减少了重复性的工作。

# 一次启动多个服务
[root@manager~/project1]# cat f18.yml 
- hosts: webservers
  tasks:
    - name: Systemd Nginx Status
      systemd:
        name: "{{ item }}"  #调用的变量也不变,也是固定。
        state: started
      # 固定的语法格式
      with_items:
        - nginx
        - php-fpm
# 一次拷贝多个文件
[root@manager~/project1]# cat f19.yml 
- hosts: webservers
  tasks:   
    - name: Configure nginx.conf
      copy: 
        src: './file/{{ item.src }}'
        dest: './file{{ item.dest }}'
        mode: '{{ item.mode }}'
      with_items:
        - { src: nginx.conf.j2, dest: /etc/nginx/nginx.conf, mode: '0644' }
        - { src: /kod.oldxu.com.conf.j2, dest: /etc/nginx/conf.d/kod.oldxu.com.conf, mode: '0600' }     
# 一次创建多个用户(比如创建三个用户)
[root@manager~/project1]# cat f20.yml 
- hosts: webservers
  tasks:
    - name: Create User
      user: 
        name: '{{ item.name }}'
        groups: '{{ item.groups}}'
        uid: "{{ item.uid }}"
        create_home: no
        shell: /sbin/nologin
      with_items:
        - {name: tt1, groups: bin, uid: 6666}
        - {name: tt2, groups: root, uid: 8888}
        - {name: tt3, groups: adm, uid: 9999}

总结

1.标准循环               
    item
    with_items:
       - test
2.字典循环:                
    itme.name
    with_items:
        - { name: test }
3.变量循环
[root@manager project1]# cat f21.yml 
- hosts: webservers
  tasks:
    - name: ensure a list of packages installed
      yum: name={{ packages }} state=present
      vars:
        packages:
          - httpd
          - httpd-tools

三、触发器handlers


Handlers是一个触发器,也是一个tasks,只不过是一个特殊的tasks,他是需要被tasks触发才会运行。
如果配置文件发生变更,则会触发重启,否则,不会触发重启。

[root@manager project1]# cat f22.yml 
- hosts: webservers
  tasks:
    - name: Installed Nginx and PHP Packages
      yum:
        name: nginx
        state: present
    - name: Configure nginx.conf 
      template:
        src: ./file/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      #监控-->changed状态-->通知-->handlers--->name-->Restart Nginx Server
      notify: Restart Nginx Server
      #notify:
      #  - Restart Nginx Server
      #  - Restart php Server
    - name: Systemd Nginx Server
      systemd:
        name: nginx
        state: started
        enabled: yes
#当nginx或php配置文件发生变更才会触发此操作
  handlers:
    - name: Restart Nginx Server
      systemd:
        name: nginx
        state: restarted

Handlers注意事项
>1.无论多少个task通知了相同的handlers,handlers仅会在所有tasks结束后运行一次。
2.只有task发生改变了才会通知handlers,没有改变则不会触发handlers.
3.不能使用handlers替代tasks、因为handlers是一个特殊的tasks。

**案例一、安装redis
要求:bind本地IP地址({{ansible_eth1.ipv4.address}}) facts都要使用

[root@manager~/project1]# cat file/redis.conf.j2
bind 127.0.0.1 {{ansible_eth1.ipv4.address}}i
[root@manager~/project1]# cat redis.yml 
- hosts: redisservers
  tasks:
    - name: Installed Redis Server
      yum:
        name: redis
        state: present
    - name: Configure Redis Server
      template: 
        src: ./file/redis.conf.j2
        dest: /etc/redis.conf
        backup: yes 
      notify: Restart Redis Server
    - name: Sytemd Redis Server
      systemd:
        name: redis
        state: started 
        enabledi: yes
    - name: Check Redis Status
      shell: netstAT -lntp | grep redis
      register: Check_Redis
    - name: Debug Check_Redis Vsariables
      debug:
        msg: "Redis Status:{{ Check_Redis_Status }}"
  handlers:
    - name: Restart Redis Server
      systemd:
        name: redis
        state: restarted 
        enabled: yes

案例二 安装rsync
要求
使用循环 rsync.conf的权限为0644 rsync.passwd的权限为0600

[root@manager~/project1]# cat file/rsyncd.conf.j2 
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
comment = welcome to oldboyedu backup!
path = /backup
[data]
path = /data

[root@manager~/project1]# cat file/rsync.passwd.j2 
rsync_backup:123456

[root@manager~/project1]# cat rsync.yml 
- hosts: backupservers
  tasks:
        #1.安装Rsync
    - name: Installed Rsyncd Server
      yum:
        name: rsync
        state: present
        disablerepo: webtatic-php
        #2.配置rsync
    - name: Configure Rsyncd Server
      template:
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
        mode: "{{ item.mode }}"
      with_items:
        - { src: './file/rsyncd.conf.j2', dest: '/etc/rsyncd.conf', mode: '0644' }
        - { src: './file/rsync.passwd.j2', dest: '/etc/rsync.passwd', mode: '0600' }
      notify: Restart Rsyncd Server
        #3.根据rsync配置初始化 进程用户|虚拟连接用户文件|备份模块仓库
    - name: Create Process User
      user:
        name: rsync
        create_home: no
        shell: /sbin/nologin
    - name: Create Rsyncd Repo Directory
      file:
        path: "{{ item }}"
        state: directory
        owner: rsync
        group: rsync
        mode: 0755
      with_items:
        - /backup
        - /data
        #4.启动rsync
    - name: Systemd Rsyncd Server
      systemd:
        name: rsyncd
        state: started
        enabled: yes
  handlers:
    - name: Restart Rsyncd Server
      systemd:
        name: rsyncd
        state: restarted

四、tag标签


默认情况下,Ansible在执行一个playbook是,会执行playbook中定义的所有任务。Ansible的标签功能都可以给单独任务甚至整个playbook打上标签,然后利用这些标签来制定运行playbook中的个别任务,或不执行指定的任务。

打标签的方式
一个task可以打一个标签,多个任务也可以打一个标签或一个任务打多个标签
如何使用标签
-t 执行指定的tag标签任务
--skip-tags 执行--skip-tags之外的标签任务

[root@manager tasks]# cat task_nfs.yml 
- hosts: webservers
  tasks:
        #对一个任务打多个标签
    - name: Install Nfs Server
      yum: 
        name: nfs-utils
        state: present
      tags:
        - install_nfs
        - install_nfs-server
        #对一个任务打一个标签
    - name: Service Nfs Server
      service:
        name: nfs-server 
        state: started
        enabled: yes
      tags: start_nfs-server
ansible-playbook -i ../hosts  task_nfs.yml  -t start_nfs-server123
ansible-playbook -i ../hosts  task_nfs.yml  --skip-tags install_nfs-server

四、文件复用(Include包含)


[root@manager~/project1]# cat restart_nginx.yml 
- name: Restart Nginx Server
  systemd:
    name: nginx
    state: restarted

[root@manager~/project1]# cat a_project.yml 
- hosts: webservers
  tasks:
    - name: A Project command
      command: echo "A"
    - name: Restart nginx
      include: ./restart_nginx.yml

[root@manager~/project1]# cat b_project.yml 
- hosts: webservers
  tasks:
    - name: B Project command
      command: echo "B"
    - name: Restart nginx
      include: restart_nginx.yml

五、忽略错误


默认Playbook会检测tasks执行的返回状态,如果玉带错误则会立即终止playbook的后续的task执行。然而当执行出现错误,加入ignore_errors:yes之后,则会忽略错误,且后续的任务仍将执行。

[root@manager~/project1/task]# cat task_ignore.yml 
- hosts: webservers
  tasks:
        #明确知道该TASK可能会报错,及时报错也希望不影响后续的TASK任务时
    - name: Ignore False
      command: /bin/false
      ignore_errors: yes
    - name: touch new file
      file: path=/tmp/bgx_ignore state=touch

六、异常处理


1.每次状态都是changed,纵使没有修改过被控端
[root@manager~/project1]# cat redis.yml 
- hosts: redisservers
  tasks:
    - name: Installed Redis Server
      yum:
        name: redis
        state: present
    - name: Configure Redis Server
      template: 
        src: ./file/redis.conf.j2
        dest: /etc/redis.conf
        backup: yes   
      notify: Restart Redis Server
    - name: Sytemd Redis Server
      systemd:
        name: redis
        state: started 
        enabledi: yes
 #Check_Redis_Status=$(netstat -lntp | grep redis) 
    - name: Check Redis Status
      shell: netstAT -lntp | grep redis
      register: Check_Redis
      changed_when: false
#echo ${Check_Redis_Status}
    - name: Debug Check_Redis Vsariables
      debug:
        msg: "Redis Status:{{ Check_Redis_Status.stdout_lines }}"
  #接收通知--->触发重启Redis操作
  handlers:
    - name: Restart Redis Server
      systemd:
        name: redis
        state: restarted 
        enabled: yes

2.nginx推送配置文件

第一种方式
[root@manager tasks]# cat task_nginx.yml 
- hosts: webservers
  tasks:
        #安装nginx
    - name: Installed nginx Server
      yum: 
        name: nginx
        state: present
        #配置nginx
    - name: Configure nginx Server
      template:
        src: ./file/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        #检查nginx (Check_Nginx_Status=$(nginx -t))
    - name: Check Nginx Configure File
      shell: nginx -t
      register: Check_Nginx_Status
      changed_when: 
        - Check_Nginx_Status.stdout.find('successful')
        - false   
        #启动Nginx
    - name: Systemd Nginx Server
      systemd:
        name: nginx
        state: started
        enabled: yes   
 第二种方式
[root@manager tasks]# cat task_nginx.yml 
- hosts: webservers
  tasks:
        #安装nginx
    - name: Installed nginx Server
      yum: 
        name: nginx
        state: present
        #配置nginx
    - name: Configure nginx Server
      template:
        src: ./file/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        #检查nginx (Check_Nginx_Status=$(nginx -t))
    - name: Check Nginx Configure File
      shell: nginx -t
        #启动Nginx
    - name: Systemd Nginx Server
      systemd:
        name: nginx
        state: started
        enabled: yes      

强制调用handlers

[root@manager tasks]# cat task_nginx.yml 
- hosts: webservers
  force_handlers: yes   #无论tasks失败与否,只要通过过handlers,那me一定会执行
  tasks:
        #安装nginx
    - name: Installed nginx Server
      yum: 
        name: nginx
        state: present
        #配置nginx
    - name: Configure nginx Server
      template:
        src: ./file/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: Restart Nginx Server
        #检查nginx (Check_Nginx_Status=$(nginx -t))
    - name: Check Nginx Configure File
      shell: nginx -t
        #启动Nginx
    - name: Systemd Nginx Server
      systemd:
        name: nginx
        state: started
        enabled: yes 
  handlers:
    - name: Restart Nginx Server
      systemd: 
        name: nginx
        state: restarted
上一篇 下一篇

猜你喜欢

热点阅读