Ansible教程(7)when条件判断与with循环

TangLu 系统运维 2023-11-11 9594 0

一、Ansible with循环

在Ansible中使用with_items或者loop语句进行实现循环操作,适用于需要使用同一个模块重复执行的任务,比如对不同的服务进行启动调用的都是同一个模块。进行循环时使用固定变量名{{ itme }}表示要引用循环变量,然后在task中使用with_items或者loop关键词来定义变量和值

示例1、循环启动多个服务

#改造前需要重复编写
- hosts: webservers
  tasks:
    - name: start nginx
      systemd:
        name: nginx
        state: started
    - name: start mysql
      systemd:
        name: mysql
        state: started
        
#改造后
- hosts: webservers
  tasks:
    - name: start nginx and mysql
      systemd:
        name: "{{ item }}"
        state: started
      loop:
        - nginx
        - mysql


示例2、循环安装多个软件

vi /etc/ansible/with.yml
- hosts: webservers
  tasks:
    - name: install nginx mysql
      yum:
        name: "{{ item }}"
        state: latest
      loop:
        - httpd
        - mysql


示例3、传递键值对到循环中

- hosts: webservers
  tasks:
    - name: add users
      user: "{{ item.name }}"           #引用item中的name这个key
        groups: "{{ item.groups }}"
        state: present
      loop:
        - { name: 'user1', groups: 'root' }  #定义了name这个key和值
        - { name: 'user2', groups: 'nologin' }


二、Ansible when条件判断

在Ansible中通过关键词when进行条件判断,比如判断系统版本、内存大小,然后根据判断结果来执行下一步操作

示例1、根据不同的系统安装正确的软件包

cat when_system.yml
- hosts: web
  tasks:
    - name: CentOS install httpd
      yum:
        name: httpd
        state: present
      when: ansible_distribution == "CentOS"
    - name: Ubuntu install httpd
      yum:
        name: httpd2
        state: present
      when: ansible_distribution == "Ubuntu"


示例1:判断客户端系统判断,然后选择对应的配置文件

 vi /etc/ansible/when.yml  #加入如下内容
- hosts: dbservers
  user: root
  vars:
    - http_port: 8080

  tasks:
    - name: install nginx
      yum: name=nginx
    - name: copy conf for centos7
      template: src=nginx.conf7.j2 dest=/etc/nginx/nginx.conf
      when: ansible_distribution_major_version == "7"  #这里的变量是取facts信息
      notify: restart service
    - name: copy conf for centos6
      template: src=nginx.conf6.j2 dest=/etc/nginx/nginx.conf
      when: ansible_distribution_major_version == "6"
      notify: restart service
    - name: start service
      service: name=nginx state=started enabled=yes

  handlers:
    - name: restart service
      service: name=nginx state=restarted


示例2:当远程主机FQDN名为test时,给该主机添加一个用户user10

vi test.yml
- hosts: all
  remote_user: root
  vars:
  - username: user10
  tasks:
  - name: create {{ username }} user
    user: name={{ username }}
    when: ansible_fqdn == "test"

评论