ansible系列(24)--ansible的loop循環語句




1. loop循環語句

在寫 playbook 的時候發現了很多 task 都要重復引用某個相同的模塊,比如一次啟動10個服務,或者一次拷貝10個文件,如果按照傳統的寫法最少要寫10次,這樣會顯得 playbook 很臃腫。如果使用循環的方式來編寫 playbook ,這樣可以減少重復編寫 task 帶來的臃腫。

引用格式:

  • 對迭代項的引用,固定變量名為"item"
  • 要在task中使用with_itemsloop關鍵字給定要迭代的元素列表;

1.1 使用循環批量安裝軟件

  • 方式一:

    [root@xuzhichao playbook]# cat loop_install.yml
    - hosts: NginxWebs
      remote_user: root
    
      tasks:
        - name: Install Packages
          yum:
            name: "{{ item }}"
            state: present
          loop:
            - httpd
            - mariadb-server
    
  • 運行playbook

    root@xuzhichao playbook]# ansible-playbook loop_install.yml 
    
    PLAY [NginxWebs] **********************************************************************************************************************************************
    
    TASK [Install Packages] ***************************************************************************************************************************************
    ok: [192.168.20.23] => (item=httpd)
    ok: [192.168.20.22] => (item=httpd)
    changed: [192.168.20.23] => (item=mariadb-server)
    changed: [192.168.20.22] => (item=mariadb-server)
    
    PLAY RECAP ****************************************************************************************************************************************************
    192.168.20.22              : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    192.168.20.23              : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    
  • 方式二:

    [root@xuzhichao playbook]# cat loop_install1.yml
    - hosts: NginxWebs
      remote_user: root
      vars:
        packages:
          - httpd
          - mariadb-server
    
      tasks:
        - name: Install Packages
          yum:
            name: "{{ packages }}"
            state: present
    
  • 運行playbook

    [root@xuzhichao playbook]# ansible-playbook loop_install1.yml
    
    PLAY [NginxWebs] **********************************************************************************************************************************************
    
    TASK [Install Packages] ***************************************************************************************************************************************
    changed: [192.168.20.23]
    changed: [192.168.20.22]
    
    PLAY RECAP ****************************************************************************************************************************************************
    192.168.20.22              : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    192.168.20.23              : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    

1.2 使用循環批量啟動服務

playbook文件如下:

[root@xuzhichao playbook]# cat loop_service.yml
- hosts: NginxWebs
  remote_user: root

  tasks:
    - name: Start Service
      service:
        name: "{{ item }}"
        state: started
      loop:
        - httpd
        - mariadb-server

運行playbook:

[root@xuzhichao playbook]# ansible-playbook -C loop_service.yml 

PLAY [NginxWebs] **********************************************************************************************************************************************

TASK [Start Service] ******************************************************************************************************************************************
changed: [192.168.20.23] => (item=httpd)
changed: [192.168.20.22] => (item=httpd)
changed: [192.168.20.23] => (item=mariadb-server)
changed: [192.168.20.22] => (item=mariadb-server)

PLAY RECAP ****************************************************************************************************************************************************
192.168.20.22              : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.20.23              : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

1.3 使用循環批量創建用戶

批量創建用戶,使用 key values 字典的方式。

[root@xuzhichao playbook]# cat loop_createuser.yml
- hosts: NginxWebs
  tasks:
    - name: Create Groups
      group:
        name: "{{ item }}"
        state: present
      loop:
          - group1
          - group2
          - group3

    - name: Create Users
      user:
        name: "{{ item.user }}"
        group: "{{ item.group }}"
        uid: "{{ item.uid }}"
        state: present
        create_home: yes
      loop:
        - { user: user1, group: group1, uid: 2001 }
        - { user: user2, group: group2, uid: 2002 }
        - { user: user3, group: group3, uid: 2003 }

運行playbook

[root@xuzhichao playbook]# ansible-playbook -C loop_createuser.yml 

PLAY [NginxWebs] **********************************************************************************************************************************************

TASK [Create Groups] ******************************************************************************************************************************************
ok: [192.168.20.23] => (item=group1)
ok: [192.168.20.22] => (item=group1)
ok: [192.168.20.23] => (item=group2)
ok: [192.168.20.22] => (item=group2)
changed: [192.168.20.23] => (item=group3)
changed: [192.168.20.22] => (item=group3)

TASK [Create Users] *******************************************************************************************************************************************
changed: [192.168.20.22] => (item={u'group': u'group1', u'user': u'user1', u'uid': 2001})
changed: [192.168.20.23] => (item={u'group': u'group1', u'user': u'user1', u'uid': 2001})
changed: [192.168.20.22] => (item={u'group': u'group2', u'user': u'user2', u'uid': 2002})
changed: [192.168.20.23] => (item={u'group': u'group2', u'user': u'user2', u'uid': 2002})
changed: [192.168.20.23] => (item={u'group': u'group3', u'user': u'user3', u'uid': 2003})
changed: [192.168.20.22] => (item={u'group': u'group3', u'user': u'user3', u'uid': 2003})

PLAY RECAP ****************************************************************************************************************************************************
192.168.20.22              : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.20.23              : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

1.4 使用循環批量拷貝文件

在需要拷貝多個文件,這些文件又有不同的屬主屬組權限等屬性時,而且拷貝到的目標目錄不同時,可以使用循環來拷貝文件。

示例,playbook文件如下:

[root@xuzhichao playbook]# cat loop_copyfile.yml
- hosts: NginxWebs
  tasks:
    - name: Copy Configuer File
      template:
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
        owner: "{{ item.owner }}"
        group: "{{ item.group }}"
        omode: "{{ item.mode }}"
      loop:
        - { src: "conf/nginx.conf.j2", dest: "/etc/nginx/nginx.conf", owner: "root", group: "root", mode: "0644" }
        - { src: "conf/example.com.conf.j2", dest: "/etc/nginx/conf.d/example.con.conf", owner: "root", group: "root", mode: "0644" }
        - { src: "file/index.html", dest: "/data/nginx/example/index.html", owner: "nginx", group: "nginx", mode: 0644 }

創建相關模板文件:

[root@xuzhichao playbook]# touch conf/nginx.conf.j2
[root@xuzhichao playbook]# touch conf/example.com.conf.j2
[root@xuzhichao playbook]# touch file/index.html

運行playbook

[root@xuzhichao playbook]# ansible-playbook -C loop_copyfile.yml 

PLAY [NginxWebs] ****************************************************************************************************************************

TASK [Copy Configuer File] *****************************************************************************************************************************
changed: [192.168.20.23] => (item={u'dest': u'/etc/nginx/nginx.conf', u'src': u'conf/nginx.conf.j2', u'group': u'root', u'mode': u'0644', u'owner': u'root'})
changed: [192.168.20.22] => (item={u'dest': u'/etc/nginx/nginx.conf', u'src': u'conf/nginx.conf.j2', u'group': u'root', u'mode': u'0644', u'owner': u'root'})
changed: [192.168.20.22] => (item={u'dest': u'/etc/nginx/conf.d/example.con.conf', u'src': u'conf/example.com.conf.j2', u'group': u'root', u'mode': u'0644', u'owner': u'root'})
changed: [192.168.20.23] => (item={u'dest': u'/etc/nginx/conf.d/example.con.conf', u'src': u'conf/example.com.conf.j2', u'group': u'root', u'mode': u'0644', u'owner': u'root'})
changed: [192.168.20.23] => (item={u'dest': u'/data/nginx/example/index.html', u'src': u'file/index.html', u'group': u'nginx', u'mode': 420, u'owner': u'nginx'})
changed: [192.168.20.22] => (item={u'dest': u'/data/nginx/example/index.html', u'src': u'file/index.html', u'group': u'nginx', u'mode': 420, u'owner': u'nginx'})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM