{"id":9836,"date":"2024-04-05T12:25:35","date_gmt":"2024-04-05T04:25:35","guid":{"rendered":"https:\/\/egonlin.com\/?p=9836"},"modified":"2024-07-17T18:14:00","modified_gmt":"2024-07-17T10:14:00","slug":"ansible%e7%9a%84%e6%9d%a1%e4%bb%b6%e5%88%a4%e6%96%ad%e8%b4%9f%e8%bd%bd%e7%94%a8%e6%b3%95","status":"publish","type":"post","link":"https:\/\/egonlin.com\/?p=9836","title":{"rendered":"ansible\u7684\u6761\u4ef6\u5224\u65ad\u590d\u6742\u7528\u6cd5"},"content":{"rendered":"<h1>\u4e00\u3001\u6761\u4ef6\u5224\u65ad\u4e0etests<\/h1>\n<p>\u5728shell\u5f53\u4e2d\uff0c\u6211\u4eec\u53ef\u4f7f\u7528test\u547d\u4ee4\u6765\u8fdb\u884c\u4e00\u4e9b\u5e38\u7528\u7684\u5224\u65ad\u64cd\u4f5c\uff0c\u5982\u4e0b\uff1a<\/p>\n<pre><code># \u5224\u65ad\/test\u6587\u4ef6\u662f\u5426\u5b58\u5728\r\ntest -e \/test\r\n\r\n# \u5224\u65ad\/testdir\u662f\u5426\u5b58\u5728\u4e14\u4e3a\u4e00\u4e2a\u76ee\u5f55\r\ntest -d \/testdir<\/code><\/pre>\n<p>\u4e8b\u5b9e\u4e0a\uff0c\u5728ansible\u4e2d\u4e5f\u6709\u7c7b\u4f3c\u7684\u7528\u6cd5\uff0c\u53ea\u4e0d\u8fc7ansible\u6ca1\u6709\u4f7f\u7528linux\u7684test\u547d\u4ee4\uff0c\u800c\u662fjinja2\u6a21\u677f\u7684tests\u3002<\/p>\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u7b80\u5355\u793a\u4f8b\uff1a<\/p>\n<pre><code># \u901a\u8fc7\u6761\u4ef6\u8bed\u53e5\u5224\u65adtestpath\u7684\u8def\u5f84\u662f\u5426\u5b58\u5728\r\n- hosts: test\r\n  vars:\r\n    testpath: \/testdir\r\n  tasks:\r\n    - debug:\r\n        msg: \"file exist\"\r\n      when: testpath is exists<\/code><\/pre>\n<p>\u4e0a\u9762\u7684\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86is exists\u7528\u4e8e\u8def\u5f84\u5b58\u5728\u65f6\u8fd4\u56de\u771f\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528is not exists\u7528\u4e8e\u8def\u5f84\u4e0d\u5b58\u5728\u65f6\u8fd4\u56de\u771f\u3002\u4e5f\u53ef\u4ee5\u5728\u6574\u4e2a\u6761\u4ef6\u8868\u8fbe\u5f0f\u7684\u524d\u9762\u4f7f\u7528not\u4ee5\u53d6\u53cd\uff1a<\/p>\n<pre><code>- hosts: test\r\n  vars:\r\n    testpath: \/testdir1\r\n  tasks:\r\n    - debug:\r\n        msg: \"file not exist\"\r\n      when: not testpath is exists\r\n<\/code><\/pre>\n<p>\u5728ansible\u4e2d\uff0c\u9664\u4e86\u80fd\u591f\u4f7f\u7528exists\u8fd9\u79cdtests\u4e4b\u5916\uff0c\u8fd8\u6709\u4e00\u4e9b\u522b\u7684tests\u3002\u63a5\u4e0b\u6765\u6211\u4eec\u8be6\u7ec6\u8bf4\u4e00\u8bf4\u3002<\/p>\n<h2>1.1 \u5224\u65ad\u53d8\u91cf<\/h2>\n<ul>\n<li>defined\uff1a\u5224\u65ad\u53d8\u91cf\u662f\u5426\u5df2\u5b9a\u4e49\uff0c\u5df2\u5b9a\u4e49\u5219\u8fd4\u56de\u771f<\/li>\n<li>undefined\uff1a\u5224\u65ad\u53d8\u91cf\u662f\u5426\u672a\u5b9a\u4e49\uff0c\u672a\u5b9a\u4e49\u5219\u8fd4\u56de\u771f<\/li>\n<li>none\uff1a\u5224\u65ad\u53d8\u91cf\u7684\u503c\u662f\u5426\u4e3a\u7a7a\uff0c\u5982\u679c\u53d8\u91cf\u5df2\u5b9a\u4e49\u4e14\u503c\u4e3a\u7a7a\uff0c\u5219\u8fd4\u56de\u771f<\/li>\n<\/ul>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code>- hosts: test\r\n  gather_facts: no\r\n  vars:\r\n    testvar: \"test\"\r\n    testvar1:\r\n  tasks:\r\n    - debug:\r\n        msg: \"testvar is defined\"\r\n      when: testvar is defined\r\n    - debug:\r\n        msg: \"testvar2 is undefined\"\r\n      when: testvar2 is undefined\r\n    - debug:\r\n        msg: \"testvar1 is none\"\r\n      when: testvar1 is none\r\n<\/code><\/pre>\n<h2>1.2 \u5224\u65ad\u6267\u884c\u7ed3\u679c<\/h2>\n<ul>\n<li>sucess\u6216succeeded\uff1a\u901a\u8fc7\u4efb\u52a1\u6267\u884c\u7ed3\u679c\u8fd4\u56de\u7684\u4fe1\u606f\u5224\u65ad\u4efb\u52a1\u7684\u6267\u884c\u72b6\u6001\uff0c\u4efb\u52a1\u6267\u884c\u6210\u529f\u5219\u8fd4\u56detrue<\/li>\n<li>failure\u6216failed\uff1a\u4efb\u52a1\u6267\u884c\u5931\u8d25\u5219\u8fd4\u56detrue<\/li>\n<li>change\u6216changed\uff1a\u4efb\u52a1\u6267\u884c\u72b6\u6001\u4e3achanged\u5219\u8fd4\u56detrue<\/li>\n<li>skip\u6216skipped\uff1a\u4efb\u52a1\u88ab\u8df3\u8fc7\u5219\u8fd4\u56detrue<\/li>\n<\/ul>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code>- hosts: test\r\n  gather_facts: no\r\n  vars:\r\n    doshell: true\r\n  tasks:\r\n    - shell: 'cat \/testdir\/aaa'\r\n      when: doshell\r\n      register: result\r\n      ignore_errors: true\r\n    - debug:\r\n        msg: \"success\"\r\n      when: result is success\r\n\r\n    - debug:\r\n        msg: \"failed\"\r\n      when: result is failure\r\n\r\n    - debug:\r\n        msg: \"changed\"\r\n      when: result is change\r\n\r\n    - debug:\r\n        msg: \"skip\"\r\n      when: result is skip\r\n<\/code><\/pre>\n<h2>1.3 \u5224\u65ad\u8def\u5f84<\/h2>\n<ul>\n<li>file\uff1a\u5224\u65ad\u6307\u5b9a\u8def\u5f84\u662f\u5426\u4e3a\u4e00\u4e2a\u6587\u4ef6\uff0c\u662f\u5219\u4e3a\u771f<\/li>\n<li>directory\uff1a\u5224\u65ad\u6307\u5b9a\u8def\u5f84\u662f\u5426\u4e3a\u4e00\u4e2a\u76ee\u5f55\uff0c\u662f\u5219\u4e3a\u771f<\/li>\n<li>link\uff1a\u5224\u65ad\u6307\u5b9a\u8def\u5f84\u662f\u5426\u4e3a\u4e00\u4e2a\u8f6f\u94fe\u63a5\uff0c\u662f\u5219\u4e3a\u771f<\/li>\n<li>mount\uff1a\u5224\u65ad\u6307\u5b9a\u8def\u5f84\u662f\u5426\u4e3a\u4e00\u4e2a\u6302\u8f7d\u70b9\uff0c\u662f\u5219\u4e3a\u771f<\/li>\n<li>exists\uff1a\u5224\u65ad\u6307\u5b9a\u8def\u5f84\u662f\u5426\u5b58\u5728\uff0c\u5b58\u5728\u5219\u4e3a\u771f<\/li>\n<\/ul>\n<p><span style=\"background-color: #ff0000;\">\u7279\u522b\u6ce8\u610f\uff1a\u5173\u4e8e\u8def\u5f84\u7684\u6240\u6709\u5224\u65ad\u5747\u662f\u5224\u65ad\u4e3b\u63a7\u7aef\u4e0a\u7684\u8def\u5f84\uff0c\u800c\u975e\u88ab\u63a7\u7aef\u4e0a\u7684\u8def\u5f84<\/span><\/p>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code>- hosts: web01\r\n  gather_facts: no\r\n  vars:\r\n    testpath1: \"\/testdir\/test\"\r\n    yyy: \"\/testdir\"\r\n  tasks:\r\n    - debug:\r\n        msg: \"file\"\r\n      when: testpath1 is file\r\n    - debug:\r\n        msg: \"directory\"\r\n      when: yyy is directory\r\n<\/code><\/pre>\n<h2>1.4 \u5224\u65ad\u5b57\u7b26\u4e32<\/h2>\n<ul>\n<li>lower\uff1a\u5224\u65ad\u5b57\u7b26\u4e32\u4e2d\u7684\u6240\u6709\u5b57\u6bcd\u662f\u5426\u90fd\u662f\u5c0f\u5199\uff0c\u662f\u5219\u4e3a\u771f<\/li>\n<li>upper\uff1a\u5224\u65ad\u5b57\u7b26\u4e32\u4e2d\u7684\u6240\u6709\u5b57\u6bcd\u662f\u5426\u90fd\u662f\u5927\u5199\uff0c\u662f\u5219\u4e3a\u771f<\/li>\n<\/ul>\n<pre><code>- hosts: test\r\n  gather_facts: no\r\n  vars: \r\n    str1: \"abc\"\r\n    str2: \"ABC\"\r\n  tasks:\r\n    - debug:\r\n        msg: \"str1 is all lowercase\"\r\n      when: str1 is lower\r\n    - debug:\r\n        msg: \"str2 is all uppercase\"\r\n      when: str2 is upper\r\n<\/code><\/pre>\n<h2>1.5 \u5224\u65ad\u6574\u9664<\/h2>\n<ul>\n<li>even\uff1a\u5224\u65ad\u6570\u503c\u662f\u5426\u4e3a\u5076\u6570\uff0c\u662f\u5219\u4e3a\u771f<\/li>\n<li>odd\uff1a\u5224\u65ad\u6570\u503c\u662f\u5426\u4e3a\u5947\u6570\uff0c\u662f\u5219\u4e3a\u771f<\/li>\n<li>divisibleby(num)\uff1a\u5224\u65ad\u662f\u5426\u53ef\u4ee5\u6574\u9664\u6307\u5b9a\u7684\u6570\u503c\uff0c\u662f\u5219\u4e3a\u771f<\/li>\n<\/ul>\n<p>\u793a\u4f8b\uff1a<\/p>\n<pre><code>- hosts: test\r\n  gather_facts: no\r\n  vars: \r\n    num1: 6\r\n    num2: 8 \r\n    num3: 15\r\n  tasks:\r\n    - debug: \r\n        msg: \"num1 is an even number\"\r\n      when: num1 is even\r\n    - debug:\r\n        msg: \"num2 is an odd number\"\r\n      when: num2 is odd\r\n    - debug:\r\n        msg: \"num3 can be divided exactly by\"\r\n      when: num3 is divisibleby(3)\r\n<\/code><\/pre>\n<h2>1.6 \u5176\u4ed6tests<\/h2>\n<p>1\u3001version<\/p>\n<pre><code># \u53ef\u7528\u4e8e\u5bf9\u6bd4\u4e24\u4e2a\u7248\u672c\u53f7\u7684\u5927\u5c0f\uff0c\u6216\u8005\u4e0e\u6307\u5b9a\u7684\u7248\u672c\u53f7\u8fdb\u884c\u5bf9\u6bd4\uff0c\r\n# \u4f7f\u7528\u8bed\u6cd5\u4e3aversion(\"\u7248\u672c\u53f7\",\"\u6bd4\u8f83\u64cd\u4f5c\u7b26\")\r\n- hosts: test\r\n  vars:\r\n    ver1: 1.2\r\n    ver2: 1.3\r\n  tasks:\r\n    - debug:\r\n        msg: \"ver1 is greater than ver2\"\r\n      when: ver1 is version(ver2,\"&gt;\")\r\n    - debug:\r\n        msg: \"system version {{ ansible_distribution_version }} greater than 7.3\"\r\n      when: ansible_distribution_version is version(\"7.3\",\"gt\")\r\n<\/code><\/pre>\n<pre class=\"code\">ver1 is version(ver2,\"&gt;\") \u4f7f\u7528\u4e86 version \u6d4b\u8bd5\u63d2\u4ef6\u6765\u6bd4\u8f83 ver1 \u548c ver2\uff0c\u5e76\u4e14\u53ea\u6709\u5728 ver1 \u5927\u4e8e ver2 \u65f6\u624d\u4f1a\u8f93\u51fa msg \u4fe1\u606f\u3002\u6839\u636e\u5b9a\u4e49\u7684\u53d8\u91cf\u503c\uff0cver1 \u662f 1.2\uff0cver2 \u662f 1.3\uff0c\u6240\u4ee5\u8fd9\u4e2a\u6761\u4ef6\u4e3a\u5047\uff0c\u4e0d\u4f1a\u8f93\u51fa\u8c03\u8bd5\u4fe1\u606f\r\n<\/pre>\n<p>version\u4e2d\u4f7f\u7528\u7684\u6bd4\u8f83\u8fd0\u7b97\u7b26\u8bf4\u660e\uff1a<\/p>\n<ul>\n<li>\u5927\u4e8e\uff1a &gt;, gt<\/li>\n<li>\u5927\u4e8e\u7b49\u4e8e\uff1a &gt;=, ge<\/li>\n<li>\u5c0f\u4e8e\uff1a &lt;, lt<\/li>\n<li>\u5c0f\u4e8e\u7b49\u4e8e\uff1a &lt;=, le<\/li>\n<li>\u7b49\u4e8e\uff1a =, ==, eq<\/li>\n<li>\u4e0d\u7b49\u4e8e\uff1a !=, &lt;&gt;, ne<\/li>\n<\/ul>\n<p>2\u3001subset \u5224\u65ad\u4e00\u4e2alist\u662f\u4e0d\u662f\u53e6\u4e00\u4e2alist\u7684\u5b50\u96c6<\/p>\n<p>3\u3001superset \u5224\u65ad\u4e00\u4e2alist\u662f\u4e0d\u662f\u53e6\u4e00\u4e2alist\u7684\u7236\u96c6&#8221;<\/p>\n<pre><code>- hosts: test\r\n  gather_facts: no\r\n  vars:\r\n    a:\r\n      - 2\r\n      - 5\r\n    b: [1,2,3,4,5]\r\n  tasks:\r\n    - debug:\r\n        msg: \"A is a subset of B\"\r\n      when: a is subset(b)\r\n    - debug:\r\n        msg: \"B is the parent set of A\"\r\n      when: b is superset(a)\r\n<\/code><\/pre>\n<p>4\u3001in \u5224\u65ad\u4e00\u4e2a\u5b57\u7b26\u4e32\u662f\u5426\u5b58\u5728\u4e8e\u53e6\u4e00\u4e2a\u5b57\u7b26\u4e32\u4e2d\uff0c\u4e5f\u53ef\u7528\u4e8e\u5224\u65ad\u67d0\u4e2a\u7279\u5b9a\u7684\u503c\u662f\u5426\u5b58\u5728\u4e8e\u5217\u8868\u4e2d<\/p>\n<pre><code>- hosts: test\r\n  vars:\r\n    supported_distros:\r\n      - RedHat\r\n      - CentOS\r\n  tasks:\r\n    - debug:\r\n        msg: \"{{ ansible_distribution }} in supported_distros\"\r\n      when: ansible_distribution in supported_distros\r\n<\/code><\/pre>\n<p>5\u3001string \u5224\u65ad\u5bf9\u8c61\u662f\u5426\u4e3a\u4e00\u4e2a\u5b57\u7b26\u4e32\uff0c\u662f\u5219\u4e3a\u771f<\/p>\n<p>6\u3001number \u5224\u65ad\u5bf9\u8c61\u662f\u5426\u4e3a\u4e00\u4e2a\u6570\u5b57\uff0c\u662f\u5219\u4e3a\u771f<\/p>\n<pre><code>- hosts: test\r\n  gather_facts: no\r\n  vars:\r\n    var1: 1\r\n    var2: \"1\"\r\n    var3: a\r\n  tasks:\r\n    - debug:\r\n        msg: \"var1 is a number\"\r\n      when: var1 is number\r\n    - debug:\r\n        msg: \"var2 is a string\"\r\n      when: var2 is string\r\n    - debug:\r\n        msg: \"var3 is a string\"\r\n      when: var3 is string\r\n<\/code><\/pre>\n<h1>\u4e8c\u3001\u6761\u4ef6\u5224\u65ad\u4e0eblock<\/h1>\n<h2>2.1 block<\/h2>\n<p><span style=\"background-color: #ff0000;\">\u5f53\u6211\u4eec\u8981\u4f7f\u7528\u540c\u4e00\u4e2a\u6761\u4ef6\u5224\u65ad\u6267\u884c\u591a\u4e2a\u4efb\u52a1\u7684\u65f6\u5019\uff0c\u91c7\u7528\u4e4b\u524d\u7684\u65b9\u6cd5\uff0c\u610f\u5473\u7740\u6211\u4eec\u8981\u5728\u6bcf\u4e00\u4e2a\u4efb\u52a1\u4e0b\u9762\u90fd\u5199\u4e00\u4e0b\u8fd9\u6761\u91cd\u590d\u7684when\u8bed\u53e5<\/span><\/p>\n<p>Ansible\u63d0\u4f9b\u4e86\u4e00\u79cd\u66f4\u597d\u7684\u65b9\u5f0f\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u5373block\u3002\u5728ansible\u4e2d\uff0c\u4f7f\u7528block\u5c06\u591a\u4e2a\u4efb\u52a1\u8fdb\u884c\u7ec4\u5408\uff0c\u5f53\u4f5c\u4e00\u4e2a\u6574\u4f53\u3002\u6211\u4eec\u53ef\u4ee5\u5bf9\u8fd9\u4e00\u4e2a\u6574\u4f53\u505a\u6761\u4ef6\u5224\u65ad\uff0c\u5f53\u6761\u4ef6\u6210\u7acb\u65f6\uff0c\u5219\u6267\u884c\u5757\u4e2d\u7684\u6240\u6709\u4efb\u52a1\uff1a<\/p>\n<pre><code>- hosts: test\r\n  tasks:\r\n    - debug:\r\n        msg: \"task1 not in block\"\r\n<span style=\"background-color: #ff0000;\">    - block:\r\n        - debug:\r\n            msg: \"task2 in block1\"\r\n        - debug:\r\n            msg: \"task3 in block1\"\r\n      when: 2 &gt; 1\r\n<\/span><\/code><\/pre>\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u7a0d\u5fae\u6709\u7528\u70b9\u513f\u7684\u4f8b\u5b50\uff1a<\/p>\n<pre><code>- hosts: test\r\n  tasks:\r\n    # \u4efb\u52a11\r\n    - name: set \/etc\/resolv.conf\r\n      template: \r\n        src: resolv.conf.j2 \r\n        dest: \/etc\/resolv.conf \r\n        owner: root \r\n        group: root \r\n        mode: 0644\r\n    # \u4efb\u52a12\r\n    - block:\r\n        - name: ensure \/etc\/resolvconf\/resolv.conf.d\/base file for ubuntu 16.04\r\n          template: \r\n            src: resolv.conf.j2\r\n            dest: \/etc\/resolvconf\/resolv.conf.d\/base\r\n\r\n        - name: config dns for ubuntu 16.04\r\n          template: \r\n            src: resolv.conf.j2\r\n            dest: \/etc\/resolv.conf\r\n      when: ansible_distribution == \"Ubuntu\" and ansible_distribution_major_version == \"16\" \r\n<\/code><\/pre>\n<p>\u4f7f\u7528block\u6ce8\u610f\u4e8b\u9879\uff1a<br \/>\n1\u3001\u53ef\u4ee5\u76f4\u63a5\u5bf9block\u4f7f\u7528when\uff0c\u4f46\u4e0d\u80fd\u76f4\u63a5\u5bf9block\u4f7f\u7528loop<\/p>\n<h2>2.2 rescue<\/h2>\n<p>block\u9664\u4e86\u80fd\u548cwhen\u4e00\u8d77\u4f7f\u7528\u4e4b\u5916\uff0c\u8fd8\u80fd\u4f5c\u9519\u8bef\u5904\u7406\u3002\u8fd9\u4e2a\u65f6\u5019\u5c31\u9700\u8981\u7528\u5230rescue\u5173\u952e\u5b57\uff1a<\/p>\n<pre><code>- hosts: test\r\n  tasks:\r\n    - block:\r\n        - shell: 'ls \/testdir'\r\n      rescue:\r\n        - debug:\r\n            msg: '\/testdir is not exists'\r\n\r\n    - name: \u540e\u7eed\u7684\u4efb\u52a1\r\n      debug:\r\n        msg: \"\u53ef\u4ee5\u6b63\u5e38\u6267\u884c\"\r\n<\/code><\/pre>\n<p>\u5728\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c<\/p>\n<p>1\u3001\u5f53block\u4e2d\u7684\u4efb\u52a1\u6267\u884c\u5931\u8d25\u65f6\uff0c\u5219\u8fd0\u884crescue\u4e2d\u7684\u4efb\u52a1\u3002<\/p>\n<p>2\u3001\u5982\u679cblock\u4e2d\u7684\u4efb\u52a1\u6b63\u5e38\u6267\u884c\uff0c\u5219rescue\u7684\u4efb\u52a1\u5c31\u4e0d\u4f1a\u88ab\u6267\u884c\u30023\u3001\u5982\u679cblock\u4e2d\u6709\u591a\u4e2a\u4efb\u52a1\uff0c\u5219\u4efb\u4f55\u4e00\u4e2a\u4efb\u52a1\u6267\u884c\u5931\u8d25\uff0c\u90fd\u4f1a\u6267\u884crescue\u3002<\/p>\n<p>4\u3001block\u4e2d\u53ef\u4ee5\u5b9a\u4e49\u591a\u4e2a\u4efb\u52a1\uff0c\u540c\u6837rescue\u5f53\u4e2d\u4e5f\u53ef\u4ee5\u5b9a\u4e49\u591a\u4e2a\u4efb\u52a1\u3002<\/p>\n<h2>2.3 always<\/h2>\n<p>\u53ea\u6709\u5728block\u6267\u884c\u5931\u8d25\u65f6\uff0crescue\u4e2d\u7684\u4efb\u52a1\u624d\u4f1a\u88ab\u6267\u884c\uff1b<\/p>\n<p>\u800c\u65e0\u8bbablock\u6267\u884c\u6210\u529f\u8fd8\u662f\u5931\u8d25\uff0calways\u4e2d\u7684\u4efb\u52a1\u90fd\u4f1a\u88ab\u6267\u884c\uff1a<\/p>\n<pre><code>- hosts: test\r\n  tasks:\r\n    - block:\r\n        - shell: 'ls \/testdir'\r\n      rescue:\r\n        - debug:\r\n            msg: '\/testdir is not exists'\r\n      always:\r\n        - debug:\r\n            msg: 'This task always executes'\r\n<\/code><\/pre>\n<h1>\u4e09\u3001\u6761\u4ef6\u5224\u65ad\u4e0e\u9519\u8bef\u5904\u7406<\/h1>\n<p>\u5728\u4e0a\u9762\u8bb2block\u7684\u4f7f\u7528\u65b9\u6cd5\u7684\u65f6\u5019\uff0c\u6211\u4eec\u8bf4block\u9664\u4e86\u53ef\u4ee5\u5c06\u591a\u4e2a\u4efb\u52a1\u7ec4\u5408\u5230\u4e00\u8d77\uff0c\u8fd8\u6709\u9519\u8bef\u5904\u7406\u7684\u529f\u80fd\u3002\u63a5\u4e0b\u6765\u6211\u4eec\u7ee7\u7eed\u8bf4\u4e00\u8bf4\u9519\u8bef\u5904\u7406\u3002<\/p>\n<h2>3.1 fail\u6a21\u5757<\/h2>\n<p>\u5728shell\u4e2d\uff0c\u53ef\u80fd\u4f1a\u6709\u8fd9\u6837\u7684\u9700\u6c42\uff1a\u5f53\u811a\u672c\u6267\u884c\u81f3\u67d0\u4e2a\u9636\u6bb5\u65f6\uff0c\u9700\u8981\u5bf9\u67d0\u4e2a\u6761\u4ef6\u8fdb\u884c\u5224\u65ad\uff0c\u5982\u679c\u6761\u4ef6\u6210\u7acb\uff0c\u5219\u7acb\u5373\u7ec8\u6b62\u811a\u672c\u7684\u8fd0\u884c\u3002\u5728shell\u4e2d\uff0c\u53ef\u4ee5\u76f4\u63a5\u8c03\u7528&#8221;exit&#8221;\u5373\u53ef\u6267\u884c\u9000\u51fa\u3002<\/p>\n<p>\u4e8b\u5b9e\u4e0a\uff0c\u5728playbook\u4e2d\u4e5f\u6709\u7c7b\u4f3c\u7684\u6a21\u5757\u53ef\u4ee5\u505a\u8fd9\u4ef6\u4e8b\u3002\u5373fail\u6a21\u5757\u3002<span style=\"background-color: #ff0000;\">Ansible \u7684 fail \u6a21\u5757\u53ef\u4ee5\u5728\u7279\u5b9a\u6761\u4ef6\u4e0b\u505c\u6b62\u5728\u67d0\u4e2a\u4e3b\u673a\u4e0a\u7684\u6267\u884c\uff0c\u5e76\u7ee7\u7eed\u5728\u5176\u5b83\u4e3b\u673a\u4e0a\u6267\u884c\uff08\u5373\u67d0\u4e2a\u4e3b\u673a\u5728\u6ee1\u8db3\u6761\u4ef6\u65f6\u89e6\u53d1\u4e86fail\uff0c\u5219\u8be5\u4e3b\u673a\u5c06\u4e0d\u518d\u53c2\u4e0e\u540e\u7eed\u7684task\u4efb\u52a1\u7684\u6267\u884c\uff09<\/span>\u3002\u901a\u5e38\u4e0e\u6761\u4ef6\u8bed\u53e5\u7ec4\u5408\u4f7f\u7528\uff0c\u5f53\u6ee1\u8db3\u6761\u4ef6\u65f6\uff0c\u7ec8\u6b62\u5f53\u524dplay\u7684\u8fd0\u884c\u3002fail\u7684\u9009\u9879\u53ea\u6709\u4e00\u4e2a\uff1a<\/p>\n<ul>\n<li>msg\uff1a\u7ec8\u6b62\u524d\u6253\u5370\u51fa\u4fe1\u606f<\/li>\n<\/ul>\n<p>\u793a\u4f8b<\/p>\n<pre><code># \u4f7f\u7528fail\u6a21\u5757\u4e2d\u65adplaybook\u8f93\u51fa\r\n- hosts: web_group\r\n  tasks:\r\n    - name: \u4efb\u52a11\r\n      debug:\r\n        msg: \u7b2c\u4e00\u4e2a\u4efb\u52a1\u6267\u884c\r\n\r\n    - fail:\r\n        msg: \"\u4e0b\u9762\u7684when\u5224\u65ad\u6ee1\u8db3\uff0c\u5219\u4f1a\u7ec8\u6b62\u5f53\u524d\u4e3b\u673a\u6240\u6709\u540e\u7eedtask\u7684\u6267\u884c\"\r\n      # web01\u4e3b\u673a\u4f1a\u6ee1\u8db3\u4e0b\u9762\u7684\u6761\u4ef6\uff0cweb02\u4e3b\u673a\u4e0d\u6ee1\u8db3\u4e8e\u662f\u4f1askip\u8df3\u8fc7\r\n      when: \"'web01' in ansible_fqdn\"  \r\n      #ignore_errors: True\r\n\r\n    - name: \u540e\u7eed\u7684\u4efb\u52a1\r\n      debug:\r\n        msg: \"web01\u4e0d\u4f1a\u6267\u884c\u8be5task\uff0cweb02\u4f1a\u6b63\u5e38\u6267\u884c\u8be5\u4efb\u52a1\"\r\n\r\n\r\n\u6267\u884c\u8f93\u51fa\u7ed3\u679c\u5982\u4e0b\uff08\u6211\u4eec\u7684\u4e3b\u673a\u6e05\u5355web_group\u7ec4\u91cc\u6709web01\u4e0eweb02\u4e24\u53f0\u673a\u5668\uff09\r\n[root@m01 ~]# ansible-playbook test.yaml \r\n\r\nPLAY [web_group] ****************************************************************************************\r\n\r\nTASK [Gathering Facts] **********************************************************************************\r\n\r\n\r\n\r\nok: [web01]\r\nok: [web02]\r\n\r\nTASK [\u4efb\u52a11] **********************************************************************************************\r\nok: [web01] =&gt; {\r\n    \"msg\": \"\u7b2c\u4e00\u4e2a\u4efb\u52a1\u6267\u884c\"\r\n}\r\nok: [web02] =&gt; {\r\n    \"msg\": \"\u7b2c\u4e00\u4e2a\u4efb\u52a1\u6267\u884c\"\r\n}\r\n\r\nTASK [fail] *********************************************************************************************\r\nfatal: [web01]: FAILED! =&gt; {\"changed\": false, \"msg\": \"\u4e0b\u9762\u7684when\u5224\u65ad\u6ee1\u8db3\uff0c\u5219\u4f1a\u7ec8\u6b62\u6574\u4e2aplaybook\u7684\u6267\u884c\"}\r\nskipping: [web02]\r\n\r\nTASK [\u540e\u7eed\u7684\u4efb\u52a1] ********************************************************************************************\r\nok: [web02] =&gt; {\r\n    \"msg\": \"web01\u4e0d\u4f1a\u6267\u884c\u8be5task\uff0cweb02\u4f1a\u6b63\u5e38\u6267\u884c\u8be5\u4efb\u52a1\"\r\n}\r\n\r\nPLAY RECAP **********************************************************************************************\r\nweb01                      : ok=2    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   \r\nweb02                      : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   \r\n\r\n\r\n\r\n<\/code><\/pre>\n<h2>3.2 failed_when<\/h2>\n<p>\u4e8b\u5b9e\u4e0a\uff0c\u5f53fail\u548cwhen\u7ec4\u5408\u4f7f\u7528\u7684\u65f6\u5019\uff0c\u8fd8\u6709\u4e00\u4e2a\u66f4\u7b80\u5355\u7684\u5199\u6cd5\uff0c\u5373failed_when\uff0c\u5f53\u6ee1\u8db3\u67d0\u4e2a\u6761\u4ef6\u65f6\uff0cansible\u4e3b\u52a8\u89e6\u53d1\u5931\u8d25\u3002<\/p>\n<pre><code># \u5982\u679c\u5728command_result\u5b58\u5728\u9519\u8bef\u8f93\u51fa\uff0c\u4e14\u9519\u8bef\u8f93\u51fa\u4e2d\uff0c\u5305\u542b\u4e86`FAILED`\u5b57\u4e32\uff0c\u5373\u8fd4\u56de\u5931\u8d25\u72b6\u6001\uff1a\r\n- name: this command prints FAILED when it fails\r\n  command: \/usr\/bin\/example-command -x -y -z\r\n  register: command_result\r\n  failed_when: \"'FAILED' in command_result.stderr\"\r\n<\/code><\/pre>\n<p>\u4e5f\u53ef\u4ee5\u628afail\u4e0e\u5176msg\u5199\u5728\u4e00\u884c\uff0c\u5982\u4e0b\uff1a<\/p>\n<pre><code>\r\n- hosts: web_group\r\n  tasks:\r\n    - name: \u4efb\u52a11\r\n      debug:\r\n        msg: \u7b2c\u4e00\u4e2a\u4efb\u52a1\u6267\u884c\r\n\r\n    - fail: msg=\"\u4e0b\u9762\u7684when\u5224\u65ad\u6ee1\u8db3\uff0c\u5219\u4f1a\u7ec8\u6b62\u6574\u4e2aplaybook\u7684\u6267\u884c\"\r\n      when: \"'web01' in ansible_fqdn\"\r\n      #ignore_errors: True\r\n\r\n    - name: \u540e\u7eed\u7684\u4efb\u52a1\r\n      debug:\r\n        msg: \"web01\u4e0d\u4f1a\u6267\u884c\u8be5task\uff0cweb02\u4f1a\u6b63\u5e38\u6267\u884c\u8be5\u4efb\u52a1\"\r\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h2>3.3 changed_when<\/h2>\n<p>\u4e00\u4e2a\u4efb\u52a1\u6267\u884c\u6709\u4e09\u79cd\u72b6\u6001<\/p>\n<p>1\u3001\u5f53\u4efb\u52a1\u5728\u8fdc\u7a0b\u4e3b\u673a\u4e0a\u6210\u529f\u6267\u884c\uff0c\u72b6\u6001\u53d1\u751f\u66f4\u6539\u65f6\uff0c\u4f1a\u8fd4\u56dechanged\u72b6\u6001\u54cd\u5e94<\/p>\n<p>2\u3001\u72b6\u6001\u672a\u53d1\u751f\u66f4\u6539\u65f6\uff0c\u4f1a\u8fd4\u56deOK\u72b6\u6001\u54cd\u5e94<\/p>\n<p>3\u3001\u5f53\u4efb\u52a1\u88ab\u8df3\u8fc7\u65f6\uff0c\u4f1a\u8fd4\u56deskipped\u72b6\u6001\u54cd\u5e94<\/p>\n<p>&nbsp;<\/p>\n<p>\u9488\u5bf9changed\u72b6\u6001\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7changed_when\u6765\u624b\u52a8\u66f4\u6539\u3002\u793a\u4f8b\u5982\u4e0b\uff1a<\/p>\n<pre><code>- shell: \/usr\/bin\/billybass --mode=\"take me to the river\"\r\nregister: bass_result\r\nchanged_when: \"bass_result.rc != 2\"    #\u53ea\u6709\u8be5\u6761task\u6267\u884c\u4ee5\u540e\uff0cbass_result.rc\u7684\u503c\u4e0d\u4e3a2\u65f6\uff0c\u624d\u4f1a\u8fd4\u56dechanged\u72b6\u6001\r\n\r\n# this will never report 'changed' status\r\n- shell: wall 'beep'\r\n  changed_when: False    #\u8be5\u6761task\u5728\u6267\u884c\u4ee5\u540e\uff0c\u6c38\u8fdc\u4e0d\u4f1a\u8fd4\u56dechanged\u72b6\u6001\r\n<\/code><\/pre>\n<h2>3.4 \u65ad\u8a00\uff1aassert\u6a21\u5757<\/h2>\n<p>\u5bf9\u4e8e\u5f53\u6ee1\u8db3\u67d0\u67d0\u6761\u4ef6\u65f6\u5c31\u5931\u8d25\u7684\u903b\u8f91\uff0c\u53ef\u4ee5\u4f7f\u7528fail\u6a21\u5757\u52a0when\u6307\u4ee4\u6765\u5b9e\u73b0\uff0c\u4e5f\u53ef\u4f7f\u7528\u66f4\u4e3a\u76f4\u63a5\u7684assert\u6a21\u5757\u8fdb\u884c\u65ad\u8a00\u3002<\/p>\n<p>\u4f8b\u5982\uff1a<\/p>\n<pre><code>\r\n- hosts: web_group\r\n  gather_facts: no\r\n  tasks:\r\n    - name: Check conditions\r\n      assert:\r\n        that:\r\n          - 100 &gt; 20\r\n          - 200 &gt;= 200\r\n        fail_msg: \"\u65ad\u8a00\u5931\u8d25\u5566\u5566\u5566\u5566\"\r\n        success_msg: \"\u65ad\u8a00\u6210\u529f\u5566\u963f\u5566\u5566\u5566\"\r\n<\/code><\/pre>\n<p>\u5176\u4e2dthat\u53c2\u6570\u63a5\u6536\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u5b9a\u4e49\u4e00\u4e2a\u6216\u591a\u4e2a\u6761\u4ef6\uff0c\u5982\u679c\u6761\u4ef6\u5168\u4e3atrue\uff0c\u5219\u4efb\u52a1\u6210\u529f\uff0c\u53ea\u8981\u6709\u4e00\u4e2a\u6761\u4ef6\u4e3afalse\uff0c\u5219\u4efb\u52a1\u5931\u8d25\u3002fail_msg(\u6216\u5176\u522b\u540d\u53c2\u6570msg)\u5b9a\u4e49\u4efb\u52a1\u5931\u8d25\u65f6\u7684\u4fe1\u606f\uff0csuccess_msg\u5b9a\u4e49\u4efb\u52a1\u6210\u529f\u65f6\u7684\u4fe1\u606f\u3002<\/p>\n<h2>3.5 any_errors_fatal<\/h2>\n<p>\u5982\u679c\u60f3\u8ba9\u67d0\u4e2a\u5931\u8d25\u7684\u4efb\u52a1\u76f4\u63a5\u5bfc\u81f4\u6574\u4e2aplay\u7684\u5931\u8d25\uff0c\u53ef\u5728play\u7ea7\u522b\u4f7f\u7528any_errors_fatal\u6307\u4ee4\u3002<\/p>\n<pre><code>\r\n- hosts: web_group\r\n  gather_facts: no\r\n  any_errors_fatal: true\r\n  tasks:\r\n    - name: \u4efb\u52a11\r\n      debug:\r\n        msg: \u7b2c\u4e00\u4e2a\u4efb\u52a1\u6267\u884c\r\n \r\n    - fail: msg=\"\u4e0b\u9762\u7684when\u5224\u65ad\u6ee1\u8db3\uff0c\u5219\u4f1a\u7ec8\u6b62\u6574\u4e2aplaybook\u7684\u6267\u884c\"\r\n      when: \"'web01' in ansible_fqdn\"\r\n      #ignore_errors: True\r\n \r\n    - name: \u540e\u7eed\u7684\u4efb\u52a1\r\n      debug:\r\n        msg: \"web01\u4e0d\u4f1a\u6267\u884c\u8be5task\uff0cweb02\u4f1a\u6b63\u5e38\u6267\u884c\u8be5\u4efb\u52a1\"\r\n\r\n<\/code><\/pre>\n<p>\u5c06any_errors_fatal\u8bbe\u7f6e\u4e3atrue\u540e\uff0cnginx\u7ec4\u7b2c\u4e00\u4e2a\u8282\u70b9\u53ea\u8981\u4e00\u6267\u884cfail\u4efb\u52a1\uff0c\u6574\u4e2aplaybook\u4e2d\u6240\u6709\u540e\u7eed\u4efb\u52a1\u90fd\u5c06\u4e0d\u518d\u6267\u884c\uff0c\u5c31\u8fde\u5176\u5b83play\u4e5f\u4e00\u6837\u4e0d\u6267\u884c\u3002\u6ce8\u610f\u89c2\u5bdfplaybook\u7684\u6267\u884c\u7ed3\u679c\uff0c\u5b83\u5c06\u63d0\u793a&#8221;NO MORE HOSTS LEFT&#8221;\uff1a<\/p>\n<pre><code>........\r\nTASK [fail] *********************\r\nfatal: [192.168.200.42]: FAILED! =&gt; {\"changed\": false, \"msg\": \"oh, not me\"}\r\nskipping: [192.168.200.43]\r\nskipping: [192.168.200.44]\r\n\r\nNO MORE HOSTS LEFT **************\r\n\r\nPLAY RECAP *************\r\n.........\r\n<\/code><\/pre>\n<p>\u5bf9\u6bd4<\/p>\n<pre><code># 1\u3001fail \u6a21\u5757\uff1aAnsible \u7684 fail \u6a21\u5757\u53ef\u4ee5\u5728\u7279\u5b9a\u6761\u4ef6\u4e0b\u505c\u6b62\u5728\u67d0\u4e2a\u4e3b\u673a\u4e0a\u7684\u6267\u884c\uff0c\r\n\u5e76\u7ee7\u7eed\u5728\u5176\u5b83\u4e3b\u673a\u4e0a\u6267\u884c\u3002\r\n# 2\u3001any_errors_fatal\uff1a\u8fd9\u4e2a\u53c2\u6570\u662f\u5bf9\u6574\u4e2a\u5267\u672c\u7684\u8bbe\u7f6e\uff0c\u5982\u679c\u67d0\u4e2a\u4efb\u52a1\u5931\u8d25\u5e76\u89e6\u53d1\u4e86any_errors_fatal\uff0c\r\n\u90a3\u4e48\u6574\u4e2a\u5267\u672c\u5c06\u5728\u6240\u6709\u4e3b\u673a\u4e0a\u505c\u6b62\u6267\u884c\uff0c\u5305\u62ec\u540e\u7eed\u7684\u4efb\u52a1\u548c\u5267\u672c\uff0c\u8fd9\u65e0\u7591\u662f\u4e00\u4e2a\u66f4\u4e25\u683c\u7684\u9519\u8bef\u5904\u7406\u65b9\u5f0f\u3002<\/code><\/pre>\n<h2>3.6 max_fail_percentage<\/h2>\n<p>\u3002\u3002\u3002<\/p>\n<h1>\u56db\u3001\u5728\u5faa\u73af\u8bed\u53e5\u4e2d\u4f7f\u7528\u6761\u4ef6\u8bed\u53e5<\/h1>\n<pre><code>\r\n- hosts: web01\r\n\r\n  tasks:\r\n    - name: \u4efb\u52a11\uff0c\u5faa\u73af\u5217\u8868\uff0c\u5e76\u5224\u65ad\u5927\u4e8e5\u65f6\u624d\u4f1a\u6267\u884ccommand\u5b9a\u5236\u7684echo\u547d\u4ee4,\u5176\u4f59\u7684\u90fd\u4f1askip\u8df3\u8fc7\r\n      command: echo {{ item }}\r\n      loop: [ 0, 2, 4, 6, 8, 10 ]\r\n      when: item > 5\r\n\r\n    # \u786e\u4fdd\u5c06mariadb-server\u5b89\u88c5\u5230\u6839\u5206\u533a\u4e14\u6839\u5206\u533a\u7684\u53ef\u7528\u7a7a\u95f4\u8981\u5927\u4e8e300M\r\n    - name: install mariadb-server if enough space on root\r\n      yum: \r\n        name: mariadb-server\r\n        state: present\r\n      loop: \"{{ ansible_mounts }}\"\r\n      when: item.mount == \"\/\" and item.size_available > 300000000\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u6761\u4ef6\u5224\u65ad\u4e0etests \u5728shell\u5f53\u4e2d\uff0c\u6211\u4eec\u53ef\u4f7f\u7528test\u547d\u4ee4\u6765\u8fdb\u884c\u4e00\u4e9b\u5e38\u7528\u7684\u5224\u65ad\u64cd\u4f5c\uff0c\u5982\u4e0b\uff1a # \u5224\u65ad\/ [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/9836"}],"collection":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9836"}],"version-history":[{"count":13,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/9836\/revisions"}],"predecessor-version":[{"id":11276,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/9836\/revisions\/11276"}],"wp:attachment":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9836"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9836"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9836"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}