Ansible playbook 编程( 二 )

 
标准循环注意:
1、循环语法有两种:loop 和 with_ 。
2、loop 是在ansible 2.5 添加的,with_ 是一直存在的,推荐使用 loop 。在未来 with_ 可能被弃用 。
简单列表循环如果我们需要在 playbook 中启动多个服务,或者下载多个文件;按照之前所学的,那么我们需要写多个 task 。但这样会使得 playbook 变得臃肿,因此这时我们就需要引进循环了 。
示例:一次启动多个服务,下载多个文件
使用 loop 方式【推荐】
1 [yun@ansi-manager object04]$ pwd 2 /app/ansible_info/object04 3 [yun@ansi-manager object04]$ ll 4 total 20 5 -rw-rw-r-- 1 yun yun 594 Aug 23 22:10 test_loop.yml 6 [yun@ansi-manager object04]$ cat test_loop.yml7 --- 8 # 启动多个服务 和下载多个文件 9 - hosts: proxyservers10 11tasks:12- name: "start httpd, rpcbind, network server"13service:14name: "{{ item }}"# 需要用引号引起来15state: started16loop:17- httpd18- rpcbind19- network20 21- name: "download multiple file"22get_url:23url: "{{ item }}"# 需要用引号引起来24dest: /tmp/25loop:26- http://www.zhangblog.com/uploads/jvm/jvm-01-01.png27- http://www.zhangblog.com/uploads/jvm/jvm-01-02.png28- http://www.zhangblog.com/uploads/jvm/jvm-01-03.png29 30 [yun@ansi-manager object04]$ ansible-playbook -b -i ../hosts_key --syntax-check test_loop.yml# 语法检测31 [yun@ansi-manager object04]$ ansible-playbook -b -i ../hosts_key -C test_loop.yml# 预执行,测试执行32 [yun@ansi-manager object04]$ ansible-playbook -b -i ../hosts_key test_loop.yml# 执行 
备注:以上方法可用在 yum 模块中 。
使用 with_items 方式
其中 playbook 文件中仅把 loop 变为了 with_items 。
1 [yun@ansi-manager object04]$ pwd 2 /app/ansible_info/object04 3 [yun@ansi-manager object04]$ ll 4 total 20 5 -rw-rw-r-- 1 yun yun 594 Aug 23 22:10 test_with_items.yml 6 [yun@ansi-manager object04]$ cat test_with_items.yml7 --- 8 # 启动多个服务 和下载多个文件 9 - hosts: proxyservers10 11tasks:12- name: "start httpd, rpcbind, network server"13service:14name: "{{ item }}"# 需要用引号引起来15state: started16with_items:17- httpd18- rpcbind19- network20 21- name: "download multiple file"22get_url:23url: "{{ item }}"# 需要用引号引起来24dest: /tmp/25with_items:26- http://www.zhangblog.com/uploads/jvm/jvm-01-01.png27- http://www.zhangblog.com/uploads/jvm/jvm-01-02.png28- http://www.zhangblog.com/uploads/jvm/jvm-01-03.png29 30 [yun@ansi-manager object04]$ ansible-playbook -b -i ../hosts_key --syntax-check test_with_items.yml# 语法检测31 [yun@ansi-manager object04]$ ansible-playbook -b -i ../hosts_key -C test_with_items.yml# 预执行,测试执行32 [yun@ansi-manager object04]$ ansible-playbook -b -i ../hosts_key test_with_items.yml# 执行 
如果用在 yum 模块中则会报如下弃用告警,因此该方法不适用于 yum 模块 。

Ansible playbook 编程

文章插图
 
 
遍历哈希列表如果我们需要创建多个用户并且每个用户都有指定的附加组;或者要创建多个文件,每个文件属主、属组、权限不一样;或者需要拷贝文件,但是每个文件的位置不一样,且属主、属组、权限不一样等等;那之前所学的简单循环就不能满足我们的需求了 。这时「哈希列表循环」就闪亮登场了 。
示例:
使用 loop 方式【推荐】
1 [yun@ansi-manager object04]$ pwd 2 /app/ansible_info/object04 3 [yun@ansi-manager object04]$ ll 4 total 16 5 drwxrwxr-x 2 yun yun56 Oct 26 16:03 file 6 -rw-rw-r-- 1 yun yun 1205 Oct 26 16:02 test_loop_hash.yml 7 [yun@ansi-manager object04]$ cat file/config_test.conf.j28 111 9 [yun@ansi-manager object04]$ cat file/yml_test_j2.yml 10 22211 [yun@ansi-manager object04]$ cat test_loop_hash.yml 12 ---13 # 使用循环字典创建多个用户,创建多个文件,拷贝多个文件14 - hosts: proxyservers15 16tasks:17- name: "Create multiple user"18user:19name: "{{ item.user }}"20groups: "{{ item.groups }}"21loop:22- { user: "testuser1", groups: "root" }23- { user: "testuser2", groups: "root,yun" }24 25- name: "Create multiple file or dir"26file:27path: "{{ item.path }}"28owner: "{{ item.owner }}"29group: "{{ item.group }}"30mode: "{{ item.mode }}"31state: "{{ item.state }}"32loop:33- { path: "/tmp/with_items_testdir", owner: "yun", group: "root", mode: "755", state: "directory" }34- { path: "/tmp/with_items_testfile", owner: "bin", group: "bin", mode: "644", state: "touch" }35 36- name: "copy multiple file"37copy:38src: "{{ item.src }}"39dest: "{{ item.dest }}"40owner: "{{ item.owner }}"41group: "{{ item.group }}"42loop:43- { src: "./file/config_test.conf.j2", dest: "/tmp/with_items_testdir/", owner: "yun", group: "root" }44- { src: "./file/yml_test_j2.yml", dest: "/tmp/yml_test.yml", owner: "yun", group: "yun" }45 46 [yun@ansi-manager object04]$ ansible-playbook -b -i ../hosts_key --syntax-check test_loop_hash.yml# 语法检测47 [yun@ansi-manager object04]$ ansible-playbook -b -i ../hosts_key -C test_loop_hash.yml# 预执行,测试执行48 [yun@ansi-manager object04]$ ansible-playbook -b -i ../hosts_key test_loop_hash.yml# 执行


推荐阅读