• ansible 流程控制


    ansible 流程控制

    使用when判断主机名

    - hosts: rsync_server
      tasks:
    
        - name: Install rsyncd Server
          yum:
            name: rsync
            state: present
    
        - name: Config rsyncd Conf
          copy:
            src: ./rsyncd.j2
            dest: /etc/rsyncd.conf
            owner: root
            group: root
            mode: 0644
          when: ansible_fqdn == 'backup'
    
        - name: Create dir
          file:
            path: /backup
            state: directory
            owner: www
            group: www
            mode: 0755
            recurse: yes
          when: ansible_fqdn == 'backup'
    
    
        - name: Create passwd file
          copy:
            content: "rsync_backup:123"
            dest: /etc/rsync.passwd
            owner: root
            group: root
            mode: 0600
          when: ansible_fqdn == 'backup'
    
    #单条件判断
        - name: Start rsyncd
          systemd:
            name: rsyncd
            state: started
            enabled: yes
          when: ansible_fqdn == 'backup'
    
    #多条件判断,使用小括号分组
        - name: copy shell
          template:
            src: ./backup.sh
            dest: /root
          when: (ansible_fqdn == 'web01') or (ansible_fqdn == 'web02')
    
    #多条件判断,使用list列表形式
        - name: copy shell
          template:
            src: ./backup.sh
            dest: /root
          when:
            - ansible_fqdn == 'web01'
            - ansible_fqdn == 'web02'
            
    #多条件判断,使用is match 支持通配符
        - name: Add Crontab
          cron:
            name: "backup"
            minute: "00"
            hour: "01"
            job: "/bin/sh /root/backup.sh &>/dev/null"
          when: ansible_fqdn is match 'web*'
    

    2.使用when判断系统

    - hosts: webs
      tasks:
        - name: Install CentOS Apache
          yum:
            name: httpd
            state: present
          when: ansible_distribution == 'CentOS'
    
        - name: Install Ubuntu Apache
          apt:
            name: apache2
            state: present
          when: ansible_distribution == 'Ubuntu'
    

    3.使用when判断系统版本

    - hosts: webs
      tasks:
        - name: Start CentOS6 Httpd
          shell: "/etc/init.d/httpd start"
          when: ansible_distribution_major_version == '6'
    
        - name: Start CentOS7 Httpd
          shell: "systemctl start httpd"
          when: ansible_distribution_major_version == '7'
    

    4.使用注册变量对返回值进行判断

    - hosts: web_group
      tasks:
        - name: Check Httpd Server
          command: systemctl is-active httpd
          ignore_errors: yes
          register: check_httpd
    
        - name: debug outprint
          debug: var=check_httpd
    
        - name: Httpd Restart
          service:
            name: httpd
            state: restarted
          
          when: check_httpd.rc == 0
    	- name: pan duan rpm bao
          shell: "rpm -qa|grep php"
          register: check_php
    
        - name: Install php
          shell: "cd /usr/local/src && rpm -Uvh *rpm"
          when: check_php.rc != 0
    

    ansible循环语句

    1.with_items

        - name: start php and nginx
          systemd:
            name: "{{ item }}"
            state: started
            enabled: yes
          with_items:
            - nginx
            - php-fpm
    

    2.变量循环

    - name: ensure a list of packages installed
      yum:
        name: "{{ packages }}"
      vars:
        packages:
        - httpd
        - httpd-tools
    

    3.字典循环

    - hosts: web_group
      tasks:
        - name: copy conf and code
          copy:
            src: "{{ item.src }}"
            dest: "{{ item.dest }}"
            mode: "{{ item.mode }}"
          with_items:
            - { src: "./httpd.conf", dest: "/etc/httpd/conf/", mode: "0644" }
            - { src: "./upload_file.php", dest: "/var/www/html/", mode: "0600" }
    
        - name: tar php and nginx and wordpress
          unarchive:
            src: "{{ item.src }}"
            dest: "{{ item.dest }}"
            owner: "{{ item.user }}"
            group: "{{ item.user }}"
            copy: yes
          with_items:
            - { src: "./php.tgz", dest: "/usr/local/src", user: "root" }
            - { src: "./nginx-1.16.0.tar.gz", dest: "/root", user: "root" }
            - { src: "./wordpress.tgz", dest: "/code", user: "www" }
    
    

    ansible handlers(触发器)

        - name: scp nginx shell conf
          copy:
            src: "{{ item.src }}"
            dest: "{{ item.dest }}"
          with_items:
            - { src: "./nginx.service", dest: "/usr/lib/systemd/system" }
            - { src: "./nginx.conf", dest: "/usr/local/nginx/conf/" }
            - { src: "./www.drz.com.conf", dest: "/usr/local/nginx/conf/conf.d" }
          #添加触发器
          notify: 
            - reload nginx
            - reload php
    
      handlers:
        - name: reload nginx
          systemd:
            name: nginx
            state: reloaded
        - name: reload php
          systemd:
            name: php
            state: reloaded
    

    注意:

    1.无论多少个task通知了相同的handlers,handlers仅会在所有tasks结束后运行一次。

    2.Handlers只有在其所在的任务被执行时,才会被运行;如果一个任务中定义了notify调用Handlers,但是由于条件判断等原因,该任务未被执行,那么Handlers同样不会被执行。

    3.Handlers只会在每一个play的末尾运行一次;如果想在一个playbook中间运行Handlers,则需要使用meta模块来实现。例如: -meta: flush_handlers。

    4.如果一个play在运行到调用Handlers的语句之前失败了,那么这个Handlers将不会被执行。我们可以使用meta模块的--force-handlers选项来强制执行Handlers,即使Handlers所在的play中途运行失败也能执行。

    5.不能使用handlers替代tasks

    playbook复用include

    1.只调用task include_tasks

    [root@m01 web]# vim install_nginx.yml 
    
    - name: Install nginx
      yum:
        name: nginx
        state: present
    
    [root@m01 web]# vim conf_nginx.yml 
    - name: conf nginx
      copy:
        src: ./www.drz.com.conf
        dest: /etc/nginx/conf.d
      notify: reload nginx
    
    
    [root@m01 web]# vim main.yml 
    - hosts:
      tasks:
        - include_tasks: ./install_nginx.yml
        - include_tasks: ./conf_nginx.yml
      handlers:
        - name: reload nginx
          systemd:
            name: nginx
            state: reloaded
    
    [root@m01 m01]# ansible-playbook tag.yml --list-tags
    [root@m01 m01]# ansible-playbook tag.yml -t httpd_server
    [root@m01 m01]# ansible-playbook tag.yml -t install_httpd,confiure_httpd
    [root@m01 m01]# ansible-playbook tag.yml --skip-tags httpd_server
    

    2.直接复用写好的yml文件

    • 旧版:include
    • 新版:import_playbook
    • 在saltstack中,叫做top file入口文件
    - import_playbook: ./lnmp.yml
    - import_playbook: ../mariadb/mysql.yml
    

    示例一:

    [root@m01 m01]# cat task.yml 
    - hosts: web_group
      vars:
        - http_port: 8080
    
      tasks:
        - include_tasks: task_install.yml
        - include_tasks: task_configure.yml
        - include_tasks: task_start.yml
    
      handlers:
        - name: Restart Httpd Server
          systemd:
            name: httpd
            state: restarted
    
    [root@m01 m01]# cat task_install.yml 
    - name: Install Http Server
      yum:
        name: httpd
        state: present
    
    [root@m01 m01]# cat task_configure.yml 
    - name: configure httpd server
      template:
        src: ./httpd.j2
        dest: /etc/httpd/conf/httpd.conf
      notify: Restart Httpd Server
    
    [root@m01 m01]# cat task_start.yml 
    - name: start httpd server
      service:
        name: httpd
        state: started
        enabled: yes
    

    示例二:

    - include: httpd.yml
    - include: nfs.yml
    - include: rsync.yml
    

    示例三:

    - include: httpd.yml
    - include: nfs.yml
    - include: rsync.yml
    
  • 相关阅读:
    Tensorflow实战(1)
    一切重新开始!!!!!!!!
    二、单片机——串口通信及超声波(下)
    一、单片机——串口通信及超声波(上)
    Java小项目之远程桌面显示(摘自蓝桥老师视屏)
    Java小项目之Login界面理解MVC(MySQL数据库基本操作)
    Java小项目之拼图游戏
    暑假学习计划:Day_3.JavaBean
    暑假学习计划:Day_2. Response,Out,Config,Exception,pageContext对象。
    暑假学习计划:Day_1.JSP&Servlet&Tomcat 环境搭建到基础的认识。
  • 原文地址:https://www.cnblogs.com/1naonao/p/11574448.html
Copyright © 2020-2023  润新知