Ansible 流程控制

Posted baozexu

tags:

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

8.判断语句

  • 1.centos和ubuntu系统都需要安装httpd, 判断系统.
  • 2.安装软件仓库,只有web组的安装webtatic其他的主机全部跳过.
  • 3.TASK任务, TASK1任务执行成功,才会执行TASK2
#根据不同的系统,安装不同的服务
- 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" )
      
[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*"))


[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 )

9.循环语句

#一次启动多个服务
[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: '{{ item.src }}'
        dest: '{{ item.dest }}'
        mode: '{{ item.mode }}'
      with_items:
        - { src: ./file/nginx.conf.j2, dest: /etc/nginx/nginx.conf, mode: '0644' }
        - { src: ./file/kold.oldxu.com.conf.j2, dest: /etc/nginx/conf.d/kold.oldxu.com.conf, mode: '0600' }



#创建多个用户,一次创建多个? 3个用户  TASK
[root@manager project1]# cat f20.yml 
- hosts: webservers
  tasks:
    - name: Create User
      user:
        name: "{{ item }}"

      with_items:
        - test1
        - test2
        - test3
        - test4


#1.创建tt1 --> bin  tt2 -->root tt3 --->adm   附加组
[root@manager project1]# cat  f20.yml 
- hosts: webservers
  tasks:
    - name: Create User
      user:
        name: "{{ item.name }}"
        groups: "{{ item.groups }}"

      with_items:
        - { name: tt1, groups: bin }
        - { name: tt2, groups: root }
        - { name: tt3, groups: adm }
        
        
        
1.标准循环                   --->居多
    item
    with_items:
       - test
2.字典循环:                   --->居多
    itme.name
    with_items:
        - { name: test }


3.变量循环
- hosts: webservers
  tasks:
    - name: ensure a list of packages installed
      yum: name={{ packages }} state=present
      vars:
        packages:
          - httpd
          - httpd-tools

10.handlers

[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


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

变量->facts-->判断-->循环

  • 2.安装Redis (bind 本地IP地址) facts bind {{ ansible_eth1.ipv4.address }}

  • 1.安装Rsyncd服务 (循环) rsyncd.conf 644 rsync.passwd 600
  • 3.安装NFS (配置文件,创建目录,客户端挂载) 变量
  • 4.安装Nginx+PHP

  • 1.变量

  • 2.facts

  • 3.register

  • 4.when 判断语句 ( facts )

  • 5.with_items 循环

    • 1.标准循环

    • 2.字典循环

    • 3.变量循环(忽略)

1.tag标签(调试)

[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

2.include包含

3.错误处理 ignore_errors: yes

3.异常处理

? 1.每次状态都是changed,纵使没有修改过被控端

        #Check_Redis_Status=$(netstat -lntp | grep redis) 
    - name: Check Redis Status
      shell: netstat -lntp | grep redis
      register: Check_Redis_Status
      changed_when: false

        #echo ${Check_Redis_Status}
    - name: Debug Check_Redis Variables
      debug:
        msg: "Redis Status: {{ Check_Redis_Status.stdout_lines }}" 

? 2.nginx推送配置文件后,没有任何的检查功能

###########################################low版

[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
      ignore_errors: yes
      changed_when: false

        #启动Nginx
    - name: Systemd Nginx Server
      systemd:
        name: nginx
        state: started
        enabled: yes 
      when: ( Check_Nginx_Status.rc == 0 )  #只有Check_Nginx_Status.rc=0时,才会执行启动操作
      
      
##################################new版
[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
        
##################################new版       
[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      

3.强制调用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

总结: Ansible Task 控制

  • 1.判断语句 when
  • 2.循环语句 with_items
  • 3.触发器 handlers
  • 4.标签 tag
  • 5.忽略错误 ignore_errors
  • 6.异常处理
    • 1.关闭TASK的changed状态 -->让该TASK一直处理OK状态 changed_when: false
    • 2.强制调用handlers: 当正常task调用过handlers,则无论后续的task成功还是失败,都会调用handlers触发器执行任务.
    • 3........ Check_Nginx_Status.stdout.find(‘successful‘)

以上是关于Ansible 流程控制的主要内容,如果未能解决你的问题,请参考以下文章

ansible 流程控制

ansible 流程控制

Ansible 流程控制

流程控制优化

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程