{"id":1193,"date":"2023-08-09T00:00:05","date_gmt":"2023-08-08T16:00:05","guid":{"rendered":"https:\/\/www.qiangzhenshuai.com\/?p=1193"},"modified":"2023-08-17T14:17:35","modified_gmt":"2023-08-17T06:17:35","slug":"ansible-task%e6%8e%a7%e5%88%b6","status":"publish","type":"post","link":"https:\/\/www.qiangzhenshuai.com\/?p=1193","title":{"rendered":"Ansible Task\u63a7\u5236"},"content":{"rendered":"<h1>1.Ansible Task\u63a7\u5236\u6982\u8ff0<\/h1>\n<p>\u5728Ansible\u4e2d\uff0c\u4efb\u52a1\u63a7\u5236\u6307\u7684\u662f\u901a\u8fc7\u4e00\u4e9b\u9009\u9879\u6765\u63a7\u5236\u4efb\u52a1\u7684\u884c\u4e3a\u3002\u4ee5\u4e0b\u662f\u4e00\u4e9b\u5e38\u7528\u7684\u4efb\u52a1\u63a7\u5236\u9009\u9879\uff1a<\/p>\n<p>ignore_errors\uff1a\u5f53\u8bbe\u7f6e\u4e3ayes\u65f6\uff0c\u5373\u4f7f\u4efb\u52a1\u5931\u8d25\uff0cAnsible\u4e5f\u4f1a\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u7684\u4efb\u52a1\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u5f53\u4efb\u52a1\u5931\u8d25\u65f6\uff0cAnsible\u4f1a\u505c\u6b62\u6267\u884c\u540e\u7eed\u7684\u4efb\u52a1\u3002\u4f8b\u5982\uff1a<\/p>\n<pre>- name: \u6267\u884c\u547d\u4ee4\r\n  command: some_command\r\n  ignore_errors: yes\r\n<\/pre>\n<p>\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u5373\u4f7fsome_command\u547d\u4ee4\u6267\u884c\u5931\u8d25\uff0cAnsible\u4e5f\u4f1a\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u7684\u4efb\u52a1\u3002<\/p>\n<p>changed_when\uff1a\u7528\u4e8e\u6307\u5b9a\u4efb\u52a1\u5728\u4f55\u79cd\u60c5\u51b5\u4e0b\u88ab\u8ba4\u4e3a\u5df2\u7ecf\u6539\u53d8\u4e86\u7cfb\u7edf\u72b6\u6001\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cAnsible\u4f1a\u6839\u636e\u6a21\u5757\u7684\u8fd4\u56de\u503c\u6765\u5224\u65ad\u4efb\u52a1\u662f\u5426\u6539\u53d8\u4e86\u7cfb\u7edf\u72b6\u6001\u3002\u4f46\u6709\u65f6\u6a21\u5757\u7684\u8fd4\u56de\u503c\u5e76\u4e0d\u80fd\u51c6\u786e\u53cd\u6620\u7cfb\u7edf\u72b6\u6001\u7684\u6539\u53d8\uff0c\u56e0\u6b64\u53ef\u4ee5\u4f7f\u7528changed_when\u9009\u9879\u6765\u81ea\u5b9a\u4e49\u5224\u65ad\u6761\u4ef6\u3002\u4f8b\u5982\uff1a<\/p>\n<pre>- name: \u521b\u5efa\u76ee\u5f55\r\n  file:\r\n    path: \/path\/to\/directory\r\n    state: directory\r\n  changed_when: false\r\n<\/pre>\n<p>\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u65e0\u8bba\u76ee\u5f55\u662f\u5426\u5df2\u7ecf\u5b58\u5728\uff0c\u8be5\u4efb\u52a1\u90fd\u4e0d\u4f1a\u88ab\u6807\u8bb0\u4e3a\u5df2\u6539\u53d8\u7cfb\u7edf\u72b6\u6001\u3002<\/p>\n<p>failed_when\uff1a\u7528\u4e8e\u6307\u5b9a\u4efb\u52a1\u5728\u4f55\u79cd\u60c5\u51b5\u4e0b\u88ab\u8ba4\u4e3a\u5931\u8d25\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u5f53\u4efb\u52a1\u7684\u8fd4\u56de\u503c\u4e3a\u975e\u96f6\u65f6\uff0c\u4efb\u52a1\u88ab\u6807\u8bb0\u4e3a\u5931\u8d25\u3002\u4f46\u6709\u65f6\u4efb\u52a1\u7684\u8fd4\u56de\u503c\u5e76\u4e0d\u80fd\u51c6\u786e\u53cd\u6620\u4efb\u52a1\u662f\u5426\u6210\u529f\uff0c\u56e0\u6b64\u53ef\u4ee5\u4f7f\u7528failed_when\u9009\u9879\u6765\u81ea\u5b9a\u4e49\u5224\u65ad\u6761\u4ef6\u3002\u4f8b\u5982\uff1a<\/p>\n<pre>- name: \u68c0\u67e5\u6587\u4ef6\u662f\u5426\u5b58\u5728\r\n  stat:\r\n    path: \/path\/to\/file\r\n  register: file_info\r\n  failed_when: file_info.stat.exists == False\r\n<\/pre>\n<p>\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u5982\u679c\u6307\u5b9a\u8def\u5f84\u7684\u6587\u4ef6\u4e0d\u5b58\u5728\uff0c\u4efb\u52a1\u5c06\u88ab\u6807\u8bb0\u4e3a\u5931\u8d25\u3002<\/p>\n<p>\u9664\u4e86\u4e0a\u8ff0\u5e38\u7528\u7684\u4efb\u52a1\u63a7\u5236\u9009\u9879\u5916\uff0c\u8fd8\u6709\u4e00\u4e9b\u5176\u4ed6\u9009\u9879\u53ef\u4ee5\u8fdb\u4e00\u6b65\u63a7\u5236\u4efb\u52a1\u7684\u884c\u4e3a\uff0c\u4f8b\u5982changed_callback\u9009\u9879\u53ef\u4ee5\u6307\u5b9a\u4e00\u4e2a\u56de\u8c03\u63d2\u4ef6\u6765\u5904\u7406\u4efb\u52a1\u6539\u53d8\u7cfb\u7edf\u72b6\u6001\u7684\u901a\u77e5\u3002<\/p>\n<p>\u4efb\u52a1\u63a7\u5236\u9009\u9879\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7ec4\u5408\u548c\u5d4c\u5957\u4f7f\u7528\uff0c\u4ee5\u5b9e\u73b0\u66f4\u590d\u6742\u7684\u4efb\u52a1\u63a7\u5236\u903b\u8f91\u3002\u8bf7\u53c2\u8003Ansible\u5b98\u65b9\u6587\u6863\u4ee5\u83b7\u53d6\u66f4\u8be6\u7ec6\u7684\u4fe1\u606f\u548c\u793a\u4f8b<\/p>\n<h2><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_conditionals.html\">\u5b98\u7f51<\/a><\/h2>\n<h1>2.Playbook\u6761\u4ef6\u8bed\u53e5<\/h1>\n<p>\u5728Ansible Playbook\u4e2d\uff0c\u53ef\u4ee5\u4f7f\u7528\u6761\u4ef6\u8bed\u53e5\u6765\u6839\u636e\u4e0d\u540c\u7684\u6761\u4ef6\u6267\u884c\u4e0d\u540c\u7684\u4efb\u52a1\u3002\u4ee5\u4e0b\u662f\u4e00\u4e9b\u5e38\u7528\u7684\u6761\u4ef6\u8bed\u53e5\uff1a<\/p>\n<p>when\u8bed\u53e5\uff1awhen\u8bed\u53e5\u7528\u4e8e\u5728\u4efb\u52a1\u7ea7\u522b\u4e0a\u6267\u884c\u6761\u4ef6\u5224\u65ad\u3002\u53ea\u6709\u5f53\u6761\u4ef6\u4e3a\u771f\u65f6\uff0c\u624d\u4f1a\u6267\u884c\u8be5\u4efb\u52a1\u3002\u4f8b\u5982\uff1a<\/p>\n<pre>- name: \u5b89\u88c5\u8f6f\u4ef6\u5305\r\n  yum:\r\n    name: mypackage\r\n    state: present\r\n  when: ansible_os_family == 'RedHat'\r\n<\/pre>\n<p>\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u53ea\u6709\u5f53ansible_os_family\u53d8\u91cf\u7684\u503c\u4e3aRedHat\u65f6\uff0c\u624d\u4f1a\u6267\u884c\u5b89\u88c5\u8f6f\u4ef6\u5305\u7684\u4efb\u52a1\u3002<\/p>\n<p>block\u8bed\u53e5\uff1ablock\u8bed\u53e5\u7528\u4e8e\u5728\u4efb\u52a1\u7ec4\u7ea7\u522b\u4e0a\u6267\u884c\u6761\u4ef6\u5224\u65ad\u3002\u53ef\u4ee5\u5c06\u591a\u4e2a\u4efb\u52a1\u7ec4\u5408\u5728\u4e00\u4e2ablock\u4e2d\uff0c\u5e76\u6839\u636e\u6761\u4ef6\u5224\u65ad\u662f\u5426\u6267\u884c\u8be5block\u3002\u4f8b\u5982\uff1a<\/p>\n<pre>- name: \u5b89\u88c5\u8f6f\u4ef6\u5305\r\n  block:\r\n    - name: \u5b89\u88c5\u8f6f\u4ef6\u5305\uff08RedHat\uff09\r\n      yum:\r\n        name: mypackage\r\n        state: present\r\n      when: ansible_os_family == 'RedHat'\r\n\r\n    - name: \u5b89\u88c5\u8f6f\u4ef6\u5305\uff08Debian\uff09\r\n      apt:\r\n        name: mypackage\r\n        state: present\r\n      when: ansible_os_family == 'Debian'\r\n<\/pre>\n<p>\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6839\u636eansible_os_family\u53d8\u91cf\u7684\u503c\uff0c\u9009\u62e9\u6267\u884c\u4e0d\u540c\u7684\u5b89\u88c5\u8f6f\u4ef6\u5305\u4efb\u52a1\u3002<\/p>\n<p>include\u8bed\u53e5\uff1ainclude\u8bed\u53e5\u7528\u4e8e\u5728Playbook\u4e2d\u5305\u542b\u5176\u4ed6\u7684Playbook\u6587\u4ef6\uff0c\u5e76\u6839\u636e\u6761\u4ef6\u5224\u65ad\u662f\u5426\u5305\u542b\u3002\u4f8b\u5982\uff1a<\/p>\n<pre>- name: \u6267\u884c\u4efb\u52a1\r\n  include: tasks.yml\r\n  when: ansible_os_family == 'RedHat'\r\n<\/pre>\n<p>\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u53ea\u6709\u5f53ansible_os_family\u53d8\u91cf\u7684\u503c\u4e3aRedHat\u65f6\uff0c\u624d\u4f1a\u5305\u542btasks.yml\u6587\u4ef6\u4e2d\u7684\u4efb\u52a1\u3002<\/p>\n<p>\u9664\u4e86\u4e0a\u8ff0\u6761\u4ef6\u8bed\u53e5\u5916\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528vars\u8bed\u53e5\u6765\u5b9a\u4e49\u53d8\u91cf\uff0c\u5e76\u6839\u636e\u6761\u4ef6\u8bbe\u7f6e\u4e0d\u540c\u7684\u53d8\u91cf\u503c\u3002\u8fd8\u53ef\u4ee5\u4f7f\u7528failed_when\u8bed\u53e5\u6765\u6839\u636e\u6761\u4ef6\u5c06\u4efb\u52a1\u6807\u8bb0\u4e3a\u5931\u8d25\u3002<\/p>\n<p>\u6761\u4ef6\u8bed\u53e5\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7ec4\u5408\u548c\u5d4c\u5957\u4f7f\u7528\uff0c\u4ee5\u5b9e\u73b0\u66f4\u590d\u6742\u7684\u6761\u4ef6\u903b\u8f91\u3002\u8bf7\u53c2\u8003Ansible\u5b98\u65b9\u6587\u6863\u4ee5\u83b7\u53d6\u66f4\u8be6\u7ec6\u7684\u4fe1\u606f\u548c\u793a\u4f8b<\/p>\n<h2><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_conditionals.html\">\u5b98\u7f51<\/a><\/h2>\n<h2>when<\/h2>\n<p>ansible_facts\uff1a\u4e00\u4e2a\u5b57\u5178\uff0c\u5305\u542b Ansible \u4e8b\u5b9e\uff08facts\uff09<br \/>\nansible_hostname\uff1a\u8fdc\u7a0b\u4e3b\u673a\u7684\u4e3b\u673a\u540d<br \/>\nansible_distribution\uff1a\u8fdc\u7a0b\u4e3b\u673a\u7684\u53d1\u884c\u7248<br \/>\nansible_distribution_version\uff1a\u8fdc\u7a0b\u4e3b\u673a\u7684\u53d1\u884c\u7248\u7248\u672cansible_distribution_major_version\uff1a\u8fdc\u7a0b\u4e3b\u673a\u7684\u53d1\u884c\u7248\u4e3b\u8981\u7248\u672c<br \/>\nansible_architecture\uff1a\u8fdc\u7a0b\u4e3b\u673a\u7684\u67b6\u6784<br \/>\nansible_os_family\uff1a\u8fdc\u7a0b\u4e3b\u673a\u7684\u64cd\u4f5c\u7cfb\u7edf\u5bb6\u65cf<br \/>\nansible_system\uff1a\u8fdc\u7a0b\u4e3b\u673a\u7684\u64cd\u4f5c\u7cfb\u7edf\u540d\u79f0<br \/>\nansible_virtualization_type\uff1a\u8fdc\u7a0b\u4e3b\u673a\u7684\u865a\u62df\u5316\u7c7b\u578b<br \/>\nansible_check_mode\uff1a\u6307\u5b9a\u662f\u5426\u5904\u4e8e Ansible \u7684\u68c0\u67e5\u6a21\u5f0f<br \/>\nansible_run_tags\uff1a\u4e00\u4e2a\u5217\u8868\uff0c\u5305\u542b\u5f53\u524d\u6267\u884c\u7684\u4efb\u52a1\u7684\u6807\u7b7e<br \/>\nansible_skip_tags\uff1a\u4e00\u4e2a\u5217\u8868\uff0c\u5305\u542b\u5f53\u524d\u8df3\u8fc7\u7684\u4efb\u52a1\u7684\u6807\u7b7e<br \/>\nansible_verbosity\uff1a\u6307\u5b9a Ansible \u7684\u8be6\u7ec6\u7a0b\u5ea6\u7ea7\u522b<br \/>\ninventory_hostname\uff1a\u8fdc\u7a0b\u4e3b\u673a\u5728 Ansible \u6e32\u67d3\u671f\u95f4\u7684\u4e3b\u673a\u540dinventory_hostname_short\uff1a\u8fdc\u7a0b\u4e3b\u673a\u5728 Ansible \u6e32\u67d3\u671f\u95f4\u7684\u77ed\u4e3b\u673a\u540d<br \/>\ngroups\uff1a\u4e00\u4e2a\u5b57\u5178\uff0c\u5305\u542b\u4e3b\u673a\u7ec4\u7684\u4fe1\u606f<br \/>\ngroup_names\uff1a\u4e00\u4e2a\u5217\u8868\uff0c\u5305\u542b\u5f53\u524d\u4e3b\u673a\u6240\u5c5e\u7684\u4e3b\u673a\u7ec4<br \/>\nhostvars\uff1a\u4e00\u4e2a\u5b57\u5178\uff0c\u5305\u542b\u6240\u6709\u4e3b\u673a\u7684\u53d8\u91cf<br \/>\nvars\uff1a\u4e00\u4e2a\u5b57\u5178\uff0c\u5305\u542b\u6240\u6709\u53d8\u91cf<br \/>\nvars_file\uff1a\u4e00\u4e2a\u5217\u8868\uff0c\u5305\u542b\u4ece\u53d8\u91cf\u6587\u4ef6\u52a0\u8f7d\u7684\u53d8\u91cf<br \/>\nvars_files\uff1a\u4e00\u4e2a\u5217\u8868\uff0c\u5305\u542b\u4ece\u53d8\u91cf\u6587\u4ef6\u52a0\u8f7d\u7684\u53d8\u91cf<br \/>\nansible_env\uff1a\u4e00\u4e2a\u5b57\u5178\uff0c\u5305\u542b\u8fdc\u7a0b\u4e3b\u673a\u7684\u73af\u5883\u53d8\u91cf<br \/>\nansible_all_ipv4_addresses\uff1a\u4e00\u4e2a\u5217\u8868\uff0c\u5305\u542b\u8fdc\u7a0b\u4e3b\u673a\u7684\u6240\u6709 IPv4 \u5730\u5740ansible_all_ipv6_addresses\uff1a\u4e00\u4e2a\u5217\u8868\uff0c\u5305\u542b\u8fdc\u7a0b\u4e3b\u673a\u7684\u6240\u6709 IPv6 \u5730\u5740ansible_default_ipv4\uff1a\u4e00\u4e2a\u5b57\u5178\uff0c\u5305\u542b\u8fdc\u7a0b\u4e3b\u673a\u7684\u9ed8\u8ba4 IPv4 \u5730\u5740ansible_default_ipv6\uff1a\u4e00\u4e2a\u5b57\u5178\uff0c\u5305\u542b\u8fdc\u7a0b\u4e3b\u673a\u7684\u9ed8\u8ba4 IPv6 \u5730\u5740<\/p>\n<h2>\u6839\u636e\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\uff0c\u5b89\u88c5\u76f8\u540c\u7684\u8f6f\u4ef6\u5305<\/h2>\n<h4>\u6dfb\u52a0<\/h4>\n<p>[centubt]<br \/>\n172.16.1.121\uff08ubuntu\uff09<br \/>\n172.16.1.145<\/p>\n<h4>\u5267\u672c<\/h4>\n<pre>[root@ansible \/server\/playbook]$ cat 10when.yml \r\n---\r\n- hosts: centubt\r\n  tasks:\r\n  - name: CentOS install cowsay\r\n      yum:\r\n        name:\r\n        - cowsay\r\n        state: present\r\n    when: ( ansible_distribution == \"CentOS\" )\r\n  - name: Ubuntu install cmatrix\r\n    apt: \r\n      name: \r\n      - cmatrix\r\n      state: present\r\n    when: ( ansible_distribution == \"Ubuntu\" )<\/pre>\n<pre>[root@ansible \/server\/playbook]$ ansible-playbook 10when.yml\r\n\r\nPLAY [centubt] ****************************************************************************************************************\r\n\r\nTASK [Gathering Facts] ********************************************************************************************************\r\nok: [172.16.1.145]\r\nok: [172.16.1.121]\r\n\r\nTASK [CentOS install cowsay] **************************************************************************************************\r\nskipping: [172.16.1.121]\r\nchanged: [172.16.1.145]\r\n\r\nTASK [Ubuntu install cmatrix] *************************************************************************************************\r\nskipping: [172.16.1.145]\r\nchanged: [172.16.1.121]\r\n\r\nPLAY RECAP ********************************************************************************************************************\r\n172.16.1.121 : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 \r\n172.16.1.145 : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0<\/pre>\n<p><a href=\"https:\/\/www.qiangzhenshuai.com\/?attachment_id=1198\" rel=\"attachment wp-att-1198\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-1198\" src=\"https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookwhen.png?resize=640%2C203&#038;ssl=1\" alt=\"\" width=\"640\" height=\"203\" srcset=\"https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookwhen.png?w=1157&amp;ssl=1 1157w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookwhen.png?resize=300%2C95&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookwhen.png?resize=1024%2C325&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookwhen.png?resize=768%2C244&amp;ssl=1 768w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<h2>\u6240\u6709\u4e3aweb\u4e3b\u673a\u540d\u7684\u6dfb\u52a0nginx\u4ed3\u5e93\uff0c\u5176\u4f59\u7684\u90fd\u8df3\u8fc7\u6dfb\u52a0<\/h2>\n<h4>\u5267\u672c<\/h4>\n<pre>[root@ansible \/server\/playbook]$ cat 11when-nginx.yml \r\n---\r\n- hosts: all\r\n  tasks:\r\n  - name: Add yum Nginx \r\n    yum_repository:\r\n      name: nginx\r\n      description: nginx repo\r\n      baseurl: http:\/\/nginx.org\/packages\/centos\/$releasever\/$basearch\/\r\n      enabled: yes\r\n      gpgcheck: yes\r\n    when: ( ansible_hostname is match(\"web\") )<\/pre>\n<p><a href=\"https:\/\/www.qiangzhenshuai.com\/?attachment_id=1199\" rel=\"attachment wp-att-1199\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-1199\" src=\"https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookwhen-nginx.png?resize=640%2C293&#038;ssl=1\" alt=\"\" width=\"640\" height=\"293\" srcset=\"https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookwhen-nginx.png?w=1151&amp;ssl=1 1151w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookwhen-nginx.png?resize=300%2C137&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookwhen-nginx.png?resize=1024%2C469&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookwhen-nginx.png?resize=768%2C352&amp;ssl=1 768w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<h4>\u4e5f\u53ef\u4ee5\u4f7f\u7528and\u4e0eor\u65b9\u5f0f<\/h4>\n<p>when: (ansible_hostname is match(&#8220;web&#8221;)) or<br \/>\n(ansible_hostname is match(&#8220;lb&#8221;))<\/p>\n<p>when: (ansible_hostname is match(&#8220;web&#8221;)) and<br \/>\n(ansible_hostname is match(&#8220;lb&#8221;))<\/p>\n<h2>\u6839\u636e\u524d\u8005\u547d\u4ee4\u6267\u884c\u7684\u7ed3\u679c\u8fdb\u884c\u5224\u65ad<\/h2>\n<h4>\u901a\u8fc7register\u5c06\u547d\u4ee4\u6267\u884c\u7ed3\u679c\u4fdd\u5b58\u81f3\u53d8\u91cf\uff0c\u7136\u540e\u901a\u8fc7when\u8bed\u53e5\u8fdb\u884c\u5224\u65ad<\/h4>\n<h4>\u5267\u672c<\/h4>\n<pre>[root@ansible \/server\/playbook]$ cat 12register-when.yml \r\n---\r\n- hosts: web\r\n  tasks:\r\n  - name: Nginx Server\r\n    command: systemctl is-active nginx\r\n    ignore_errors: yes\r\n    register: check_nginx\r\n  - name: debug outprint\r\n    debug: \r\n       var: check_nginx\r\n  - name: nginx restart\r\n    service:\r\n      name: nginx\r\n      state: restarted\r\n    when: check_nginx.rc == 0<\/pre>\n<p><a href=\"https:\/\/www.qiangzhenshuai.com\/?attachment_id=1202\" rel=\"attachment wp-att-1202\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-1202\" src=\"https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookregisternginx01.png?resize=640%2C342&#038;ssl=1\" alt=\"\" width=\"640\" height=\"342\" srcset=\"https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookregisternginx01.png?w=1152&amp;ssl=1 1152w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookregisternginx01.png?resize=300%2C160&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookregisternginx01.png?resize=1024%2C547&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookregisternginx01.png?resize=768%2C410&amp;ssl=1 768w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a> <a href=\"https:\/\/www.qiangzhenshuai.com\/?attachment_id=1203\" rel=\"attachment wp-att-1203\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-1203\" src=\"https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookregisternginx02.png?resize=640%2C335&#038;ssl=1\" alt=\"\" width=\"640\" height=\"335\" srcset=\"https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookregisternginx02.png?w=1134&amp;ssl=1 1134w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookregisternginx02.png?resize=300%2C157&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookregisternginx02.png?resize=1024%2C536&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookregisternginx02.png?resize=768%2C402&amp;ssl=1 768w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<h4>when\u6761\u4ef6\u8bed\u53e5\u5c0f\u7ed3<\/h4>\n<p>\u5f53\u6761\u4ef6\u8bed\u53e5\u662f Ansible Playbook \u4e2d\u7684\u4e00\u4e2a\u91cd\u8981\u7ec4\u6210\u90e8\u5206\uff0c\u5b83\u5141\u8bb8\u60a8\u6839\u636e\u4e00\u4e9b\u6761\u4ef6\u6765\u63a7\u5236\u4efb\u52a1\u7684\u6267\u884c\u3002\u4ee5\u4e0b\u662f\u4e00\u4e9b\u5173\u952e\u70b9\u7684\u5c0f\u7ed3\uff1a<\/p>\n<p>when \u5173\u952e\u5b57\u7528\u4e8e\u5b9a\u4e49\u6761\u4ef6\u8bed\u53e5\uff0c\u5e76\u6839\u636e\u6761\u4ef6\u7684\u7ed3\u679c\u6765\u51b3\u5b9a\u662f\u5426\u6267\u884c\u4efb\u52a1<br \/>\n\u6761\u4ef6\u8bed\u53e5\u53ef\u4ee5\u4f7f\u7528 Ansible \u63d0\u4f9b\u7684\u4e8b\u5b9e\uff08facts\uff09\u548c\u53d8\u91cf\u6765\u6784\u5efa<br \/>\n\u6761\u4ef6\u8bed\u53e5\u53ef\u4ee5\u4f7f\u7528\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff08\u4f8b\u5982\u00a0==\u3001!=\u3001&gt;\u3001&lt;\u3001&gt;=\u3001&lt;=\uff09\u6765\u6bd4\u8f83\u503c<br \/>\n\u53ef\u4ee5\u4f7f\u7528\u903b\u8f91\u8fd0\u7b97\u7b26\uff08\u4f8b\u5982 and\u3001or\u3001not\uff09\u6765\u7ec4\u5408\u591a\u4e2a\u6761\u4ef6<br \/>\n\u53ef\u4ee5\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u6765\u5339\u914d\u5b57\u7b26\u4e32<br \/>\n\u53ef\u4ee5\u4f7f\u7528\u5217\u8868\u3001\u5b57\u5178\u548c\u5176\u4ed6\u6570\u636e\u7ed3\u6784\u6765\u68c0\u67e5\u503c\u662f\u5426\u5b58\u5728\u6216\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6<br \/>\n\u53ef\u4ee5\u4f7f\u7528 Ansible \u63d0\u4f9b\u7684\u4e8b\u5b9e\uff08facts\uff09\u548c\u53d8\u91cf\u6765\u83b7\u53d6\u6709\u5173\u8fdc\u7a0b\u4e3b\u673a\u7684\u4fe1\u606f<br \/>\n\u53ef\u4ee5\u4f7f\u7528 Ansible \u7684\u5185\u7f6e\u51fd\u6570\uff08\u4f8b\u5982\u00a0hostvars\u3001groups\u3001inventory_hostname\uff09\u6765\u8bbf\u95ee\u6709\u5173\u4e3b\u673a\u548c\u7ec4\u7684\u4fe1\u606f<br \/>\n\u53ef\u4ee5\u4f7f\u7528 Ansible \u7684\u73af\u5883\u53d8\u91cf\uff08\u4f8b\u5982\u00a0ansible_env\uff09\u6765\u83b7\u53d6\u6709\u5173\u8fdc\u7a0b\u4e3b\u673a\u7684\u73af\u5883\u4fe1\u606f<br \/>\n\u53ef\u4ee5\u4f7f\u7528 Ansible \u7684\u8fd0\u884c\u65f6\u53d8\u91cf\uff08\u4f8b\u5982\u00a0ansible_check_mode\u3001ansible_run_tags\uff09\u6765\u83b7\u53d6\u6709\u5173 Playbook \u6267\u884c\u7684\u4fe1\u606f<\/p>\n<p>\u901a\u8fc7\u7075\u6d3b\u4f7f\u7528\u6761\u4ef6\u8bed\u53e5\uff0c\u60a8\u53ef\u4ee5\u6839\u636e\u4e0d\u540c\u7684\u60c5\u51b5\u6765\u52a8\u6001\u5730\u63a7\u5236\u4efb\u52a1\u7684\u6267\u884c\uff0c\u4ece\u800c\u4f7f Ansible Playbook \u66f4\u52a0\u7075\u6d3b\u548c\u53ef\u914d\u7f6e\u3002\u6709\u5173\u66f4\u8be6\u7ec6\u7684\u4fe1\u606f\u548c\u793a\u4f8b\uff0c\u8bf7\u53c2\u9605 Ansible \u5b98\u65b9\u6587\u6863\u4e2d\u7684\u6761\u4ef6\u8bed\u53e5\u90e8\u5206<\/p>\n<h2><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_conditionals.html\">\u5b98\u7f51<\/a><\/h2>\n<h1>3.Playbook\u5faa\u73af\u8bed\u53e5<\/h1>\n<p>\u5728 Ansible Playbook \u4e2d\uff0c\u5faa\u73af\u8bed\u53e5\u53ef\u4ee5\u4f7f\u7528\u591a\u4e2a\u6a21\u5757\u6765\u6267\u884c\u8fed\u4ee3\u64cd\u4f5c\u3002\u4ee5\u4e0b\u662f\u4e00\u4e9b\u5e38\u7528\u7684\u5faa\u73af\u8bed\u53e5\u6a21\u5757\u53ca\u5176\u53c2\u6570\u5217\u8868\u548c\u8be6\u7ec6\u8bf4\u660e<\/p>\n<p>loop \u6a21\u5757<\/p>\n<p>loop: \u5b9a\u4e49\u8981\u8fed\u4ee3\u7684\u5217\u8868\u6216\u5b57\u5178\u3002<br \/>\nloop_control: \u63a7\u5236\u5faa\u73af\u884c\u4e3a\u7684\u9009\u9879\u3002<\/p>\n<p>loop_var: \u6307\u5b9a\u5faa\u73af\u53d8\u91cf\u7684\u540d\u79f0\u3002<br \/>\nlabel: \u6307\u5b9a\u5faa\u73af\u7684\u6807\u7b7e\u3002<br \/>\nextended: \u6269\u5c55\u5faa\u73af\u53d8\u91cf\u7684\u529f\u80fd\u3002<br \/>\npause: \u5728\u8fed\u4ee3\u4e4b\u95f4\u6dfb\u52a0\u5ef6\u8fdf\u3002<br \/>\ndelay: \u8bbe\u7f6e\u5ef6\u8fdf\u7684\u79d2\u6570\u3002timeout: \u8bbe\u7f6e\u5faa\u73af\u8d85\u65f6\u7684\u79d2\u6570\u3002<br \/>\nretries: \u8bbe\u7f6e\u5faa\u73af\u91cd\u8bd5\u7684\u6b21\u6570\u3002<br \/>\nretry_interval: \u8bbe\u7f6e\u5faa\u73af\u91cd\u8bd5\u4e4b\u95f4\u7684\u95f4\u9694\u3002<br \/>\ncontinue: \u63a7\u5236\u5faa\u73af\u662f\u5426\u7ee7\u7eed\u3002<br \/>\nskip_errors: \u63a7\u5236\u662f\u5426\u8df3\u8fc7\u9519\u8bef\u3002<br \/>\ntag: \u4e3a\u5faa\u73af\u6dfb\u52a0\u6807\u7b7e\u3002<\/p>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre>- name: Loop example\r\n  hosts: all\r\n  tasks:\r\n    - name: Print fruits\r\n      debug:\r\n        msg: \"{{ item }}\"\r\n      loop:\r\n        - apple\r\n        - banana\r\n        - orange<\/pre>\n<p>with_items \u6a21\u5757<\/p>\n<p>with_items: \u5b9a\u4e49\u8981\u8fed\u4ee3\u7684\u5217\u8868\u6216\u5b57\u5178\u3002<br \/>\nloop_control: \u63a7\u5236\u5faa\u73af\u884c\u4e3a\u7684\u9009\u9879\u3002<\/p>\n<p>\u793a\u4f8b<\/p>\n<pre>- name: Loop example\r\n  hosts: all\r\n  tasks:\r\n    - name: Print fruits\r\n      debug:\r\n        msg: \"{{ item }}\"\r\n      with_items:\r\n        - apple\r\n        - banana\r\n        - orange<\/pre>\n<p>with_dict \u6a21\u5757<\/p>\n<p>with_dict: \u5b9a\u4e49\u8981\u8fed\u4ee3\u7684\u5b57\u5178\u3002<br \/>\nloop_control: \u63a7\u5236\u5faa\u73af\u884c\u4e3a\u7684\u9009\u9879\u3002<\/p>\n<p>\u793a\u4f8b<\/p>\n<pre>- name: Loop example\r\n  hosts: all\r\n  tasks:\r\n    - name: Print users\r\n      debug:\r\n        msg: \"User {{ item.key }} has id {{ item.value }}\"\r\n      with_dict:\r\n        user1: 1001\r\n        user2: 1002\r\n        user3: 1003<\/pre>\n<p>with_fileglob \u6a21\u5757<\/p>\n<p>with_fileglob: \u5b9a\u4e49\u8981\u8fed\u4ee3\u7684\u6587\u4ef6\u8def\u5f84\u6a21\u5f0f\u3002<br \/>\nloop_control: \u63a7\u5236\u5faa\u73af\u884c\u4e3a\u7684\u9009\u9879\u3002<\/p>\n<p>\u793a\u4f8b<\/p>\n<pre>- name: Loop example\r\n  hosts: all\r\n  tasks:\r\n    - name: Print files\r\n      debug:\r\n        msg: \"{{ item }}\"\r\n      with_fileglob:\r\n        - \/path\/to\/files\/*.txt<\/pre>\n<p>with_sequence \u6a21\u5757<\/p>\n<p>with_sequence: \u5b9a\u4e49\u8981\u8fed\u4ee3\u7684\u6570\u5b57\u5e8f\u5217\u3002<br \/>\nloop_control: \u63a7\u5236\u5faa\u73af\u884c\u4e3a\u7684\u9009\u9879\u3002<\/p>\n<p>\u793a\u4f8b<\/p>\n<pre>- name: Loop example\r\n  hosts: all\r\n  tasks:\r\n    - name: Print numbers\r\n      debug:\r\n        msg: \"{{ item }}\"\r\n      with_sequence:\r\n        - start=1 end=5<\/pre>\n<p>\u5faa\u73af\u8bed\u53e5\u6a21\u5757\u5141\u8bb8\u60a8\u5728\u5faa\u73af\u4e2d\u4f7f\u7528\u53d8\u91cf\uff0c\u5e76\u6839\u636e\u9700\u8981\u8fdb\u884c\u6761\u4ef6\u5224\u65ad\u548c\u63a7\u5236\u5faa\u73af\u884c\u4e3a\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528\u6a21\u5757\u63d0\u4f9b\u7684\u9009\u9879\u6765\u5b9a\u5236\u5faa\u73af\u7684\u884c\u4e3a\uff0c\u4f8b\u5982\u8bbe\u7f6e\u5faa\u73af\u7d22\u5f15\u3001\u8df3\u8fc7\u8fed\u4ee3\u6216\u4e2d\u6b62\u5faa\u73af\u7b49<\/p>\n<h3><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_loops.html\">\u5b98\u7f51<\/a><\/h3>\n<p>\u5728 Ansible Playbook \u4e2d\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u5faa\u73af\u8bed\u53e5\u7ed3\u5408\u00a0vars\u00a0\u5173\u952e\u5b57\u6765\u5b9a\u4e49\u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u3002vars\u00a0\u5173\u952e\u5b57\u540e\u9762\u53ef\u4ee5\u8ddf\u4e00\u4e2a\u5b57\u5178\uff0c\u5176\u4e2d\u5305\u542b\u4e86\u5faa\u73af\u53d8\u91cf\u7684\u5b9a\u4e49\u3002\u4e0b\u9762\u662f\u00a0vars\u00a0\u5173\u952e\u5b57\u7684\u5b8c\u6574\u53c2\u6570\u8bf4\u660e\uff1a<\/p>\n<p>name\uff08\u53ef\u9009\uff09\uff1a\u7528\u4e8e\u6807\u8bc6\u53d8\u91cf\u5b9a\u4e49\u5757\u7684\u540d\u79f0<br \/>\nloop\uff08\u53ef\u9009\uff09\uff1a\u6307\u5b9a\u8981\u5faa\u73af\u8fed\u4ee3\u7684\u5217\u8868\u6216\u5b57\u5178<br \/>\nwith_items\uff08\u53ef\u9009\uff09\uff1a\u4e0e loop \u76f8\u540c\uff0c\u7528\u4e8e\u6307\u5b9a\u8981\u5faa\u73af\u8fed\u4ee3\u7684\u5217\u8868\u6216\u5b57\u5178<br \/>\nwith_dict\uff08\u53ef\u9009\uff09\uff1a\u4e0e loop \u76f8\u540c\uff0c\u7528\u4e8e\u6307\u5b9a\u8981\u5faa\u73af\u8fed\u4ee3\u7684\u5b57\u5178<br \/>\nwhen\uff08\u53ef\u9009\uff09\uff1a\u6307\u5b9a\u4e00\u4e2a\u6761\u4ef6\uff0c\u53ea\u6709\u5f53\u6761\u4ef6\u4e3a\u771f\u65f6\u624d\u4f1a\u6267\u884c\u53d8\u91cf\u5b9a\u4e49\u5757<\/p>\n<p>loop_control\uff08\u53ef\u9009\uff09\uff1a\u7528\u4e8e\u63a7\u5236\u5faa\u73af\u7684\u884c\u4e3a\uff0c\u53ef\u4ee5\u5305\u542b\u4ee5\u4e0b\u53c2\u6570\uff1a<\/p>\n<p>loop_var\uff1a\u6307\u5b9a\u5faa\u73af\u53d8\u91cf\u7684\u540d\u79f0\uff0c\u9ed8\u8ba4\u4e3a item<br \/>\nloop_index\uff1a\u6307\u5b9a\u5faa\u73af\u7d22\u5f15\u7684\u540d\u79f0\uff0c\u9ed8\u8ba4\u4e3a ansible_loop.index<br \/>\nloop_first\uff1a\u6307\u5b9a\u4e00\u4e2a\u53d8\u91cf\u540d\u79f0\uff0c\u7528\u4e8e\u5224\u65ad\u662f\u5426\u662f\u7b2c\u4e00\u6b21\u8fed\u4ee3\uff0c\u9ed8\u4e3a ansible_loop.first<br \/>\nloop_last\uff1a\u6307\u5b9a\u4e00\u4e2a\u53d8\u91cf\u540d\u79f0\uff0c\u7528\u4e8e\u5224\u65ad\u662f\u5426\u662f\u6700\u540e\u4e00\u6b21\u8fed\u4ee3\uff0c\u9ed8\u8ba4\u4e3a ansible_loop.last<br \/>\nloop_length\uff1a\u6307\u5b9a\u4e00\u4e2a\u53d8\u91cf\u540d\u79f0\uff0c\u7528\u4e8e\u83b7\u53d6\u5faa\u73af\u8fed\u4ee3\u7684\u603b\u957f\u5ea6\uff0c\u9ed8\u8ba4\u4e3a ansible_loop.length<\/p>\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u5faa\u73af\u8bed\u53e5\u548c\u00a0<code>vars<\/code>\u00a0\u5173\u952e\u5b57\u7684\u793a\u4f8b\uff0c\u5176\u4e2d\u5305\u542b\u4e86\u4e0a\u8ff0\u53c2\u6570\u7684\u4f7f\u7528\uff1a<\/p>\n<pre>- name: Loop example\r\n  hosts: all\r\n  tasks:\r\n    - name: Define variables\r\n      vars:\r\n        fruit_list:\r\n          - apple\r\n          - banana\r\n          - orange\r\n      loop: \"{{ fruit_list }}\"\r\n      when: inventory_hostname == 'host1'\r\n      loop_control:\r\n        loop_var: my_fruit\r\n        loop_index: my_index\r\n        loop_first: is_first\r\n        loop_last: is_last\r\n        loop_length: total_count\r\n      debug:\r\n        msg: \"Fruit: {{ my_fruit }}, Index: {{ my_index }}, First: {{ is_first }}, Last: {{ is_last }}, Total: {{ total_count }}\"<\/pre>\n<p>\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u00a0vars\u00a0\u5173\u952e\u5b57\u5b9a\u4e49\u4e86\u4e00\u4e2a\u540d\u4e3a\u00a0fruit_list\u00a0\u7684\u53d8\u91cf\uff0c\u7136\u540e\u4f7f\u7528\u00a0loop\u00a0\u53c2\u6570\u6307\u5b9a\u4e86\u8981\u5faa\u73af\u8fed\u4ee3\u7684\u5217\u8868\u3002\u6211\u4eec\u8fd8\u4f7f\u7528\u4e86\u00a0when\u00a0\u53c2\u6570\u6765\u6307\u5b9a\u53ea\u6709\u5728\u00a0inventory_hostname\u00a0\u4e3a &#8216;host1&#8217; \u65f6\u624d\u4f1a\u6267\u884c\u53d8\u91cf\u5b9a\u4e49\u5757\u3002\u4f7f\u7528\u00a0loop_control\u00a0\u53c2\u6570\u6765\u63a7\u5236\u5faa\u73af\u7684\u884c\u4e3a\uff0c\u5305\u62ec\u6307\u5b9a\u5faa\u73af\u53d8\u91cf\u540d\u79f0\u00a0my_fruit\u3001\u5faa\u73af\u7d22\u5f15\u540d\u79f0\u00a0my_index\u3001\u7b2c\u4e00\u6b21\u8fed\u4ee3\u7684\u53d8\u91cf\u540d\u79f0\u00a0is_first\u3001\u6700\u540e\u4e00\u6b21\u8fed\u4ee3\u7684\u53d8\u91cf\u540d\u79f0\u00a0is_last\u00a0\u548c\u5faa\u73af\u8fed\u4ee3\u7684\u603b\u957f\u5ea6\u7684\u53d8\u91cf\u540d\u79f0\u00a0total_count\u3002\u6700\u540e\uff0c\u6211\u4eec\u4f7f\u7528\u00a0debug\u00a0\u6a21\u5757\u6253\u5370\u51fa\u5faa\u73af\u53d8\u91cf\u548c\u63a7\u5236\u53d8\u91cf\u7684\u503c\u3002<\/p>\n<p>\u901a\u8fc7\u4f7f\u7528\u5faa\u73af\u8bed\u53e5\u548c\u00a0vars\u00a0\u5173\u952e\u5b57\u7684\u5b8c\u6574\u53c2\u6570\uff0c\u60a8\u53ef\u4ee5\u66f4\u7075\u6d3b\u5730\u5b9a\u4e49\u548c\u63a7\u5236\u5faa\u73af\u4e2d\u7684\u53d8\u91cf\uff0c\u5e76\u6839\u636e\u9700\u8981\u8fdb\u884c\u6761\u4ef6\u5224\u65ad\u548c\u63a7\u5236\u5faa\u73af\u884c\u4e3a\u3002\u6709\u5173\u66f4\u591a\u8be6\u7ec6\u4fe1\u606f\u548c\u793a\u4f8b\uff0c\u8bf7\u53c2\u9605 Ansible \u5b98\u65b9\u6587\u6863\u4e2d\u7684\u5faa\u73af\u8bed\u53e5\u548c\u53d8\u91cf\u90e8\u5206<\/p>\n<h2><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_loops.html#using-variables-in-loops\">\u5b98\u7f51<\/a><\/h2>\n<h2>\u4f7f\u7528\u5faa\u73af\u542f\u52a8\u591a\u4e2a\u670d\u52a1<\/h2>\n<h4>\u5267\u672c<\/h4>\n<pre>[root@ansible \/server\/playbook]$ cat 13circulate.yml \r\n---\r\n- hosts: web\r\n  tasks:\r\n  - name: restart all\r\n    systemd:\r\n      name: \"{{ item }}\"\r\n      state: restarted\r\n    with_items:\r\n      - nginx\r\n      - php-fpm\r\n      - sshd\r\n      - crond\r\n[root@ansible \/server\/playbook]$ ansible-playbook 13circulate.yml\r\n\r\nPLAY [web] ********************************************************************************************************************\r\n\r\nTASK [Gathering Facts] ********************************************************************************************************\r\nok: [172.16.1.45]\r\nok: [172.16.1.145]\r\n\r\nTASK [restart all] ************************************************************************************************************\r\nchanged: [172.16.1.145] =&gt; (item=nginx)\r\nchanged: [172.16.1.45] =&gt; (item=nginx)\r\nchanged: [172.16.1.145] =&gt; (item=php-fpm)\r\nchanged: [172.16.1.45] =&gt; (item=php-fpm)\r\nchanged: [172.16.1.145] =&gt; (item=sshd)\r\nchanged: [172.16.1.45] =&gt; (item=sshd)\r\nchanged: [172.16.1.145] =&gt; (item=crond)\r\nchanged: [172.16.1.45] =&gt; (item=crond)\r\n\r\nPLAY RECAP ********************************************************************************************************************\r\n172.16.1.145 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 \r\n172.16.1.45 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0<\/pre>\n<p><a href=\"https:\/\/www.qiangzhenshuai.com\/?attachment_id=1204\" rel=\"attachment wp-att-1204\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-1204\" src=\"https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookitems.png?resize=640%2C250&#038;ssl=1\" alt=\"\" width=\"640\" height=\"250\" srcset=\"https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookitems.png?w=1096&amp;ssl=1 1096w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookitems.png?resize=300%2C117&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookitems.png?resize=1024%2C400&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookitems.png?resize=768%2C300&amp;ssl=1 768w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<h2>\u5b9a\u4e49\u53d8\u91cf\u65b9\u5f0f\u5faa\u73af<\/h2>\n<h3>\u4f7f\u7528\u5b9a\u4e49\u53d8\u91cf\u65b9\u5f0f\u5faa\u73af\u5b89\u88c5\u8f6f\u4ef6\u5305\uff08\u90e8\u5206\u547d\u4ee4\u4e0d\u652f\u6301\uff09<\/h3>\n<h4>\u5267\u672c<\/h4>\n<pre>[root@ansible \/server\/playbook]$ cat 14pack.yml \r\n---\r\n- hosts: web\r\n  tasks:\r\n  - name: yum software\r\n    yum:\r\n      name: \"{{ package }}\"\r\n      state: present\r\n    vars:\r\n      package:\r\n        - nginx\r\n        - tree<\/pre>\n<pre>[root@ansible \/server\/playbook]$ ansible-playbook 14pack.yml\r\n\r\nPLAY [web] ********************************************************************************************************************\r\n\r\nTASK [Gathering Facts] ********************************************************************************************************\r\nok: [172.16.1.145]\r\nok: [172.16.1.45]\r\n\r\nTASK [yum software] ***********************************************************************************************************\r\nok: [172.16.1.145]\r\nok: [172.16.1.45]\r\n\r\nPLAY RECAP ********************************************************************************************************************\r\n172.16.1.145 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 \r\n172.16.1.45 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0<\/pre>\n<h2>\u4f7f\u7528\u5b57\u5178\u5faa\u73af\u65b9\u5f0f\u521b\u5efa\u7528\u6237\u548c\u6279\u91cf\u62f7\u8d1d\u6587\u4ef6<\/h2>\n<h3>\u6279\u91cf\u521b\u5efa\u7528\u6237\uff0c\u4f7f\u7528key values\u5b57\u5178\u7684\u65b9\u5f0f<\/h3>\n<h4>\u5267\u672c<\/h4>\n<pre>[root@ansible \/server\/playbook]$ cat 15user.yml \r\n---\r\n- hosts: web\r\n  tasks:\r\n  - name: useradd\r\n    user:\r\n      name: \"{{ item.name }}\"\r\n      uid: \"{{ item.uid }}\"\r\n      state: present\r\n    with_items:\r\n      - { name: 'Demon' , uid: 789 }\r\n      - { name: 'devil' , uid: 891 }\r\n      - { name: 'angel' , uid: 987 }<\/pre>\n<pre>[root@ansible \/server\/playbook]$ ansible-playbook 15user.yml\r\n\r\nPLAY [web] ********************************************************************************************************************\r\n\r\nTASK [Gathering Facts] ********************************************************************************************************\r\nok: [172.16.1.145]\r\nok: [172.16.1.45]\r\n\r\nTASK [useradd] ****************************************************************************************************************\r\nchanged: [172.16.1.145] =&gt; (item={u'name': u'Demon', u'uid': 789})\r\nchanged: [172.16.1.45] =&gt; (item={u'name': u'Demon', u'uid': 789})\r\nchanged: [172.16.1.145] =&gt; (item={u'name': u'devil', u'uid': 891})\r\nchanged: [172.16.1.45] =&gt; (item={u'name': u'devil', u'uid': 891})\r\nchanged: [172.16.1.45] =&gt; (item={u'name': u'angel', u'uid': 987})\r\nchanged: [172.16.1.145] =&gt; (item={u'name': u'angel', u'uid': 987})\r\n\r\nPLAY RECAP ********************************************************************************************************************\r\n172.16.1.145 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 \r\n172.16.1.45 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0<\/pre>\n<pre>[root@ansible \/server\/playbook]$ ansible web -a 'tail -3 \/etc\/passwd'\r\n172.16.1.45 | CHANGED | rc=0 &gt;&gt;\r\nDemon:x:789:1003::\/home\/Demon:\/bin\/bash\r\ndevil:x:891:1004::\/home\/devil:\/bin\/bash\r\nangel:x:987:1005::\/home\/angel:\/bin\/bash\r\n172.16.1.145 | CHANGED | rc=0 &gt;&gt;\r\nDemon:x:789:1003::\/home\/Demon:\/bin\/bash\r\ndevil:x:891:1004::\/home\/devil:\/bin\/bash\r\nangel:x:987:1005::\/home\/angel:\/bin\/bash<\/pre>\n<p><a href=\"https:\/\/www.qiangzhenshuai.com\/?attachment_id=1209\" rel=\"attachment wp-att-1209\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-1209\" src=\"https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookuseradd.png?resize=640%2C348&#038;ssl=1\" alt=\"\" width=\"640\" height=\"348\" srcset=\"https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookuseradd.png?w=1140&amp;ssl=1 1140w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookuseradd.png?resize=300%2C163&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookuseradd.png?resize=1024%2C556&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.qiangzhenshuai.com\/wp-content\/uploads\/2023\/08\/ansibleplaybookuseradd.png?resize=768%2C417&amp;ssl=1 768w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1.Ansible Task\u63a7\u5236\u6982\u8ff0 \u5728Ansible\u4e2d\uff0c\u4efb\u52a1\u63a7\u5236\u6307\u7684\u662f\u901a\u8fc7\u4e00\u4e9b\u9009\u9879\u6765\u63a7\u5236\u4efb\u52a1\u7684\u884c\u4e3a\u3002\u4ee5\u4e0b\u662f\u4e00 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":""},"categories":[24],"tags":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.qiangzhenshuai.com\/index.php?rest_route=\/wp\/v2\/posts\/1193"}],"collection":[{"href":"https:\/\/www.qiangzhenshuai.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.qiangzhenshuai.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.qiangzhenshuai.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.qiangzhenshuai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1193"}],"version-history":[{"count":7,"href":"https:\/\/www.qiangzhenshuai.com\/index.php?rest_route=\/wp\/v2\/posts\/1193\/revisions"}],"predecessor-version":[{"id":1211,"href":"https:\/\/www.qiangzhenshuai.com\/index.php?rest_route=\/wp\/v2\/posts\/1193\/revisions\/1211"}],"wp:attachment":[{"href":"https:\/\/www.qiangzhenshuai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.qiangzhenshuai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.qiangzhenshuai.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}