{"id":42676,"date":"2023-12-24T04:12:23","date_gmt":"2023-03-26T11:59:08","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/"},"modified":"2024-05-04T15:07:18","modified_gmt":"2024-05-04T07:07:18","slug":"%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/","title":{"rendered":"\u6211\u5bb6\u7684Ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb"},"content":{"rendered":"<h1>\u9996\u5148<\/h1>\n<p>\u8fd9\u662f\u300aAnsible Advent Calendar 2017\u300b\u7684\u7b2c10\u7bc7\u6587\u7ae0\u3002<br \/>\n\u8fd9\u662f\u4e00\u4e2a\u6709\u8da3\u7684\u8bdd\u9898\u3002<\/p>\n<p>\u6211\u8ba4\u4e3a\u5f88\u591a\u4eba\u90fd\u77e5\u9053\u5728Ansible\u4efb\u52a1\u8f93\u51fa\u4e2d\u53ef\u4ee5\u4f7f\u7528cowsay\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Ansible\u306ePlaybook\u5b9f\u884c\u6642\u306b\u725b\u3068\u3086\u304b\u3044\u306a\u4ef2\u9593\u305f\u3061\u3092\u8868\u793a\u3055\u305b\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Ansible\u00d7Cowsay<\/ul>\n<pre class=\"post-pre\"><code>__________________ \r\n&lt; PLAY [localhost] &gt;\r\n------------------ \r\n       \\   ^__^\r\n        \\  (oo)\\_______\r\n           (__)\\       )\\\/\\\r\n               ||----w |\r\n               ||     ||\r\n\r\n_________________________  \r\n&lt; TASK [Gathering Facts] &gt;\r\n------------------------- \r\n       \\   ^__^\r\n        \\  (oo)\\_______\r\n           (__)\\       )\\\/\\\r\n               ||----w |\r\n               ||     ||\r\n\r\n<\/code><\/pre>\n<p>\u5982\u679c\u4f60\u5b89\u88c5\u4e86cowsay\uff0c\u6ca1\u6709\u505a\u4efb\u4f55\u7279\u6b8a\u7684\u8bbe\u7f6e\uff0c\u90a3\u4e48Ansible\u7684\u6d88\u606f\u5c31\u4f1a\u88abcowsay\u8f6c\u5316\uff0c\u800c\u90a3\u4e9b\u4e0d\u77e5\u9053\u5982\u4f55\u4f7f\u7528cowsay\u7684\u4eba\u53ef\u80fd\u4f1a\u9677\u5165\u6050\u614c\u4e4b\u4e2d\u3002\u987a\u4fbf\u63d0\u4e00\u4e0b\uff0c\u8fd9\u662f\u4e24\u5e74\u524d\u7684\u6211\u3002<\/p>\n<p>\u5bf9\u4e8e\u90a3\u4e2aAnsible\u7684cowsay\u8f93\u51fa\uff0c\u6211\u51b3\u5b9a\u5c1d\u8bd5\u4f7f\u7528\u4e0ecowsay\u76f8\u4f3c\u7684\u6709\u8da3\u547d\u4ee4echo-sd\u6765\u8f93\u51fa\u3002<\/p>\n<p>\u987a\u4fbf\u8bf4\u4e00\u4e0b\uff0c\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\u6240\u4ecb\u7ecd\u7684\u65b9\u6cd5\u662f\u76f4\u63a5\u4fee\u6539\u6838\u5fc3\u6e90\u4ee3\u7801\uff0c\u4e5f\u5c31\u662f\u6240\u8c13\u7684\u201c\u8111\u888b\u808c\u8089\u73a9\u6cd5\u201d\u3002\u6309\u7167 Ansible \u7684\u8bbe\u8ba1\uff0c\u672c\u5e94\u91c7\u7528\u7c7b\u4f3c\u4e0b\u9762\u8fd9\u7bc7\u6587\u7ae0\u4e2d\u6240\u4ecb\u7ecd\u7684 Callback \u63d2\u4ef6\u673a\u5236\u6765\u5b9e\u73b0\u3002<\/p>\n<ul class=\"post-ul\">Ansible\u306ecallback plugin\u3092\u4f7f\u3063\u3066\u7a81\u7136\u306e\u6b7b(echo-sd)\u3092\u8868\u73fe\u3059\u308b<\/ul>\n<h1>\u5728\u54ea\u91cc\u6539\u52a8<\/h1>\n<p>\u6211\u60f3\u505a\u7684\u662f\u201c\u53d1\u73b0Ansible\u6b63\u5728cowsay\u7684\u5730\u65b9\uff0c\u5e76\u5c06\u5176\u66ff\u6362\u4e3aecho-sd\u201d\u3002<br \/>\n\u56e0\u6b64\uff0c\u6211\u4f1a\u67e5\u770bAnsible\u4ee3\u7801\uff0c\u627e\u5230\u5b83\u4e0ecowsay\u7684\u8fde\u63a5\u70b9\u3002<br \/>\n\u7531\u4e8e\u662f\u5f00\u6e90\u7684\uff0c\u6240\u4ee5\u53ef\u4ee5\u81ea\u7531\u5730\u67e5\u770b\u548c\u4fee\u6539\u6e90\u4ee3\u7801\uff0c\u592a\u68d2\u4e86\u3002<\/p>\n<p>ansible\/ansible &#8211; GitHub<\/p>\n<p>\u5b89\u88c5\u624b\u518c\u548c\u6587\u6863\u4ee5\u53ca ansible \u7684\u5176\u5b83\u4fe1\u606f\u7684\u6e90\u5934\u3002<\/p>\n<p>\u9996\u5148\uff0c\u8ba9\u6211\u4eec\u5728\u4ee3\u7801\u5e93\u4e2d\u8bda\u5b9e\u5730\u4f7f\u7528\u201ccowsay\u201d\u8fdb\u884c\u641c\u7d22\u3002<\/p>\n<p>\u641c\u7d22- cowsay<\/p>\n<p>\u67094\u4e2a\u6587\u4ef6\u88ab\u547d\u4e2d\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">lib\/ansible\/utils\/display.py<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">docs\/docsite\/rst\/faq.rst<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">examples\/ansible.cfg<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">lib\/ansible\/config\/base.yml<\/ul>\n<p>\u770b\u8d77\u6765\u4e0d\u592a\u9700\u8981\u53bb\u770b\u4e86\u3002<br \/>\n\u5341\u6709\u516b\u4e5d\u7684\u53ef\u80fd\u662f display.py \u662f\u7f6a\u72af\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"n\">b_COW_PATHS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"sa\">b<\/span><span class=\"s\">\"\/usr\/bin\/cowsay\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"sa\">b<\/span><span class=\"s\">\"\/usr\/games\/cowsay\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"sa\">b<\/span><span class=\"s\">\"\/usr\/local\/bin\/cowsay\"<\/span><span class=\"p\">,<\/span>  <span class=\"c1\"># BSD path for cowsay\r\n<\/span>    <span class=\"sa\">b<\/span><span class=\"s\">\"\/opt\/local\/bin\/cowsay\"<\/span><span class=\"p\">,<\/span>  <span class=\"c1\"># MacPorts path for cowsay\r\n<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u56e0\u4e3a\u5305\u542b\u8fd9\u6837\u7684\u4e1c\u897f\uff0c\u6240\u4ee5\u770b\u8d77\u6765\u662f\u80af\u5b9a\u7684\u7f6a\u72af\u3002<br \/>\n\u4f3c\u4e4e\u5df2\u7ecf\u8003\u8651\u4e86\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u5fae\u5999\u5730\u6709\u4e0d\u540c\u7684cowsay\u547d\u4ee4\u8def\u5f84\u95ee\u9898\u3002\u592a\u68d2\u4e86\u3002<\/p>\n<h1>\u6539\u826f\u7684\u51c6\u5907\u5de5\u4f5c<\/h1>\n<p>\u4e3a\u4e86\u6539\u9020\uff0c\u6211\u4f1a\u83b7\u53d6\u6e90\u4ee3\u7801\u3002\u6211\u5c06\u4f7f\u7528\u6700\u65b0\u7684\u7a33\u5b9a\u7248\u672cv2.4.2.0-1\u6765\u4f5c\u4e3a\u4ee3\u7801\u57fa\u7840\u3002<\/p>\n<pre class=\"post-pre\"><code># Ansible\u30ea\u30dd\u30b8\u30c8\u30ea\u3092\u30af\u30ed\u30fc\u30f3\r\n$ git clone https:\/\/github.com\/ansible\/ansible.git\r\n$ cd ansible\r\n$ git checkout v2.4.2.0-1\r\n\r\n# \u5b9f\u884c\u74b0\u5883\u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\r\n$ source .\/hacking\/env-setup\r\n$ ansible --version\r\nansible 2.4.2.0 (detached HEAD e3a8bf02ac) last updated 2017\/12\/10 02:06:21 (GMT +900)\r\n  config file = None\r\n  configured module search path = [u'\/root\/.ansible\/plugins\/modules', u'\/usr\/share\/ansible\/plugins\/modules']\r\n  ansible python module location = \/opt\/ansible\/lib\/ansible\r\n  executable location = \/opt\/ansible\/bin\/ansible\r\n  python version = 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]\r\n<\/code><\/pre>\n<p>\u8bf7\u70b9\u51fb\u6b64\u5904\u67e5\u770b\u786e\u8ba4\u6267\u884c\u7684Playbook\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">hosts<\/span><span class=\"pi\">:<\/span> <span class=\"s\">localhost<\/span>\r\n  <span class=\"na\">user<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ansible<\/span>\r\n  <span class=\"na\">tasks<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Display message<\/span>\r\n      <span class=\"na\">debug<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">msg<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">\u7a81\u7136\u306e\u6b7b\"<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u662f\u5e73\u65f6\u7684\u6d88\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code>$ ansible-playbook -i hosts echo-sd.yml\r\n\r\nPLAY [localhost] *********************************************************************************************\r\n\r\nTASK [Gathering Facts] ***************************************************************************************\r\nok: [localhost]\r\n\r\nTASK [Display message] ***************************************************************************************\r\nok: [localhost] =&gt; {\r\n    \"msg\": \"\u7a81\u7136\u306e\u6b7b\"\r\n}\r\n\r\nPLAY RECAP ***************************************************************************************************\r\nlocalhost                  : ok=2    changed=0    unreachable=0    failed=0\r\n<\/code><\/pre>\n<h1>\u600e\u6837\u5904\u7406<\/h1>\n<p>\u5c3d\u7ba1\u8fd9\u5f88\u7b80\u5355\u7c97\u66b4\uff0c\u4f46\u5982\u679c\u6211\u4eec\u5c1d\u8bd5\u5c06echo-sd\u4ee3\u66ffcowsay\uff0c\u4f1a\u53d1\u751f\u4ec0\u4e48\u5462\uff1f<\/p>\n<pre class=\"post-pre\"><code><span class=\"n\">b_COW_PATHS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"sa\">b<\/span><span class=\"s\">\"\/usr\/local\/bin\/echo-sd\"<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># echo-sd\u306e\u30d1\u30b9\r\n<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u80fd\u987a\u5229\u8fdb\u884c\uff0c\u5c31\u4f1a\u5927\u8d5a\u4e00\u7b14\uff0c\u5e26\u7740\u7948\u7977\u7684\u5fc3\u60c5\uff0c\u8ba9\u6211\u4eec\u5c1d\u8bd5\u4e00\u4e0b&#8230;\uff01<\/p>\n<pre class=\"post-pre\"><code>$ ansible-playbook -i hosts echo-sd.yml\r\n\r\n\r\nok: [localhost]\r\n\r\nok: [localhost] =&gt; {\r\n    \"msg\": \"echo-sd !!!\"\r\n}\r\n\r\nlocalhost                  : ok=2    changed=0    unreachable=0    failed=0\r\n\r\n$ echo-sd \u4f55\u3082\u51fa\u306a\u3044\r\n\uff3f\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\uff3f\r\n\uff1e\u3000\u4f55\u3082\u51fa\u306a\u3044\u3000\uff1c\r\n\uffe3Y^Y^Y^Y^Y^Y^Y^\uffe3\r\n<\/code><\/pre>\n<p>\u55ef\uff0c\u4e8b\u60c5\u5e76\u4e0d\u4f1a\u50cf\u9884\u671f\u7684\u90a3\u6837\u987a\u5229\u8fdb\u884c\u3002\u8ba9\u6211\u4eec\u8ba4\u771f\u5730\u7ee7\u7eed\u52aa\u529b\u5427\u3002<\/p>\n<h2>\u5b8c\u7f8e\u7248\u672c<\/h2>\n<p>\u6211\u4f1a\u6309\u7167\u987a\u5e8f\u9010\u6b65\u89e3\u91ca\uff0c\u6682\u65f6\u6298\u53e0\u8d77\u6765\u3002\u4e8b\u5b9e\u4e0a\uff0c\u6211\u5148\u5b8c\u6210\u4e86\u7248\u672c\uff0c\u7136\u540e\u9700\u8981\u4fee\u6539\u4e24\u4e2a\u6587\u4ef6\u3002<\/p>\n<details>lib\/ansible\/utils\/display.py# (c) 2014, Michael DeHaan &lt;michael.dehaan@gmail.com&gt;<br \/>\n#<br \/>\n# \u8fd9\u4e2a\u6587\u4ef6\u662fAnsible\u7684\u4e00\u90e8\u5206<br \/>\n#<br \/>\n# Ansible\u662f\u81ea\u7531\u8f6f\u4ef6\uff1a\u60a8\u53ef\u4ee5\u6839\u636e\u81ea\u7531\u8f6f\u4ef6\u57fa\u91d1\u4f1a\u53d1\u5e03\u7684GNU\u901a\u7528\u516c\u5171\u8bb8\u53ef\u8bc1\u7684\u6761\u6b3e\u91cd\u65b0\u5206\u53d1\u6216\u4fee\u6539\u5b83<br \/>\n# \u6216\uff08\u6839\u636e\u60a8\u7684\u9009\u62e9\uff09\u4efb\u4f55\u540e\u7eed\u7248\u672c\u3002<br \/>\n#<br \/>\n# Ansible\u5e0c\u671b\u5b83\u662f\u6709\u7528\u7684\uff0c\u4f46\u6ca1\u6709\u4efb\u4f55\u62c5\u4fdd\uff1b\u751a\u81f3\u6ca1\u6709\u9002\u9500\u6027\u6216\u9002\u7528\u6027\u7684\u6697\u793a\u4fdd\u8bc1\u3002<br \/>\n# \u6709\u5173\u66f4\u591a\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605GNU\u901a\u7528\u516c\u5171\u8bb8\u53ef\u8bc1\u3002<br \/>\n#<br \/>\n# \u60a8\u5e94\u8be5\u6536\u5230\u4e0eAnsible\u7684GNU\u901a\u7528\u516c\u5171\u8bb8\u53ef\u8bc1\u4e00\u8d77\u7684\u526f\u672c\u3002<br \/>\n# \u5982\u679c\u6ca1\u6709\uff0c\u53c2\u9605&lt;http:\/\/www.gnu.org\/licenses\/&gt;\u3002<\/p>\n<p>from __future__ import (absolute_import, division, print_function)<br \/>\n__metaclass__ = type<\/p>\n<p>import errno<br \/>\nimport fcntl<br \/>\nimport getpass<br \/>\nimport locale<br \/>\nimport logging<br \/>\nimport os<br \/>\nimport random<br \/>\nimport subprocess<br \/>\nimport sys<br \/>\nimport textwrap<br \/>\nimport time<\/p>\n<p>from struct import unpack, pack<br \/>\nfrom termios import TIOCGWINSZ<\/p>\n<p>from ansible import constants as C<br \/>\nfrom ansible.errors import AnsibleError<br \/>\nfrom ansible.module_utils._text import to_bytes, to_text<br \/>\nfrom ansible.utils.color import stringc<\/p>\n<p>try:<br \/>\n# Python 2<br \/>\ninput = raw_input<br \/>\nexcept NameError:<br \/>\n# Python 3, we already have raw_input<br \/>\npass<\/p>\n<p>logger = None<br \/>\n# TODO: make this a logging callback instead<br \/>\nif C.DEFAULT_LOG_PATH:<br \/>\npath = C.DEFAULT_LOG_PATH<br \/>\nif (os.path.exists(path) and os.access(path, os.W_OK)) or os.access(os.path.dirname(path), os.W_OK):<br \/>\nlogging.basicConfig(filename=path, level=logging.DEBUG, format=&#8217;%(asctime)s %(name)s %(message)s&#8217;)<br \/>\nmypid = str(os.getpid())<br \/>\nuser = getpass.getuser()<br \/>\nlogger = logging.getLogger(&#8220;p=%s u=%s | &#8221; % (mypid, user))<br \/>\nelse:<br \/>\nprint(&#8220;[WARNING]: log file at %s is not writeable and we cannot create it, aborting\\n&#8221; % path, file=sys.stderr)<\/p>\n<p>b_ECHO_SD_PATHS = (<br \/>\nb&#8221;\/usr\/local\/bin\/echo-sd&#8221;, # echo-sd\u7684\u8def\u5f84<br \/>\n)<\/p>\n<p>b_ECHO_SD_STYLES = (<br \/>\nb&#8221;vertical&#8221;,<br \/>\nb&#8221;tanzaku&#8221;,<br \/>\nb&#8221;default&#8221;,<br \/>\n)<\/p>\n<p>class Display:<\/p>\n<p>def __init__(self, verbosity=0):<\/p>\n<p>self.columns = None<br \/>\nself.verbosity = verbosity<\/p>\n<p># \u9632\u6b62\u91cd\u590d\u663e\u793a\u6240\u6709\u5f03\u7528\u6d88\u606f\u7684\u5217\u8868<br \/>\nself._deprecations = {}<br \/>\nself._warns = {}<br \/>\nself._errors = {}<\/p>\n<p>self.b_echo_sd = None<br \/>\nself.nonsd = C.ANSIBLE_SD_SELECTION<\/p>\n<p>self.set_echo_sd_info()<\/p>\n<p>self._set_column_width()<\/p>\n<p>def set_echo_sd_info(self):<br \/>\nif not C.ANSIBLE_NOSD:<br \/>\nfor b_echo_sd_path in b_ECHO_SD_PATHS:<br \/>\nif os.path.exists(b_echo_sd_path):<br \/>\nself.b_echo_sd = b_echo_sd_path<\/p>\n<p>def display(self, msg, color=None, stderr=False, screen_only=False, log_only=False):<br \/>\n&#8220;&#8221;&#8221;\u5411\u7528\u6237\u663e\u793a\u6d88\u606f<\/p>\n<p>\u6ce8\u610f\uff1amsg\u5fc5\u987b\u662f\u4e00\u4e2aUnicode\u5b57\u7b26\u4e32\uff0c\u4ee5\u9632\u6b62UnicodeError traceback\u3002<br \/>\n&#8220;&#8221;&#8221;<\/p>\n<p>nocolor = msg<br \/>\nif color:<br \/>\nmsg = stringc(msg, color)<\/p>\n<p>if not log_only:<br \/>\nif not msg.endswith(u&#8217;\\n&#8217;):<br \/>\nmsg2 = msg + u&#8217;\\n&#8217;<br \/>\nelse:<br \/>\nmsg2 = msg<\/p>\n<p>msg2 = to_bytes(msg2, encoding=self._output_encoding(stderr=stderr))<br \/>\nif sys.version_info &gt;= (3,):<br \/>\n# \u5728python3\u4e0a\u5c06\u5176\u8f6c\u6362\u56de\u6587\u672c\u5b57\u7b26\u4e32<br \/>\n# \u6211\u4eec\u9996\u5148\u5c06\u5176\u8f6c\u6362\u4e3a\u5b57\u8282\u5b57\u7b26\u4e32\uff0c\u4ee5\u6446\u8131\u7528\u6237\u533a\u57df\u8bbe\u7f6e\u4e2d\u65e0\u6548\u7684\u5b57\u7b26<br \/>\nmsg2 = to_text(msg2, self._output_encoding(stderr=stderr), errors=&#8217;replace&#8217;)<\/p>\n<p>if not stderr:<br \/>\nfileobj = sys.stdout<br \/>\nelse:<br \/>\nfileobj = sys.stderr<\/p>\n<p>fileobj.write(msg2)<\/p>\n<p>try:<br \/>\nfileobj.flush()<br \/>\nexcept IOError as e:<br \/>\n# \u5ffd\u7565EPIPE\uff08\u6307\u793a\u6587\u4ef6\u5bf9\u8c61\u5df2\u8fc7\u65e9\u5173\u95ed\uff09\u7684\u9519\u8bef\uff0c\u4f8b\u5982\u7ba1\u9053\u5230\u201chead -n1\u201d<br \/>\nif e.errno != errno.EPIPE:<br \/>\nraise<\/p>\n<p>if logger and not screen_only:<br \/>\nmsg2 = nocolor.lstrip(u&#8217;\\n&#8217;)<\/p>\n<p>msg2 = to_bytes(msg2)<br \/>\nif sys.version_info &gt;= (3,):<br \/>\n# \u5728python3\u4e0a\u5c06\u5176\u8f6c\u6362\u56de\u6587\u672c\u5b57\u7b26\u4e32<br \/>\n# \u6211\u4eec\u9996\u5148\u5c06\u5176\u8f6c\u6362\u4e3a\u5b57\u8282\u5b57\u7b26\u4e32\uff0c\u4ee5\u6446\u8131\u7528\u6237\u533a\u57df\u8bbe\u7f6e\u4e2d\u65e0\u6548\u7684\u5b57\u7b26<br \/>\nmsg2 = to_text(msg2, self._output_encoding(stderr=stderr))<\/p>\n<p>if color == C.COLOR_ERROR:<br \/>\nlogger.error(msg2)<br \/>\nelse:<br \/>\nlogger.info(msg2)<\/p>\n<p>def v(self, msg, host=None):<br \/>\nreturn self.verbose(msg, host=host, caplevel=0)<\/p>\n<p>def vv(self, msg, host=None):<br \/>\nreturn self.verbose(msg, host=host, caplevel=1)<\/p>\n<p>def vvv(self, msg, host=None):<br \/>\nreturn self.verbose(msg, host=host, caplevel=2)<\/p>\n<p>def vvvv(self, msg, host=None):<br \/>\nreturn self.verbose(msg, host=host, caplevel=3)<\/p>\n<p>def vvvvv(self, msg, host=None):<br \/>\nreturn self.verbose(msg, host=host, caplevel=4)<\/p>\n<p>def vvvvvv(self, msg, host=None):<br \/>\nreturn self.verbose(msg, host=host, caplevel=5)<\/p>\n<p>def debug(self, msg):<br \/>\nif C.DEFAULT_DEBUG:<br \/>\nself.display(&#8220;%6d %0.5f: %s&#8221; % (os.getpid(), time.time(), msg), color=C.COLOR_DEBUG)<\/p>\n<p>def verbose(self, msg, host=None, caplevel=2):<br \/>\nif self.verbosity &gt; caplevel:<br \/>\nif host is None:<br \/>\nself.display(msg, color=C.COLOR_VERBOSE)<br \/>\nelse:<br \/>\nself<\/p>\n<\/details>\n<details>lib\/ansible\/config\/base.yml# Copyright (c) 2017 Ansible Project<br \/>\n# GNU General Public License v3.0+ (see COPYING or https:\/\/www.gnu.org\/licenses\/gpl-3.0.txt)<br \/>\n&#8212;<br \/>\nACCELERATE_CONNECT_TIMEOUT:<br \/>\ndefault: 1.0<br \/>\ndescription:<br \/>\n&#8211; &#8220;This setting controls the timeout for the socket connect call, and should be kept relatively low.<br \/>\nThe connection to the accelerate_port will be attempted 3 times before Ansible will fall back to ssh or paramiko<br \/>\n(depending on your default connection setting) to try and start the accelerate daemon remotely.&#8221;<br \/>\n&#8211; &#8220;Note, this value can be set to less than one second, however it is probably not a good idea to do so<br \/>\nunless you are on a very fast and reliable LAN. If you are connecting to systems over the internet, it may be necessary to increase this timeout.&#8221;<br \/>\nenv: [{name: ACCELERATE_CONNECT_TIMEOUT }]<br \/>\nini:<br \/>\n&#8211; {key: accelerate_connect_timeout, section: accelerate}<br \/>\ntype: float<br \/>\ndeprecated:<br \/>\nwhy: Removing accelerate as a connection method, settings not needed either.<br \/>\nversion: &#8220;2.5&#8221;<br \/>\nalternatives: ssh and paramiko<br \/>\nversion_added: &#8220;1.4&#8221;<br \/>\nACCELERATE_DAEMON_TIMEOUT:<br \/>\ndefault: 30<br \/>\ndescription:<br \/>\n&#8211; This setting controls the timeout for the accelerated daemon, as measured in minutes. The default daemon timeout is 30 minutes.<br \/>\n&#8211; &#8220;Prior to 1.6, the timeout was hard-coded from the time of the daemon&#8217;s launch.&#8221;<br \/>\n&#8211; For version 1.6+, the timeout is now based on the last activity to the daemon and is configurable via this option.<br \/>\nenv: [{name: ACCELERATE_DAEMON_TIMEOUT}]<br \/>\nini:<br \/>\n&#8211; {key: accelerate_daemon_timeout, section: accelerate}<br \/>\ntype: integer<br \/>\ndeprecated:<br \/>\nwhy: Removing accelerate as a connection method, settings not needed either.<br \/>\nversion: &#8220;2.5&#8221;<br \/>\nalternatives: ssh and paramiko<br \/>\nversion_added: &#8220;1.6&#8221;<br \/>\nACCELERATE_KEYS_DIR:<br \/>\ndefault: ~\/.fireball.keys<br \/>\ndescription: &#8221;<br \/>\ndeprecated:<br \/>\nwhy: Removing accelerate as a connection method, settings not needed either.<br \/>\nversion: &#8220;2.5&#8221;<br \/>\nalternatives: ssh and paramiko<br \/>\nenv: [{name: ACCELERATE_KEYS_DIR}]<br \/>\nini:<br \/>\n&#8211; {key: accelerate_keys_dir, section: accelerate}<br \/>\nACCELERATE_KEYS_DIR_PERMS:<br \/>\ndefault: &#8216;700&#8217;<br \/>\ndescription: &#8216;TODO: write it&#8217;<br \/>\nenv: [{name: ACCELERATE_KEYS_DIR_PERMS}]<br \/>\nini:<br \/>\n&#8211; {key: accelerate_keys_dir_perms, section: accelerate}<br \/>\ndeprecated:<br \/>\nwhy: Removing accelerate as a connection method, settings not needed either.<br \/>\nversion: &#8220;2.5&#8221;<br \/>\nalternatives: ssh and paramiko<br \/>\nACCELERATE_KEYS_FILE_PERMS:<br \/>\ndefault: &#8216;600&#8217;<br \/>\ndescription: &#8216;TODO: write it&#8217;<br \/>\nenv: [{name: ACCELERATE_KEYS_FILE_PERMS}]<br \/>\nini:<br \/>\n&#8211; {key: accelerate_keys_file_perms, section: accelerate}<br \/>\ndeprecated:<br \/>\nwhy: Removing accelerate as a connection method, settings not needed either.<br \/>\nversion: &#8220;2.5&#8221;<br \/>\nalternatives: ssh and paramiko<br \/>\nACCELERATE_MULTI_KEY:<br \/>\ndefault: False<br \/>\ndescription: &#8216;TODO: write it&#8217;<br \/>\nenv: [{name: ACCELERATE_MULTI_KEY}]<br \/>\nini:<br \/>\n&#8211; {key: accelerate_multi_key, section: accelerate}<br \/>\ntype: boolean<br \/>\ndeprecated:<br \/>\nwhy: Removing accelerate as a connection method, settings not needed either.<br \/>\nversion: &#8220;2.5&#8221;<br \/>\nalternatives: ssh and paramiko<br \/>\nACCELERATE_PORT:<br \/>\ndefault: 5099<br \/>\ndescription: &#8216;TODO: write it&#8217;<br \/>\nenv: [{name: ACCELERATE_PORT}]<br \/>\nini:<br \/>\n&#8211; {key: accelerate_port, section: accelerate}<br \/>\ntype: integer<br \/>\ndeprecated:<br \/>\nwhy: Removing accelerate as a connection method, settings not needed either.<br \/>\nversion: &#8220;2.5&#8221;<br \/>\nalternatives: ssh and paramiko<br \/>\nACCELERATE_TIMEOUT:<br \/>\ndefault: 30<br \/>\ndescription: &#8216;TODO: write it&#8217;<br \/>\nenv: [{name: ACCELERATE_TIMEOUT}]<br \/>\nini:<br \/>\n&#8211; {key: accelerate_timeout, section: accelerate}<br \/>\ntype: integer<br \/>\ndeprecated:<br \/>\nwhy: Removing accelerate as a connection method, settings not needed either.<br \/>\nversion: &#8220;2.5&#8221;<br \/>\nalternatives: ssh and paramiko<br \/>\nALLOW_WORLD_READABLE_TMPFILES:<br \/>\nname: Allow world readable temporary files<br \/>\ndefault: False<br \/>\ndescription:<br \/>\n&#8211; This makes the temporary files created on the machine to be world readable and will issue a warning instead of failing the task.<br \/>\n&#8211; It is useful when becoming an unprivileged user.<br \/>\nenv: []<br \/>\nini:<br \/>\n&#8211; {key: allow_world_readable_tmpfiles, section: defaults}<br \/>\ntype: boolean<br \/>\nyaml: {key: defaults.allow_world_readable_tmpfiles}<br \/>\nversion_added: &#8220;2.1&#8221;<br \/>\nANSIBLE_SD_SELECTION:<br \/>\nname: echo-sd style selection<br \/>\ndefault: default<br \/>\ndescription: This allows you to chose a specific echo-sd style for the banners or use &#8216;random&#8217; to cycle through them.<br \/>\nenv: [{name: ANSIBLE_SD_SELECTION}]<br \/>\nini:<br \/>\n&#8211; {key: sd_selection, section: defaults}<br \/>\nANSIBLE_FORCE_COLOR:<br \/>\nname: Force color output<br \/>\ndefault: False<br \/>\ndescription: This options forces color mode even when running without a TTY or the &#8220;nocolor&#8221; setting is True.<br \/>\nenv: [{name: ANSIBLE_FORCE_COLOR}]<br \/>\nini:<br \/>\n&#8211; {key: force_color, section: defaults}<br \/>\ntype: boolean<br \/>\nyaml: {key: display.force_color}<br \/>\nANSIBLE_NOCOLOR:<br \/>\nname: Suppress color output<br \/>\ndefault: False<br \/>\ndescription: This setting allows suppressing colorizing output, which is used to give a better indication of failure and status information.<br \/>\nenv: [{name: ANSIBLE_NOCOLOR}]<br \/>\nini:<br \/>\n&#8211; {key: nocolor, section: defaults}<br \/>\ntype: boolean<br \/>\nyaml: {key: display.nocolor}<br \/>\nANSIBLE_NOSD:<br \/>\nname: Suppress echo-sd output<br \/>\ndefault: False<br \/>\ndescription: If you have echo-sd installed but want to avoid the &#8216;echo-sd&#8217; (why????), use this.<br \/>\nenv: [{name: ANSIBLE_NOSD}]<br \/>\nini:<br \/>\n&#8211; {key: nosd, section: defaults}<br \/>\ntype: boolean<br \/>\nyaml: {key: display.i_am_no_fun}<br \/>\nANSIBLE_PIPELINING:<br \/>\nname: Connection pipelining<br \/>\ndefault: False<br \/>\ndescription:<br \/>\n&#8211; Pipelining, if supported by the connection plugin, reduces the number of network operations required to execute a module on the remote server,<br \/>\nby executing many Ansible modules without actual file transfer.<br \/>\n&#8211; This can result in a very significant performance improvement when enabled.<br \/>\n&#8211; &#8220;However this conflicts with privilege escalation (become). For example, when using &#8216;sudo:&#8217; operations you must first<br \/>\ndisable &#8216;requiretty&#8217; in \/etc\/sudoers on all managed hosts, which is why it is disabled by default.&#8221;<br \/>\nenv:<br \/>\n&#8211; name: ANSIBLE_PIPELINING<br \/>\n&#8211; name: ANSIBLE_SSH_PIPELINING<br \/>\nini:<br \/>\n&#8211; section: connection<br \/>\nkey: pipelining<br \/>\n&#8211; section: ssh_connection<br \/>\nkey: pipelining<br \/>\ntype: boolean<br \/>\nyaml: {key: plugins.connection.pipelining}<br \/>\nANSIBLE_SSH_ARGS:<br \/>\n# TODO: move to ssh plugin<br \/>\ndefault: -C -o ControlMaster=auto -o ControlPersist=60s<br \/>\ndescription:<br \/>\n&#8211; If set, this will override the Ansible default ssh arguments.<br \/>\n&#8211; In particular, users may wish to raise the ControlPersist time to encourage performance. A value of 30 minutes may be appropriate.<br \/>\n&#8211; Be aware that if `-o ControlPath` is set in ssh_args, the control path setting is not used.<br \/>\nenv: [{name: ANSIBLE_SSH_ARGS}]<br \/>\nini:<br \/>\n&#8211; {key: ssh_args, section: ssh_connection}<br \/>\nyaml: {key: ssh_connection.ssh_args}<br \/>\nANSIBLE_SSH_CONTROL_PATH:<br \/>\n# TODO: move to ssh plugin<br \/>\ndefault: null<br \/>\ndescription:<br \/>\n&#8211; This is the location to save ssh&#8217;s ControlPath sockets, it uses ssh&#8217;s variable substitution.<br \/>\n&#8211; Since 2.3, if null, ansible will generate a unique hash. Use `%(directory)s` to indicate where to use the control dir path setting.<br \/>\n&#8211; Before 2.3 it defaulted to `control_path=%(directory)s\/ansible-ssh-%%h-%%p-%%r`.<br \/>\n&#8211; Be aware that this setting is ignored if `-o ControlPath` is set in ssh args.<br \/>\nenv: [{name: ANSIBLE_SSH_CONTROL_PATH}]<br \/>\nini:<br \/>\n&#8211; {key: control_path, section: ssh_connection}<br \/>\nyaml: {key: ssh_connection.control_path}<br \/>\nANSIBLE_SSH_CONTROL_PATH_DIR:<br \/>\n# TODO: move to ssh plugin<br \/>\ndefault: ~\/.ansible\/cp<br \/>\ndescription:<br \/>\n&#8211; This sets the directory to use for ssh control path if the control path setting is null.<br \/>\n&#8211; Also, provides the `%(directory)s` variable for the control path setting.<br \/>\nenv: [{name: ANSIBLE_SSH_CONTROL_PATH_DIR}]<br \/>\nini:<br \/>\n&#8211; {key: control_path_dir, section: ssh_connection}<br \/>\nyaml: {key: ssh_connection.control_path_dir}<br \/>\nANSIBLE_SSH_EXECUTABLE:<br \/>\n# TODO: move to ssh plugin<br \/>\ndefault: ssh<br \/>\ndescription:<br \/>\n&#8211; This defines the location of the ssh binary. It defaults to `ssh` which will use the first ssh binary available in $PATH.<br \/>\n&#8211; This option is usually not required, it might be useful when access to system ssh is restricted,<br \/>\nor when using ssh wrappers to connect to remote hosts.<br \/>\nenv: [{name: ANSIBLE_SSH_EXECUTABLE}]<br \/>\nini:<br \/>\n&#8211; {key: ssh_executable, section: ssh_connection}<br \/>\nyaml: {key: ssh_connection.ssh_executable}<br \/>\nversion_added: &#8220;2.2&#8221;<br \/>\nANSIBLE_SSH_RETRIES:<br \/>\n# TODO: move to ssh plugin<br \/>\ndefault: 0<br \/>\ndescription: Number of attempts to establish a connection before we give up and report the host as &#8216;UNREACHABLE&#8217;<br \/>\nenv: [{name: ANSIBLE_SSH_RETRIES}]<br \/>\nini:<br \/>\n&#8211; {key: retries, section: ssh_connection}<br \/>\ntype: integer<br \/>\nyaml: {key: ssh_connection.retries}<br \/>\nANY_ERRORS_FATAL:<br \/>\nname: Make Task failures fatal<br \/>\ndefault: False<br \/>\ndescription: Sets the default value for the any_errors_fatal keyword, if True, Task failures will be considered fatal errors.<br \/>\nenv:<br \/>\n&#8211; name: ANSIBLE_ANY_ERRORS_FATAL<br \/>\nini:<br \/>\n&#8211; section: defaults<br \/>\nkey: any_errors_fatal<br \/>\ntype: boolean<br \/>\nyaml: {key: errors.any_task_errors_fatal}<br \/>\nversion_added: &#8220;2.4&#8221;<br \/>\nBECOME_ALLOW_SAME_USER:<br \/>\nname: Allow becomming the same user<br \/>\ndefault: False<br \/>\ndescription: This setting controls if become is skipped when remote user and become user are the same. I.E root sudo to root.<br \/>\nenv: [{name: ANSIBLE_BECOME_ALLOW_SAME_USER}]<br \/>\nini:<br \/>\n&#8211; {key: become_allow_same_user, section: privilege_escalation}<br \/>\ntype: boolean<br \/>\nyaml: {key: privilege_escalation.become_allow_same_user}<br \/>\nCACHE_PLUGIN:<br \/>\nname: Persistent Cache plugin<br \/>\ndefault: memory<br \/>\ndescription: Chooses which cache plugin to use, the default &#8216;memory&#8217; is ephimeral.<br \/>\nenv: [{name: ANSIBLE_CACHE_PLUGIN}]<br \/>\nini:<br \/>\n&#8211; {key: fact_caching, section: defaults}<br \/>\nyaml: {key: facts.cache.plugin}<br \/>\nCACHE_PLUGIN_CONNECTION:<br \/>\nname: Cache Plugin URI<br \/>\ndefault: ~<br \/>\ndescription: Defines connection or path information for the cache plugin<br \/>\nenv: [{name: ANSIBLE_CACHE_PLUGIN_CONNECTION}]<br \/>\nini:<br \/>\n&#8211; {key: fact_caching_connection, section: defaults}<br \/>\nyaml: {key: facts.cache.uri}<br \/>\nCACHE_PLUGIN_PREFIX:<br \/>\nname: Cache Plugin table prefix<br \/>\ndefault: ansible_facts<br \/>\ndescription: Prefix to use for cache plugin files\/tables<br \/>\nenv: [{name: ANSIBLE_CACHE_PLUGIN_PREFIX}]<br \/>\nini:<br \/>\n&#8211; {key: fact_caching_prefix, section: defaults}<br \/>\nyaml: {key: facts.cache.prefix}<br \/>\nCACHE_PLUGIN_TIMEOUT:<br \/>\nname: Cache Plugin expiration timeout<br \/>\ndefault: 86400<br \/>\ndescription: Expiration timeout for the cache plugin data<br \/>\nenv: [{name: ANSIBLE_CACHE_PLUGIN_TIMEOUT}]<br \/>\nini:<br \/>\n&#8211; {key: fact_caching_timeout, section: defaults}<br \/>\ntype: integer<br \/>\nyaml: {key: facts.cache.timeout}<br \/>\nCOLOR_CHANGED:<br \/>\nname: Color for &#8216;changed&#8217; task status<br \/>\ndefault: yellow<br \/>\ndescription: Defines the color to use on &#8216;Changed&#8217; task status<br \/>\nenv: [{name: ANSIBLE_COLOR_CHANGED}]<br \/>\nini:<br \/>\n&#8211; {key: changed, section: colors}<br \/>\nyaml: {key: display.colors.changed}<br \/>\nCOLOR_DEBUG:<br \/>\nname: Color for debug statements<br \/>\ndefault: dark gray<br \/>\ndescription: Defines the color to use when emitting debug messages<br \/>\nenv: [{name: ANSIBLE_COLOR_DEBUG}]<br \/>\nini:<br \/>\n&#8211; {key: debug, section: colors}<br \/>\nyaml: {key: display.colors.debug}<br \/>\nCOLOR_DEPRECATE:<br \/>\nname: Color for deprecation messages<br \/>\ndefault: purple<br \/>\ndescription: Defines the color to use when emitting deprecation messages<br \/>\nenv: [{name: ANSIBLE_COLOR_DEPRECATE}]<br \/>\nini:<br \/>\n&#8211; {key: deprecate, section: colors}<br \/>\nyaml: {key: display.colors.deprecate}<br \/>\nCOLOR_DIFF_ADD:<br \/>\nname: Color for diff added display<br \/>\ndefault: green<br \/>\ndescription: Defines the color to use when showing added lines in diffs<br \/>\nenv: [{name: ANSIBLE_COLOR_DIFF_ADD}]<br \/>\nini:<br \/>\n&#8211; {key: diff_add, section: colors}<br \/>\nyaml: {key: display.colors.diff.add}<br \/>\nCOLOR_DIFF_LINES:<br \/>\nname: Color for diff lines display<br \/>\ndefault: cyan<br \/>\ndescription: Defines the color to use when showing diffs<br \/>\nenv: [{name: ANSIBLE_COLOR_DIFF_LINES}]<br \/>\nini:<br \/>\n&#8211; {key: diff_lines, section: colors}<br \/>\nCOLOR_DIFF_REMOVE:<br \/>\nname: Color for diff removed display<br \/>\ndefault: red<br \/>\ndescription: Defines the color to use when showing removed lines in diffs<br \/>\nenv: [{name: ANSIBLE_COLOR_DIFF_REMOVE}]<br \/>\nini:<br \/>\n&#8211; {key: diff_remove, section: colors}<br \/>\nCOLOR_ERROR:<br \/>\nname: Color for error messages<br \/>\ndefault: red<br \/>\ndescription: Defines the color to use when emitting error messages<br \/>\nenv: [{name: ANSIBLE_COLOR_ERROR}]<br \/>\nini:<br \/>\n&#8211; {key: error, section: colors}<br \/>\nyaml: {key: colors.error}<br \/>\nCOLOR_HIGHLIGHT:<br \/>\nname: Color for highlighting<br \/>\ndefault: white<br \/>\ndescription: Color used for highlights<br \/>\nenv: [{name: ANSIBLE_COLOR_HIGHLIGHT}]<br \/>\nini:<br \/>\n&#8211; {key: highlight, section: colors}<br \/>\nCOLOR_OK:<br \/>\nname: Color for &#8216;ok&#8217; task status<br \/>\ndefault: green<br \/>\ndescription: Defines the color to use when showing &#8216;OK&#8217; task status<br \/>\nenv: [{name: ANSIBLE_COLOR_OK}]<br \/>\nini:<br \/>\n&#8211; {key: ok, section: colors}<br \/>\nCOLOR_SKIP:<br \/>\nname: Color for &#8216;skip&#8217; task status<br \/>\ndefault: cyan<br \/>\ndescription: Defines the color to use when showing &#8216;Skipped&#8217; task status<br \/>\nenv: [{name: ANSIBLE_COLOR_SKIP}]<br \/>\nini:<br \/>\n&#8211; {key: skip, section: colors}<br \/>\nCOLOR_UNREACHABLE:<br \/>\nname: Color for &#8216;unreachable&#8217; host state<br \/>\ndefault: bright red<br \/>\ndescription: Defines the color to use on &#8216;Unreachable&#8217; status<br \/>\nenv: [{name: ANSIBLE_COLOR_UNREACHABLE}]<br \/>\nini:<br \/>\n&#8211; {key: unreachable, section: colors}<br \/>\nCOLOR_VERBOSE:<br \/>\nname: Color for verbose messages<br \/>\ndefault: blue<br \/>\ndescription: Defines the color to use when emitting verbose messages. i.e those that show with &#8216;-v&#8217;s.<br \/>\nenv: [{name: ANSIBLE_COLOR_VERBOSE}]<br \/>\nini:<br \/>\n&#8211; {key: verbose, section: colors}<br \/>\nCOLOR_WARN:<br \/>\nname: Color for warning messages<br \/>\ndefault: bright purple<br \/>\ndescription: Defines the color to use when emitting warning messages<br \/>\nenv: [{name: ANSIBLE_COLOR_WARN}]<br \/>\nini:<br \/>\n&#8211; {key: warn, section: colors}<br \/>\nCOMMAND_WARNINGS:<br \/>\nname: Command module warnings<br \/>\ndefault: True<br \/>\ndescription:<br \/>\n&#8211; By default Ansible will issue a warning when the shell or command module is used and the command appears to be similar to an existing Ansible module.<br \/>\n&#8211; These warnings can be silenced by adjusting this setting to False. You can also control this at the task level with the module optoin &#8220;warn&#8220;.<br \/>\nenv: [{name: ANSIBLE_COMMAND_WARNINGS}]<br \/>\nini:<br \/>\n&#8211; {key: command_warnings, section: defaults}<br \/>\ntype: boolean<br \/>\nversion_added: &#8220;1.8&#8221;<br \/>\nDEFAULT_ACTION_PLUGIN_PATH:<br \/>\nname: Action plugins path<br \/>\ndefault: ~\/.ansible\/plugins\/action:\/usr\/share\/ansible\/plugins\/action<br \/>\ndescription: Colon separated paths in which Ansible will search for Action Plugins.<br \/>\nenv: [{name: ANSIBLE_ACTION_PLUGINS}]<br \/>\nini:<br \/>\n&#8211; {key: action_plugins, section: defaults}<br \/>\ntype: pathspec<br \/>\nyaml: {key: plugins.action.path}<br \/>\nDEFAULT_ALLOW_UNSAFE_LOOKUPS:<br \/>\nname: Allow unsafe lookups<br \/>\ndefault: False<br \/>\ndescription:<br \/>\n&#8211; &#8220;When enabled, this option allows lookup plugins (whether used in variables as &#8220;{{lookup(&#8216;foo&#8217;)}}&#8220; or as a loop as with_foo)<br \/>\nto return data that is not marked &#8216;unsafe&#8217;.&#8221;<br \/>\n&#8211; By default, such data is marked as unsafe to prevent the templating engine from evaluating any jinja2 templating language,<br \/>\nas this could represent a security risk. This option is provided to allow for backwards-compatibility,<br \/>\nhowever users should first consider adding allow_unsafe=True to any lookups which may be expected to contain data which may be run<br \/>\nthrough the templating engine late<br \/>\nenv: []<br \/>\nini:<br \/>\n&#8211; {key: allow_unsafe_lookups, section: defaults}<br \/>\ntype: boolean<br \/>\nversion_added: &#8220;2.2.3&#8221;<br \/>\nDEFAULT_ASK_PASS:<br \/>\nname: Ask for the login password<br \/>\ndefault: False<br \/>\ndescription:<br \/>\n&#8211; This controls whether an Ansible playbook should prompt for a login password.<br \/>\nIf using SSH keys for authentication, you probably do not needed to change this setting.<br \/>\nenv: [{name: ANSIBLE_ASK_PASS}]<br \/>\nini:<br \/>\n&#8211; {key: ask_pass, section: defaults}<br \/>\ntype: boolean<br \/>\nyaml: {key: defaults.ask_pass}<br \/>\nDEFAULT_ASK_SUDO_PASS:<br \/>\nname: Ask for the sudo password<br \/>\ndefault: False<br \/>\ndeprecated:<br \/>\nwhy: In favor of become which is a generic framework<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: become<br \/>\ndescription:<br \/>\n&#8211; This controls whether an Ansible playbook should prompt for a sudo password.<br \/>\nenv: [{name: ANSIBLE_ASK_SUDO_PASS}]<br \/>\nini:<br \/>\n&#8211; {key: ask_sudo_pass, section: defaults}<br \/>\ntype: boolean<br \/>\nDEFAULT_ASK_SU_PASS:<br \/>\nname: Ask for the su password<br \/>\ndefault: False<br \/>\ndeprecated:<br \/>\nwhy: In favor of become which is a generic framework<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: become<br \/>\ndescription:<br \/>\n&#8211; This controls whether an Ansible playbook should prompt for a su password.<br \/>\nenv: [{name: ANSIBLE_ASK_SU_PASS}]<br \/>\nini:<br \/>\n&#8211; {key: ask_su_pass, section: defaults}<br \/>\ntype: boolean<br \/>\nDEFAULT_ASK_VAULT_PASS:<br \/>\nname: Ask for the vault password(s)<br \/>\ndefault: False<br \/>\ndescription:<br \/>\n&#8211; This controls whether an Ansible playbook should prompt for a vault password.<br \/>\nenv: [{name: ANSIBLE_ASK_VAULT_PASS}]<br \/>\nini:<br \/>\n&#8211; {key: ask_vault_pass, section: defaults}<br \/>\ntype: boolean<br \/>\nDEFAULT_BECOME:<br \/>\nname: Enable privilege escalation (become)<br \/>\ndefault: False<br \/>\ndescription: Toggles the use of privilege escalation, allowing you to &#8216;become&#8217; another user after login.<br \/>\nenv: [{name: ANSIBLE_BECOME}]<br \/>\nini:<br \/>\n&#8211; {key: become, section: privilege_escalation}<br \/>\ntype: boolean<br \/>\nDEFAULT_BECOME_ASK_PASS:<br \/>\nname: Ask for the privelege escalation (become) password<br \/>\ndefault: False<br \/>\ndescription: Toggle to prompt for privilege escalation password.<br \/>\nenv: [{name: ANSIBLE_BECOME_ASK_PASS}]<br \/>\nini:<br \/>\n&#8211; {key: become_ask_pass, section: privilege_escalation}<br \/>\ntype: boolean<br \/>\nDEFAULT_BECOME_METHOD:<br \/>\nname: Choose privilege escalation method<br \/>\ndefault: &#8216;sudo&#8217;<br \/>\ndescription: Privilege escalation method to use when `become` is enabled.<br \/>\nenv: [{name: ANSIBLE_BECOME_METHOD}]<br \/>\nini:<br \/>\n&#8211; {section: privilege_escalation, key: become_method}<br \/>\nDEFAULT_BECOME_EXE:<br \/>\nname: Choose &#8216;become&#8217; executable<br \/>\ndefault: ~<br \/>\ndescription: &#8216;executable to use for privilege escalation, otherwise Ansible will depend on PATH&#8217;<br \/>\nenv: [{name: ANSIBLE_BECOME_EXE}]<br \/>\nini:<br \/>\n&#8211; {key: become_exe, section: privilege_escalation}<br \/>\nDEFAULT_BECOME_FLAGS:<br \/>\nname: Set &#8216;become&#8217; executable options<br \/>\ndefault: &#8221;<br \/>\ndescription: Flags to pass to the privilege escalation executable.<br \/>\nenv: [{name: ANSIBLE_BECOME_FLAGS}]<br \/>\nini:<br \/>\n&#8211; {key: become_flags, section: privilege_escalation}<br \/>\nDEFAULT_BECOME_USER:<br \/>\n# FIXME: should really be blank and make -u passing optional depending on it<br \/>\nname: Set the user you &#8216;become&#8217; via privlege escalation<br \/>\ndefault: root<br \/>\ndescription: The user your login\/remote user &#8216;becomes&#8217; when using privilege escalation, most systems will use &#8216;root&#8217; when no user is specified.<br \/>\nenv: [{name: ANSIBLE_BECOME_USER}]<br \/>\nini:<br \/>\n&#8211; {key: become_user, section: privilege_escalation}<br \/>\nyaml: {key: become.user}<br \/>\nDEFAULT_CACHE_PLUGIN_PATH:<br \/>\nname: Cache Plugins Path<br \/>\ndefault: ~\/.ansible\/plugins\/cache:\/usr\/share\/ansible\/plugins\/cache<br \/>\ndescription: Colon separated paths in which Ansible will search for Cache Plugins.<br \/>\nenv: [{name: ANSIBLE_CACHE_PLUGINS}]<br \/>\nini:<br \/>\n&#8211; {key: cache_plugins, section: defaults}<br \/>\ntype: pathspec<br \/>\nDEFAULT_CALLABLE_WHITELIST:<br \/>\nname: Template &#8216;callable&#8217; whitelist<br \/>\ndefault: []<br \/>\ndescription: Whitelist of callable methods to be made available to template evaluation<br \/>\nenv: [{name: ANSIBLE_CALLABLE_WHITELIST}]<br \/>\nini:<br \/>\n&#8211; {key: callable_whitelist, section: defaults}<br \/>\ntype: list<br \/>\nDEFAULT_CALLBACK_PLUGIN_PATH:<br \/>\nname: Callback Plugins Path<br \/>\ndefault: ~\/.ansible\/plugins\/callback:\/usr\/share\/ansible\/plugins\/callback<br \/>\ndescription: Colon separated paths in which Ansible will search for Callback Plugins.<br \/>\nenv: [{name: ANSIBLE_CALLBACK_PLUGINS}]<br \/>\nini:<br \/>\n&#8211; {key: callback_plugins, section: defaults}<br \/>\ntype: pathspec<br \/>\nyaml: {key: plugins.callback.path}<br \/>\nDEFAULT_CALLBACK_WHITELIST:<br \/>\nname: Callback Whitelist<br \/>\ndefault: []<br \/>\ndescription:<br \/>\n&#8211; &#8220;List of whitelisted callbacks, not all callbacks need whitelisting,<br \/>\nbut many of those shipped with Ansible do as we don&#8217;t want them activated by default.&#8221;<br \/>\nenv: [{name: ANSIBLE_CALLBACK_WHITELIST}]<br \/>\nini:<br \/>\n&#8211; {key: callback_whitelist, section: defaults}<br \/>\ntype: list<br \/>\nyaml: {key: plugins.callback.whitelist}<br \/>\nDEFAULT_CONNECTION_PLUGIN_PATH:<br \/>\nname: Connection Plugins Path<br \/>\ndefault: ~\/.ansible\/plugins\/connection:\/usr\/share\/ansible\/plugins\/connection<br \/>\ndescription: Colon separated paths in which Ansible will search for Connection Plugins.<br \/>\nenv: [{name: ANSIBLE_CONNECTION_PLUGINS}]<br \/>\nini:<br \/>\n&#8211; {key: connection_plugins, section: defaults}<br \/>\ntype: pathspec<br \/>\nyaml: {key: plugins.connection.path}<br \/>\nDEFAULT_DEBUG:<br \/>\nname: Debug mode<br \/>\ndefault: False<br \/>\ndescription: Toggles debug output in Ansible, VERY verbose and can hinder multiprocessing.<br \/>\nenv: [{name: ANSIBLE_DEBUG}]<br \/>\nini:<br \/>\n&#8211; {key: debug, section: defaults}<br \/>\ntype: boolean<br \/>\nDEFAULT_EXECUTABLE:<br \/>\nname: Target shell executable<br \/>\ndefault: \/bin\/sh<br \/>\ndescription:<br \/>\n&#8211; &#8220;This indicates the command to use to spawn a shell under for Ansible&#8217;s execution needs on a target.<br \/>\nUsers may need to change this in rare instances when shell usage is constrained, but in most cases it may be left as is.&#8221;<br \/>\nenv: [{name: ANSIBLE_EXECUTABLE}]<br \/>\nini:<br \/>\n&#8211; {key: executable, section: defaults}<br \/>\nDEFAULT_FACT_PATH:<br \/>\nname: local fact path<br \/>\ndefault: ~<br \/>\ndescription:<br \/>\n&#8211; &#8220;This option allows you to globally configure a custom path for &#8216;local_facts&#8217; for the implied M(setup) task when using fact gathering.&#8221;<br \/>\n&#8211; &#8220;If not set, it will fallback to the default from the M(setup) module: &#8220;\/etc\/ansible\/facts.d&#8220;.&#8221;<br \/>\n&#8211; &#8220;This does **not** affect user defined tasks that use the M(setup) module.&#8221;<br \/>\nenv: [{name: ANSIBLE_FACT_PATH}]<br \/>\nini:<br \/>\n&#8211; {key: fact_path, section: defaults}<br \/>\ntype: path<br \/>\nyaml: {key: facts.gathering.fact_path}<br \/>\nDEFAULT_FILTER_PLUGIN_PATH:<br \/>\nname: Jinja2 Filter Plugins Path<br \/>\ndefault: ~\/.ansible\/plugins\/filter:\/usr\/share\/ansible\/plugins\/filter<br \/>\ndescription: Colon separated paths in which Ansible will search for Jinja2 Filter Plugins.<br \/>\nenv: [{name: ANSIBLE_FILTER_PLUGINS}]<br \/>\nini:<br \/>\n&#8211; {key: filter_plugins, section: defaults}<br \/>\ntype: pathspec<br \/>\nDEFAULT_FORCE_HANDLERS:<br \/>\nname: Force handlers to run after failure<br \/>\ndefault: False<br \/>\ndescription:<br \/>\n&#8211; This option controls if notified handlers run on a host even if a failure occurs on that host.<br \/>\n&#8211; When false, the handlers will not run if a failure has occurred on a host.<br \/>\n&#8211; This can also be set per play or on the command line. See Handlers and Failure for more details.<br \/>\nenv: [{name: ANSIBLE_FORCE_HANDLERS}]<br \/>\nini:<br \/>\n&#8211; {key: force_handlers, section: defaults}<br \/>\ntype: boolean<br \/>\nversion_added: &#8220;1.9.1&#8221;<br \/>\nDEFAULT_FORKS:<br \/>\nname: Number of task forks<br \/>\ndefault: 5<br \/>\ndescription: Maximum number of forks Ansible will use to execute tasks on target hosts.<br \/>\nenv: [{name: ANSIBLE_FORKS}]<br \/>\nini:<br \/>\n&#8211; {key: forks, section: defaults}<br \/>\ntype: integer<br \/>\nDEFAULT_GATHERING:<br \/>\nname: Gathering behaviour<br \/>\ndefault: &#8216;implicit&#8217;<br \/>\ndescription:<br \/>\n&#8211; This setting controls the default policy of fact gathering (facts discovered about remote systems).<br \/>\n&#8211; &#8220;When &#8216;implicit&#8217; (the default), the cache plugin will be ignored and facts will be gathered per play unless &#8216;gather_facts: False&#8217; is set.&#8221;<br \/>\n&#8211; &#8220;When &#8216;explicit&#8217; the inverse is true, facts will not be gathered unless directly requested in the play.&#8221;<br \/>\n&#8211; &#8220;The &#8216;smart&#8217; value means each new host that has no facts discovered will be scanned,<br \/>\nbut if the same host is addressed in multiple plays it will not be contacted again in the playbook run.&#8221;<br \/>\n&#8211; &#8220;This option can be useful for those wishing to save fact gathering time. Both &#8216;smart&#8217; and &#8216;explicit&#8217; will use the cache plugin.&#8221;<br \/>\nenv: [{name: ANSIBLE_GATHERING}]<br \/>\nini:<br \/>\n&#8211; key: gathering<br \/>\nsection: defaults<br \/>\nversion_added: &#8220;1.6&#8221;<br \/>\nchoices: [&#8216;smart&#8217;, &#8216;explicit&#8217;, &#8216;implicit&#8217;]<br \/>\nDEFAULT_GATHER_SUBSET:<br \/>\nname: Gather facts subset<br \/>\ndefault: &#8216;all&#8217;<br \/>\ndescription:<br \/>\n&#8211; Set the `gather_subset` option for the M(setup) task in the implicit fact gathering.<br \/>\nSee the module documentation for specifics.<br \/>\n&#8211; &#8220;It does **not** apply to user defined M(setup) tasks.&#8221;<br \/>\nenv: [{name: ANSIBLE_GATHER_SUBSET}]<br \/>\nini:<br \/>\n&#8211; key: gather_subset<br \/>\nsection: defaults<br \/>\nversion_added: &#8220;2.1&#8221;<br \/>\nDEFAULT_GATHER_TIMEOUT:<br \/>\nname: Gather facts timeout<br \/>\ndefault: 10<br \/>\ndescription:<br \/>\n&#8211; Set the timeout in seconds for the implicit fact gathering.<br \/>\n&#8211; &#8220;It does **not** apply to user defined M(setup) tasks.&#8221;<br \/>\nenv: [{name: ANSIBLE_GATHER_TIMEOUT}]<br \/>\nini:<br \/>\n&#8211; {key: gather_timeout, section: defaults}<br \/>\ntype: integer<br \/>\nyaml: {key: defaults.gather_timeout}<br \/>\nDEFAULT_HANDLER_INCLUDES_STATIC:<br \/>\nname: Make handler M(include) static<br \/>\ndefault: False<br \/>\ndescription:<br \/>\n&#8211; &#8220;Since 2.0 M(include) can be &#8216;dynamic&#8217;, this setting (if True) forces that if the include appears in a &#8220;handlers&#8220; section to be &#8216;static&#8217;.&#8221;<br \/>\nenv: [{name: ANSIBLE_HANDLER_INCLUDES_STATIC}]<br \/>\nini:<br \/>\n&#8211; {key: handler_includes_static, section: defaults}<br \/>\ntype: boolean<br \/>\ndeprecated:<br \/>\nwhy: include itself is deprecated and this setting will not matter in the future<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: none as its already built into the decision between include_tasks and import_tasks<br \/>\nDEFAULT_HASH_BEHAVIOUR:<br \/>\nname: Hash merge behaviour<br \/>\ndefault: replace<br \/>\ntype: string<br \/>\nchoices: [&#8220;replace&#8221;, &#8220;merge&#8221;]<br \/>\ndescription:<br \/>\n&#8211; This setting controls how variables merge in Ansible.<br \/>\nBy default Ansible will override variables in specific precedence orders, as described in Variables.<br \/>\nWhen a variable of higher precedence wins, it will replace the other value.<br \/>\n&#8211; &#8220;Some users prefer that variables that are hashes (aka &#8216;dictionaries&#8217; in Python terms) are merged.<br \/>\nThis setting is called &#8216;merge&#8217;. This is not the default behavior and it does not affect variables whose values are scalars<br \/>\n(integers, strings) or arrays. We generally recommend not using this setting unless you think you have an absolute need for it,<br \/>\nand playbooks in the official examples repos do not use this setting&#8221;<br \/>\n&#8211; In version 2.0 a &#8220;combine&#8220; filter was added to allow doing this for a particular variable (described in Filters).<br \/>\nenv: [{name: ANSIBLE_HASH_BEHAVIOUR}]<br \/>\nini:<br \/>\n&#8211; {key: hash_behaviour, section: defaults}<br \/>\nDEFAULT_HOST_LIST:<br \/>\nname: Inventory Source<br \/>\ndefault: \/etc\/ansible\/hosts<br \/>\ndescription: Colon separated list of Ansible inventory sources<br \/>\nenv:<br \/>\n&#8211; name: ANSIBLE_HOSTS<br \/>\ndeprecated:<br \/>\nwhy: The variable is misleading as it can be a list of hosts and\/or paths to inventory sources<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: ANSIBLE_INVENTORY<br \/>\n&#8211; name: ANSIBLE_INVENTORY<br \/>\nexpand_relative_paths: True<br \/>\nini:<br \/>\n&#8211; key: hostfile<br \/>\nsection: defaults<br \/>\ndeprecated:<br \/>\nwhy: The key is misleading as it can also be a list of hosts, a directory or a list of paths<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: &#8220;[defaults]\\ninventory=\/path\/to\/file|dir&#8221;<br \/>\n&#8211; key: inventory<br \/>\nsection: defaults<br \/>\ntype: pathlist<br \/>\nyaml: {key: defaults.inventory}<br \/>\nDEFAULT_INTERNAL_POLL_INTERVAL:<br \/>\nname: Internal poll interval<br \/>\ndefault: 0.001<br \/>\nenv: []<br \/>\nini:<br \/>\n&#8211; {key: internal_poll_interval, section: defaults}<br \/>\ntype: float<br \/>\nversion_added: &#8220;2.2&#8221;<br \/>\ndescription:<br \/>\n&#8211; This sets the interval (in seconds) of Ansible internal processes polling each other.<br \/>\nLower values improve performance with large playbooks at the expense of extra CPU load.<br \/>\nHigher values are more suitable for Ansible usage in automation scenarios,<br \/>\nwhen UI responsiveness is not required but CPU usage might be a concern.<br \/>\n&#8211; &#8220;The default corresponds to the value hardcoded in Ansible &lt;= 2.1&#8221;<br \/>\nDEFAULT_INVENTORY_PLUGIN_PATH:<br \/>\nname: Inventory Plugins Path<br \/>\ndefault: ~\/.ansible\/plugins\/inventory:\/usr\/share\/ansible\/plugins\/inventory<br \/>\ndescription: Colon separated paths in which Ansible will search for Inventory Plugins.<br \/>\nenv: [{name: ANSIBLE_INVENTORY_PLUGINS}]<br \/>\nini:<br \/>\n&#8211; {key: inventory_plugins, section: defaults}<br \/>\ntype: pathspec<br \/>\nDEFAULT_JINJA2_EXTENSIONS:<br \/>\nname: Enabled Jinja2 extensions<br \/>\ndefault: []<br \/>\ndescription:<br \/>\n&#8211; This is a developer-specific feature that allows enabling additional Jinja2 extensions.<br \/>\n&#8211; &#8220;See the Jinja2 documentation for details. If you do not know what these do, you probably don&#8217;t need to change this setting :)&#8221;<br \/>\nenv: [{name: ANSIBLE_JINJA2_EXTENSIONS}]<br \/>\nini:<br \/>\n&#8211; {key: jinja2_extensions, section: defaults}<br \/>\nDEFAULT_KEEP_REMOTE_FILES:<br \/>\nname: Keep remote files<br \/>\ndefault: False<br \/>\ndescription: Enables\/disables the cleaning up of the temporary files Ansible used to execute the tasks on the remote.<br \/>\nenv: [{name: ANSIBLE_KEEP_REMOTE_FILES}]<br \/>\nini:<br \/>\n&#8211; {key: keep_remote_files, section: defaults}<br \/>\ntype: boolean<br \/>\nDEFAULT_LIBVIRT_LXC_NOSECLABEL:<br \/>\n# TODO: move to plugin<br \/>\nname: No security label on Lxc<br \/>\ndefault: False<br \/>\ndescription:<br \/>\n&#8211; &#8220;This setting causes libvirt to connect to lxc containers by passing &#8211;noseclabel to virsh.<br \/>\nThis is necessary when running on systems which do not have SELinux.&#8221;<br \/>\nenv: [{name: LIBVIRT_LXC_NOSECLABEL}]<br \/>\nini:<br \/>\n&#8211; {key: libvirt_lxc_noseclabel, section: selinux}<br \/>\ntype: boolean<br \/>\nversion_added: &#8220;2.1&#8221;<br \/>\nDEFAULT_LOAD_CALLBACK_PLUGINS:<br \/>\nname: Load callbacks for adhoc<br \/>\ndefault: False<br \/>\ndescription:<br \/>\n&#8211; Controls whether callback plugins are loaded when running \/usr\/bin\/ansible.<br \/>\nThis may be used to log activity from the command line, send notifications, and so on.<br \/>\nCallback plugins are always loaded for &#8220;ansible-playbook&#8220;.<br \/>\nenv: [{name: ANSIBLE_LOAD_CALLBACK_PLUGINS}]<br \/>\nini:<br \/>\n&#8211; {key: bin_ansible_callbacks, section: defaults}<br \/>\ntype: boolean<br \/>\nversion_added: &#8220;1.8&#8221;<br \/>\nDEFAULT_LOCAL_TMP:<br \/>\nname: Controller temporary directory<br \/>\ndefault: ~\/.ansible\/tmp<br \/>\ndescription: Temporary directory for Ansible to use on the controller.<br \/>\nenv: [{name: ANSIBLE_LOCAL_TEMP}]<br \/>\nini:<br \/>\n&#8211; {key: local_tmp, section: defaults}<br \/>\ntype: tmppath<br \/>\nDEFAULT_LOG_PATH:<br \/>\nname: Ansible log file path<br \/>\ndefault: &#8221;<br \/>\ndescription: File to which Ansible will log on the controller. When empty logging is disabled.<br \/>\nenv: [{name: ANSIBLE_LOG_PATH}]<br \/>\nini:<br \/>\n&#8211; {key: log_path, section: defaults}<br \/>\ntype: path<br \/>\nDEFAULT_LOOKUP_PLUGIN_PATH:<br \/>\nname: Lookup Plugins Path<br \/>\ndescription: Colon separated paths in which Ansible will search for Lookup Plugins.<br \/>\ndefault: ~\/.ansible\/plugins\/lookup:\/usr\/share\/ansible\/plugins\/lookup<br \/>\nenv: [{name: ANSIBLE_LOOKUP_PLUGINS}]<br \/>\nini:<br \/>\n&#8211; {key: lookup_plugins, section: defaults}<br \/>\ntype: pathspec<br \/>\nyaml: {key: defaults.lookup_plugins}<br \/>\nDEFAULT_MANAGED_STR:<br \/>\nname: Ansible managed<br \/>\ndefault: &#8216;Ansible managed&#8217;<br \/>\ndescription: Sets the macro for the &#8216;ansible_managed&#8217; variable available for M(template) tasks.<br \/>\nenv: []<br \/>\nini:<br \/>\n&#8211; {key: ansible_managed, section: defaults}<br \/>\nyaml: {key: defaults.ansible_managed}<br \/>\nDEFAULT_MODULE_ARGS:<br \/>\nname: Adhoc default arguments<br \/>\ndefault: &#8221;<br \/>\ndescription:<br \/>\n&#8211; This sets the default arguments to pass to the &#8220;ansible&#8220; adhoc binary if no &#8220;-a&#8220; is specified.<br \/>\nenv: [{name: ANSIBLE_MODULE_ARGS}]<br \/>\nini:<br \/>\n&#8211; {key: module_args, section: defaults}<br \/>\nDEFAULT_MODULE_COMPRESSION:<br \/>\nname: Python module compression<br \/>\ndefault: ZIP_DEFLATED<br \/>\ndescription: Compression scheme to use when transfering Python modules to the target.<br \/>\nenv: []<br \/>\nini:<br \/>\n&#8211; {key: module_compression, section: defaults}<br \/>\n# vars:<br \/>\n# &#8211; name: ansible_module_compression<br \/>\nDEFAULT_MODULE_LANG:<br \/>\nname: Target language environment<br \/>\ndefault: &#8220;{{CONTROLER_LANG}}&#8221;<br \/>\ndescription: &#8220;Language locale setting to use for modules when they execute on the target, if empty it defaults to &#8216;en_US.UTF-8&#8242;&#8221;<br \/>\nenv: [{name: ANSIBLE_MODULE_LANG}]<br \/>\nini:<br \/>\n&#8211; {key: module_lang, section: defaults}<br \/>\n# vars:<br \/>\n# &#8211; name: ansible_module_lang<br \/>\nDEFAULT_MODULE_NAME:<br \/>\nname: Default adhoc module<br \/>\ndefault: command<br \/>\ndescription: &#8220;Module to use with the &#8220;ansible&#8220; AdHoc command, if none is specified via &#8220;-m&#8220;.&#8221;<br \/>\nenv: []<br \/>\nini:<br \/>\n&#8211; {key: module_name, section: defaults}<br \/>\nDEFAULT_MODULE_PATH:<br \/>\nname: Modules Path<br \/>\ndescription: Colon separated paths in which Ansible will search for Modules.<br \/>\ndefault: ~\/.ansible\/plugins\/modules:\/usr\/share\/ansible\/plugins\/modules<br \/>\nenv: [{name: ANSIBLE_LIBRARY}]<br \/>\nini:<br \/>\n&#8211; {key: library, section: defaults}<br \/>\ntype: pathspec<br \/>\nDEFAULT_MODULE_SET_LOCALE:<br \/>\nname: Target locale<br \/>\ndefault: False<br \/>\ndescription: Controls if we set locale for modules when executing on the target.<br \/>\nenv: [{name: ANSIBLE_MODULE_SET_LOCALE}]<br \/>\nini:<br \/>\n&#8211; {key: module_set_locale, section: defaults}<br \/>\ntype: boolean<br \/>\n# vars:<br \/>\n# &#8211; name: ansible_module_locale<br \/>\nDEFAULT_MODULE_UTILS_PATH:<br \/>\nname: Module Utils Path<br \/>\ndescription: Colon separated paths in which Ansible will search for Module utils files, which are shared by modules.<br \/>\ndefault: ~\/.ansible\/plugins\/module_utils:\/usr\/share\/ansible\/plugins\/module_utils<br \/>\nenv: [{name: ANSIBLE_MODULE_UTILS}]<br \/>\nini:<br \/>\n&#8211; {key: module_utils, section: defaults}<br \/>\ntype: pathspec<br \/>\nDEFAULT_NO_LOG:<br \/>\nname: No log<br \/>\ndefault: False<br \/>\ndescription: &#8220;Toggle Ansible&#8217;s display and logging of task details, mainly used to avoid security disclosures.&#8221;<br \/>\nenv: [{name: ANSIBLE_NO_LOG}]<br \/>\nini:<br \/>\n&#8211; {key: no_log, section: defaults}<br \/>\ntype: boolean<br \/>\nDEFAULT_NO_TARGET_SYSLOG:<br \/>\nname: No syslog on target<br \/>\ndefault: False<br \/>\ndescription: Toggle Ansbile logging to syslog on the target when it executes tasks.<br \/>\nenv: [{name: ANSIBLE_NO_TARGET_SYSLOG}]<br \/>\nini:<br \/>\n&#8211; {key: no_target_syslog, section: defaults}<br \/>\ntype: boolean<br \/>\nyaml: {key: defaults.no_target_syslog}<br \/>\nDEFAULT_NULL_REPRESENTATION:<br \/>\nname: Represent a null<br \/>\ndefault: ~<br \/>\ndescription: What templating should return as a &#8216;null&#8217; value. When not set it will let Jinja2 decide.<br \/>\nenv: [{name: ANSIBLE_NULL_REPRESENTATION}]<br \/>\nini:<br \/>\n&#8211; {key: null_representation, section: defaults}<br \/>\ntype: none<br \/>\nDEFAULT_POLL_INTERVAL:<br \/>\nname: Async poll interval<br \/>\ndefault: 15<br \/>\ndescription:<br \/>\n&#8211; For asynchronous tasks in Ansible (covered in Asynchronous Actions and Polling),<br \/>\nthis is how often to check back on the status of those tasks when an explicit poll interval is not supplied.<br \/>\nThe default is a reasonably moderate 15 seconds which is a tradeoff between checking in frequently and<br \/>\nproviding a quick turnaround when something may have completed.<br \/>\nenv: [{name: ANSIBLE_POLL_INTERVAL}]<br \/>\nini:<br \/>\n&#8211; {key: poll_interval, section: defaults}<br \/>\ntype: integer<br \/>\nDEFAULT_PRIVATE_KEY_FILE:<br \/>\nname: Private key file<br \/>\ndefault: ~<br \/>\ndescription:<br \/>\n&#8211; Option for connections using a certificate or key file to authenticate, rather than an agent or passwords,<br \/>\nyou can set the default value here to avoid re-specifying &#8211;private-key with every invocation.<br \/>\nenv: [{name: ANSIBLE_PRIVATE_KEY_FILE}]<br \/>\nini:<br \/>\n&#8211; {key: private_key_file, section: defaults}<br \/>\ntype: path<br \/>\nDEFAULT_PRIVATE_ROLE_VARS:<br \/>\nname: Private role variables<br \/>\ndefault: False<br \/>\ndescription: &#8221;<br \/>\nenv: [{name: ANSIBLE_PRIVATE_ROLE_VARS}]<br \/>\nini:<br \/>\n&#8211; {key: private_role_vars, section: defaults}<br \/>\ntype: boolean<br \/>\nyaml: {key: defaults.private_role_vars}<br \/>\nDEFAULT_REMOTE_PORT:<br \/>\nname: Remote port<br \/>\ndefault: ~<br \/>\ndescription: Port to use in remote connections, when blank it will use the connection plugin default.<br \/>\nenv: [{name: ANSIBLE_REMOTE_PORT}]<br \/>\nini:<br \/>\n&#8211; {key: remote_port, section: defaults}<br \/>\ntype: integer<br \/>\nyaml: {key: defaults.remote_port}<br \/>\nDEFAULT_REMOTE_TMP:<br \/>\nname: Target temporary directory<br \/>\ndefault: ~\/.ansible\/tmp<br \/>\ndescription:<br \/>\n&#8211; Temporary directory to use on targets when executing tasks.<br \/>\n&#8211; In some cases Ansible may still choose to use a system temporary dir to avoid permission issues.<br \/>\nenv: [{name: ANSIBLE_REMOTE_TEMP}]<br \/>\nini:<br \/>\n&#8211; {key: remote_tmp, section: defaults}<br \/>\nvars:<br \/>\n&#8211; name: ansible_remote_tmp<br \/>\nDEFAULT_REMOTE_USER:<br \/>\nname: Login\/Remote User<br \/>\ndefault:<br \/>\ndescription:<br \/>\n&#8211; Sets the login user for the target machines<br \/>\n&#8211; &#8220;When blank it uses the connection plugin&#8217;s default, normally the user currently executing Ansible.&#8221;<br \/>\nenv: [{name: ANSIBLE_REMOTE_USER}]<br \/>\nini:<br \/>\n&#8211; {key: remote_user, section: defaults}<br \/>\nDEFAULT_ROLES_PATH:<br \/>\nname: Roles path<br \/>\ndefault: ~\/.ansible\/roles:\/usr\/share\/ansible\/roles:\/etc\/ansible\/roles<br \/>\ndescription: Colon separated paths in which Ansible will search for Roles.<br \/>\nenv: [{name: ANSIBLE_ROLES_PATH}]<br \/>\nexpand_relative_paths: True<br \/>\nini:<br \/>\n&#8211; {key: roles_path, section: defaults}<br \/>\ntype: pathspec<br \/>\nyaml: {key: defaults.roles_path}<br \/>\nDEFAULT_SCP_IF_SSH:<br \/>\n# TODO: move to ssh plugin<br \/>\ndefault: smart<br \/>\ndescription:<br \/>\n&#8211; &#8220;Prefered method to use when transfering files over ssh&#8221;<br \/>\n&#8211; When set to smart, Ansible will try them until one succeeds or they all fail<br \/>\n&#8211; If set to True, it will force &#8216;scp&#8217;, if False it will use &#8216;sftp&#8217;<br \/>\nenv: [{name: ANSIBLE_SCP_IF_SSH}]<br \/>\nini:<br \/>\n&#8211; {key: scp_if_ssh, section: ssh_connection}<br \/>\nDEFAULT_SELINUX_SPECIAL_FS:<br \/>\nname: Problematic file systems<br \/>\ndefault: fuse, nfs, vboxsf, ramfs, 9p<br \/>\ndescription:<br \/>\n&#8211; &#8220;Some filesystems do not support safe operations and\/or return inconsistent errors,<br \/>\nthis setting makes Ansible &#8216;tolerate&#8217; those in the list w\/o causing fatal errors.&#8221;<br \/>\n&#8211; Data corruption may occur and writes are not always verified when a filesystem is in the list.<br \/>\nenv: []<br \/>\nini:<br \/>\n&#8211; {key: special_context_filesystems, section: selinux}<br \/>\ntype: list<br \/>\nDEFAULT_SFTP_BATCH_MODE:<br \/>\n# TODO: move to ssh plugin<br \/>\ndefault: True<br \/>\ndescription: &#8216;TODO: write it&#8217;<br \/>\nenv: [{name: ANSIBLE_SFTP_BATCH_MODE}]<br \/>\nini:<br \/>\n&#8211; {key: sftp_batch_mode, section: ssh_connection}<br \/>\ntype: boolean<br \/>\nyaml: {key: ssh_connection.sftp_batch_mode}<br \/>\nDEFAULT_SQUASH_ACTIONS:<br \/>\nname: Squashable actions<br \/>\ndefault: apk, apt, dnf, homebrew, openbsd_pkg, pacman, pkgng, yum, zypper<br \/>\ndescription:<br \/>\n&#8211; Ansible can optimise actions that call modules that support list parameters when using &#8220;with_&#8220; looping.<br \/>\nInstead of calling the module once for each item, the module is called once with the full list.<br \/>\n&#8211; The default value for this setting is only for certain package managers, but it can be used for any module<br \/>\n&#8211; Currently, this is only supported for modules that have a name or pkg parameter, and only when the item is the only thing being passed to the parameter.<br \/>\nenv: [{name: ANSIBLE_SQUASH_ACTIONS}]<br \/>\nini:<br \/>\n&#8211; {key: squash_actions, section: defaults}<br \/>\ntype: list<br \/>\nversion_added: &#8220;2.0&#8221;<br \/>\nDEFAULT_SSH_TRANSFER_METHOD:<br \/>\n# TODO: move to ssh plugin<br \/>\ndefault:<br \/>\ndescription: &#8216;unused?&#8217;<br \/>\n# &#8211; &#8220;Prefered method to use when transfering files over ssh&#8221;<br \/>\n# &#8211; Setting to smart will try them until one succeeds or they all fail<br \/>\n#choices: [&#8216;sftp&#8217;, &#8216;scp&#8217;, &#8216;dd&#8217;, &#8216;smart&#8217;]<br \/>\nenv: [{name: ANSIBLE_SSH_TRANSFER_METHOD}]<br \/>\nini:<br \/>\n&#8211; {key: transfer_method, section: ssh_connection}<br \/>\nDEFAULT_STDOUT_CALLBACK:<br \/>\nname: Main display callback plugin<br \/>\ndefault: default<br \/>\ndescription:<br \/>\n&#8211; &#8220;Set the main callback used to display Ansible output, you can only have one at a time.&#8221;<br \/>\n&#8211; You can have many other callbacks, but just one can be in charge of stdout.<br \/>\nenv: [{name: ANSIBLE_STDOUT_CALLBACK}]<br \/>\nini:<br \/>\n&#8211; {key: stdout_callback, section: defaults}<br \/>\nDEFAULT_STRATEGY:<br \/>\nname: Implied strategy<br \/>\ndefault: &#8216;linear&#8217;<br \/>\ndescription: Set the default strategy used for plays.<br \/>\nenv: [{name: ANSIBLE_STRATEGY}]<br \/>\nini:<br \/>\n&#8211; {key: strategy, section: defaults}<br \/>\nversion_added: &#8220;2.3&#8221;<br \/>\nDEFAULT_STRATEGY_PLUGIN_PATH:<br \/>\nname: Strategy Plugins Path<br \/>\ndescription: Colon separated paths in which Ansible will search for Strategy Plugins.<br \/>\ndefault: ~\/.ansible\/plugins\/strategy:\/usr\/share\/ansible\/plugins\/strategy<br \/>\nenv: [{name: ANSIBLE_STRATEGY_PLUGINS}]<br \/>\nini:<br \/>\n&#8211; {key: strategy_plugins, section: defaults}<br \/>\ntype: pathspec<br \/>\nDEFAULT_SU:<br \/>\ndefault: False<br \/>\ndescription: &#8216;Toggle the use of &#8220;su&#8221; for tasks.&#8217;<br \/>\nenv: [{name: ANSIBLE_SU}]<br \/>\nini:<br \/>\n&#8211; {key: su, section: defaults}<br \/>\ntype: boolean<br \/>\nyaml: {key: defaults.su}<br \/>\nDEFAULT_SUDO:<br \/>\ndefault: False<br \/>\ndeprecated:<br \/>\nwhy: In favor of become which is a generic framework<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: become<br \/>\ndescription: &#8216;Toggle the use of &#8220;sudo&#8221; for tasks.&#8217;<br \/>\nenv: [{name: ANSIBLE_SUDO}]<br \/>\nini:<br \/>\n&#8211; {key: sudo, section: defaults}<br \/>\ntype: boolean<br \/>\nDEFAULT_SUDO_EXE:<br \/>\nname: sudo executable<br \/>\ndefault: sudo<br \/>\ndeprecated:<br \/>\nwhy: In favor of become which is a generic framework<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: become<br \/>\ndescription: &#8216;specify an &#8220;sudo&#8221; executable, otherwise it relies on PATH.&#8217;<br \/>\nenv: [{name: ANSIBLE_SUDO_EXE}]<br \/>\nini:<br \/>\n&#8211; {key: sudo_exe, section: defaults}<br \/>\nDEFAULT_SUDO_FLAGS:<br \/>\nname: sudo flags<br \/>\ndefault: &#8216;-H -S -n&#8217;<br \/>\ndeprecated:<br \/>\nwhy: In favor of become which is a generic framework<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: become<br \/>\ndescription: &#8216;Flags to pass to &#8220;sudo&#8221;&#8216;<br \/>\nenv: [{name: ANSIBLE_SUDO_FLAGS}]<br \/>\nini:<br \/>\n&#8211; {key: sudo_flags, section: defaults}<br \/>\nDEFAULT_SUDO_USER:<br \/>\nname: sudo user<br \/>\ndefault:<br \/>\ndeprecated:<br \/>\nwhy: In favor of become which is a generic framework<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: become<br \/>\ndescription: &#8216;User you become when using &#8220;sudo&#8221;, leaving it blank will use the default configured on the target (normally root)&#8217;<br \/>\nenv: [{name: ANSIBLE_SUDO_USER}]<br \/>\nini:<br \/>\n&#8211; {key: sudo_user, section: defaults}<br \/>\nDEFAULT_SU_EXE:<br \/>\nname: su executable<br \/>\ndefault: su<br \/>\ndeprecated:<br \/>\nwhy: In favor of become which is a generic framework<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: become<br \/>\ndescription: &#8216;specify an &#8220;su&#8221; executable, otherwise it relies on PATH.&#8217;<br \/>\nenv: [{name: ANSIBLE_SU_EXE}]<br \/>\nini:<br \/>\n&#8211; {key: su_exe, section: defaults}<br \/>\nDEFAULT_SU_FLAGS:<br \/>\nname: su flags<br \/>\ndefault: &#8221;<br \/>\ndeprecated:<br \/>\nwhy: In favor of become which is a generic framework<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: become<br \/>\ndescription: &#8216;Flags to pass to su&#8217;<br \/>\nenv: [{name: ANSIBLE_SU_FLAGS}]<br \/>\nini:<br \/>\n&#8211; {key: su_flags, section: defaults}<br \/>\nDEFAULT_SU_USER:<br \/>\nname: su user<br \/>\ndefault:<br \/>\ndescription: &#8216;User you become when using &#8220;su&#8221;, leaving it blank will use the default configured on the target (normally root)&#8217;<br \/>\nenv: [{name: ANSIBLE_SU_USER}]<br \/>\nini:<br \/>\n&#8211; {key: su_user, section: defaults}<br \/>\ndeprecated:<br \/>\nwhy: In favor of become which is a generic framework<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: become<br \/>\nDEFAULT_SYSLOG_FACILITY:<br \/>\nname: syslog facility<br \/>\ndefault: LOG_USER<br \/>\ndescription: Syslog facility to use when Ansible logs to the remote target<br \/>\nenv: [{name: ANSIBLE_SYSLOG_FACILITY}]<br \/>\nini:<br \/>\n&#8211; {key: syslog_facility, section: defaults}<br \/>\nDEFAULT_TASK_INCLUDES_STATIC:<br \/>\nname: Task include static<br \/>\ndefault: False<br \/>\ndescription:<br \/>\n&#8211; The `include` tasks can be static or dynamic, this toggles the default expected behaviour if autodetection fails and it is not explicitly set in task.<br \/>\nenv: [{name: ANSIBLE_TASK_INCLUDES_STATIC}]<br \/>\nini:<br \/>\n&#8211; {key: task_includes_static, section: defaults}<br \/>\ntype: boolean<br \/>\nversion_added: &#8220;2.1&#8221;<br \/>\ndeprecated:<br \/>\nwhy: include itself is deprecated and this setting will not matter in the future<br \/>\nversion: &#8220;2.8&#8221;<br \/>\nalternatives: None, as its already built into the decision between include_tasks and import_tasks<br \/>\nDEFAULT_TEST_PLUGIN_PATH:<br \/>\nname: Jinja2 Test Plugins Path<br \/>\ndescription: Colon separated paths in which Ansible will search for Jinja2 Test Plugins.<br \/>\ndefault: ~\/.ansible\/plugins\/test:\/usr\/share\/ansible\/plugins\/test<br \/>\nenv: [{name: ANSIBLE_TEST_PLUGINS}]<br \/>\nini:<br \/>\n&#8211; {key: test_plugins, section: defaults}<br \/>\ntype: pathspec<br \/>\nDEFAULT_TIMEOUT:<br \/>\nname: Connection timeout<br \/>\ndefault: 10<br \/>\ndescription: This is the default timeout for connection plugins to use.<br \/>\nenv: [{name: ANSIBLE_TIMEOUT}]<br \/>\nini:<br \/>\n&#8211; {key: timeout, section: defaults}<br \/>\ntype: integer<br \/>\nDEFAULT_TRANSPORT:<br \/>\nname: Connection plugin<br \/>\ndefault: smart<br \/>\ndescription: &#8220;Default connection plugin to use, the &#8216;smart&#8217; option will toggle between &#8216;ssh&#8217; and &#8216;paramiko&#8217; depending on controller OS and ssh versions&#8221;<br \/>\nenv: [{name: ANSIBLE_TRANSPORT}]<br \/>\nini:<br \/>\n&#8211; {key: transport, section: defaults}<br \/>\nDEFAULT_UNDEFINED_VAR_BEHAVIOR:<br \/>\nname: Jinja2 fail on undefined<br \/>\ndefault: True<br \/>\nversion_added: &#8220;1.3&#8221;<br \/>\ndescription:<br \/>\n&#8211; When True, this causes ansible templating to fail steps that reference variable names that are likely typoed.<br \/>\n&#8211; &#8220;Otherwise, any &#8216;{{ template_expression }}&#8217; that contains undefined variables will be rendered in a template or ansible action line exactly as written.&#8221;<br \/>\nenv: [{name: ANSIBLE_ERROR_ON_UNDEFINED_VARS}]<br \/>\nini:<br \/>\n&#8211; {key: error_on_undefined_vars, section: defaults}<br \/>\ntype: boolean<br \/>\nDEFAULT_VARS_PLUGIN_PATH:<br \/>\nname: Vars Plugins Path<br \/>\ndefault: ~\/.ansible\/plugins\/vars:\/usr\/share\/ansible\/plugins\/vars<br \/>\ndescription: Colon separated paths in which Ansible will search for Vars Plugins.<br \/>\nenv: [{name: ANSIBLE_VARS_PLUGINS}]<br \/>\nini:<br \/>\n&#8211; {key: vars_plugins, section: defaults}<br \/>\ntype: pathspec<br \/>\n# TODO: unused?<br \/>\n#DEFAULT_VAR_COMPRESSION_LEVEL:<br \/>\n# default: 0<br \/>\n# description: &#8216;TODO: write it&#8217;<br \/>\n# env: [{name: ANSIBLE_VAR_COMPRESSION_LEVEL}]<br \/>\n# ini:<br \/>\n# &#8211; {key: var_compression_level, section: defaults}<br \/>\n# type: integer<br \/>\n# yaml: {key: defaults.var_compression_level}<br \/>\nDEFAULT_VAULT_ID_MATCH:<br \/>\nname: Force vault id match<br \/>\ndefault: False<br \/>\ndescription: &#8216;If true, decrypting vaults with a vault id will only try the password from the matching vault-id&#8217;<br \/>\nenv: [{name: ANSIBLE_VAULT_ID_MATCH}]<br \/>\nini:<br \/>\n&#8211; {key: vault_id_match, section: defaults}<br \/>\nyaml: {key: defaults.vault_id_match}<br \/>\nDEFAULT_VAULT_IDENTITY:<br \/>\nname: Vault id label<br \/>\ndefault: default<br \/>\ndescription: &#8216;The label to use for the default vault id label in cases where a vault id label is not provided&#8217;<br \/>\nenv: [{name: ANSIBLE_VAULT_IDENTITY}]<br \/>\nini:<br \/>\n&#8211; {key: vault_identity, section: defaults}<br \/>\nyaml: {key: defaults.vault_identity}<br \/>\nDEFAULT_VAULT_IDENTITY_LIST:<br \/>\nname: Default vault ids<br \/>\ndefault: []<br \/>\ndescription: &#8216;A list of vault-ids to use by default. Equivalent to multiple &#8211;vault-id args. Vault-ids are tried in order.&#8217;<br \/>\nenv: [{name: ANSIBLE_VAULT_IDENTITY_LIST}]<br \/>\nini:<br \/>\n&#8211; {key: vault_identity_list, section: defaults}<br \/>\ntype: list<br \/>\nyaml: {key: defaults.vault_identity_list}<br \/>\nDEFAULT_VAULT_PASSWORD_FILE:<br \/>\nname: Vault password file<br \/>\ndefault: ~<br \/>\ndescription: &#8216;The vault password file to use. Equivalent to &#8211;vault-password-file or &#8211;vault-id&#8217;<br \/>\nenv: [{name: ANSIBLE_VAULT_PASSWORD_FILE}]<br \/>\nini:<br \/>\n&#8211; {key: vault_password_file, section: defaults}<br \/>\ntype: path<br \/>\nyaml: {key: defaults.vault_password_file}<br \/>\nDEFAULT_VERBOSITY:<br \/>\nname: Verbosity<br \/>\ndefault: 0<br \/>\ndescription: Sets the default verbosity, equivalent to the number of &#8220;-v&#8220; passed in the command line.<br \/>\nenv: [{name: ANSIBLE_VERBOSITY}]<br \/>\nini:<br \/>\n&#8211; {key: verbosity, section: defaults}<br \/>\ntype: integer<br \/>\nDEPRECATION_WARNINGS:<br \/>\nname: Deprecation messages<br \/>\ndefault: True<br \/>\ndescription: &#8220;Toggle to control the showing of deprecation warnings&#8221;<br \/>\nenv: [{name: ANSIBLE_DEPRECATION_WARNINGS}]<br \/>\nini:<br \/>\n&#8211; {key: deprecation_warnings, section: defaults}<br \/>\ntype: boolean<br \/>\nDIFF_ALWAYS:<br \/>\nname: Show differences<br \/>\ndefault: False<br \/>\ndescription: Configuration toggle to tell modules to show differences when in &#8216;changed&#8217; status, equivalent to &#8220;&#8211;diff&#8220;.<br \/>\nenv: [{name: ANSIBLE_DIFF_ALWAYS}]<br \/>\nini:<br \/>\n&#8211; {key: always, section: diff}<br \/>\ntype: bool<br \/>\nDIFF_CONTEXT:<br \/>\nname: Difference context<br \/>\ndefault: 3<br \/>\ndescription: How many lines of context to show when displaying the differences between files.<br \/>\nenv: [{name: ANSIBLE_DIFF_CONTEXT}]<br \/>\nini:<br \/>\n&#8211; {key: context, section: diff}<br \/>\ntype: integer<br \/>\nDISPLAY_ARGS_TO_STDOUT:<br \/>\nname: Show task arguments<br \/>\ndefault: False<br \/>\ndescription:<br \/>\n&#8211; &#8220;Normally &#8220;ansible-playbook&#8220; will print a header for each task that is run.<br \/>\nThese headers will contain the name: field from the task if you specified one.<br \/>\nIf you didn&#8217;t then &#8220;ansible-playbook&#8220; uses the task&#8217;s action to help you tell which task is presently running.<br \/>\nSometimes you run many of the same action and so you want more information about the task to differentiate it from others of the same action.<br \/>\nIf you set this variable to True in the config then &#8220;ansible-playbook&#8220; will also include the task&#8217;s arguments in the header.&#8221;<br \/>\n&#8211; &#8220;This setting defaults to False because there is a chance that you have sensitive values in your parameters and<br \/>\nyou do not want those to be printed.&#8221;<br \/>\n&#8211; &#8220;If you set this to True you should be sure that you have secured your environment&#8217;s stdout<br \/>\n(no one can shoulder surf your screen and you aren&#8217;t saving stdout to an insecure file) or<br \/>\nmade sure that all of your playbooks explicitly added the &#8220;no_log: True&#8220; parameter to tasks which have sensistive values<br \/>\nSee How do I keep secret data in my playbook? for more information.&#8221;<br \/>\nenv: [{name: ANSIBLE_DISPLAY_ARGS_TO_STDOUT}]<br \/>\nini:<br \/>\n&#8211; {key: display_args_to_stdout, section: defaults}<br \/>\ntype: boolean<br \/>\nversion_added: &#8220;2.1&#8221;<br \/>\nDISPLAY_SKIPPED_HOSTS:<br \/>\nname: Show skipped results<br \/>\ndefault: True<br \/>\ndescription: &#8220;Toggle to control displaying skipped task\/host entries in a task in the default callback&#8221;<br \/>\nenv: [{name: DISPLAY_SKIPPED_HOSTS}]<br \/>\nini:<br \/>\n&#8211; {key: display_skipped_hosts, section: defaults}<br \/>\ntype: boolean<br \/>\nERROR_ON_MISSING_HANDLER:<br \/>\nname: Missing handler error<br \/>\ndefault: True<br \/>\ndescription: &#8220;Toggle to allow missing handlers to become a warning instead of an error when notifying.&#8221;<br \/>\nenv: [{name: ANSIBLE_ERROR_ON_MISSING_HANDLER}]<br \/>\nini:<br \/>\n&#8211; {key: error_on_missing_handler, section: defaults}<br \/>\ntype: boolean<br \/>\nGALAXY_IGNORE_CERTS:<br \/>\nname: Galaxy validate certs<br \/>\ndefault: False<br \/>\ndescription:<br \/>\n&#8211; If set to yes, ansible-galaxy will not validate TLS certificates.<br \/>\nThis can be useful for testing against a server with a self-signed certificate.<br \/>\nenv: [{name: ANSIBLE_GALAXY_IGNORE}]<br \/>\nini:<br \/>\n&#8211; {key: ignore_certs, section: galaxy}<br \/>\ntype: boolean<br \/>\nGALAXY_ROLE_SKELETON:<br \/>\nname: Galaxy skeleton direcotry<br \/>\ndefault:<br \/>\ndescription: Role skeleton directory to use as a template for the &#8220;init&#8220; action in &#8220;ansible-galaxy&#8220;, same as &#8220;&#8211;role-skeleton&#8220;.<br \/>\nenv: [{name: ANSIBLE_GALAXY_ROLE_SKELETON}]<br \/>\nini:<br \/>\n&#8211; {key: role_skeleton, section: galaxy}<br \/>\ntype: path<br \/>\nGALAXY_ROLE_SKELETON_IGNORE:<br \/>\nname: Galaxy skeleton ignore<br \/>\ndefault: [&#8220;^.git$&#8221;, &#8220;^.*\/.git_keep$&#8221;]<br \/>\ndescription: patterns of files to ignore inside a galaxy role skeleton directory<br \/>\nenv: [{name: ANSIBLE_GALAXY_ROLE_SKELETON_IGNORE}]<br \/>\nini:<br \/>\n&#8211; {key: role_skeleton_ignore, section: galaxy}<br \/>\ntype: list<br \/>\n# TODO: unused?<br \/>\n#GALAXY_SCMS:<br \/>\n# name: Galaxy SCMS<br \/>\n# default: git, hg<br \/>\n# description: Available galaxy source control management systems.<br \/>\n# env: [{name: ANSIBLE_GALAXY_SCMS}]<br \/>\n# ini:<br \/>\n# &#8211; {key: scms, section: galaxy}<br \/>\n# type: list<br \/>\nGALAXY_SERVER:<br \/>\ndefault: https:\/\/galaxy.ansible.com<br \/>\ndescription: &#8220;URL to prepend when roles don&#8217;t specify the full URI, assume they are referencing this server as the source.&#8221;<br \/>\nenv: [{name: ANSIBLE_GALAXY_SERVER}]<br \/>\nini:<br \/>\n&#8211; {key: server, section: galaxy}<br \/>\nyaml: {key: galaxy.server}<br \/>\nHOST_KEY_CHECKING:<br \/>\nname: Check host keys<br \/>\ndefault: True<br \/>\ndescription: &#8216;Set this to &#8220;False&#8221; if you want to avoid host key checking by the underlying tools Ansible uses to connect to the host&#8217;<br \/>\nenv: [{name: ANSIBLE_HOST_KEY_CHECKING}]<br \/>\nini:<br \/>\n&#8211; {key: host_key_checking, section: defaults}<br \/>\ntype: boolean<br \/>\nINVENTORY_ENABLED:<br \/>\nname: Active Inventory plugins<br \/>\ndefault: [&#8216;host_list&#8217;, &#8216;script&#8217;, &#8216;yaml&#8217;, &#8216;ini&#8217;]<br \/>\ndescription: List of enabled inventory plugins, it also determines the order in which they are used.<br \/>\nenv: [{name: ANSIBLE_INVENTORY_ENABLED}]<br \/>\nini:<br \/>\n&#8211; {key: enable_plugins, section: inventory}<br \/>\ntype: list<br \/>\nINVENTORY_IGNORE_EXTS:<br \/>\nname: Inventory ignore extensions<br \/>\ndefault: &#8220;{{(BLACKLIST_EXTS + ( &#8216;~&#8217;, &#8216;.orig&#8217;, &#8216;.ini&#8217;, &#8216;.cfg&#8217;, &#8216;.retry&#8217;))}}&#8221;<br \/>\ndescription: List of extensions to ignore when using a directory as an inventory source<br \/>\nenv: [{name: ANSIBLE_INVENTORY_IGNORE}]<br \/>\nini:<br \/>\n&#8211; {key: inventory_ignore_extensions, section: defaults}<br \/>\n&#8211; {key: ignore_extensions, section: inventory}<br \/>\ntype: list<br \/>\nINVENTORY_IGNORE_PATTERNS:<br \/>\nname: Inventory ignore patterns<br \/>\ndefault: []<br \/>\ndescription: List of patterns to ignore when using a directory as an inventory source<br \/>\nenv: [{name: ANSIBLE_INVENTORY_IGNORE_REGEX}]<br \/>\nini:<br \/>\n&#8211; {key: inventory_ignore_patterns, section: defaults}<br \/>\n&#8211; {key: ignore_patterns, section: inventory}<br \/>\ntype: list<br \/>\nINVENTORY_UNPARSED_IS_FAILED:<br \/>\nname: Unparsed Inventory failure<br \/>\ndefault: False<br \/>\ndescription: If &#8216;true&#8217; unparsed inventory sources become fatal errors, they are warnings otherwise.<br \/>\nenv: [{name: ANSIBLE_INVENTORY_UNPARSED_FAILED}]<br \/>\nini:<br \/>\n&#8211; {key: unparsed_is_failed, section: inventory}<br \/>\ntype: bool<br \/>\nMAX_FILE_SIZE_FOR_DIFF:<br \/>\nname: Diff maxiumum file size<br \/>\ndefault: 104448<br \/>\ndescription: Maximum size of files to be considered for diff display<br \/>\nenv: [{name: ANSIBLE_MAX_DIFF_SIZE}]<br \/>\nini:<br \/>\n&#8211; {key: max_diff_size, section: defaults}<br \/>\ntype: int<br \/>\nMERGE_MULTIPLE_CLI_TAGS:<br \/>\nname: Merge &#8216;tags&#8217; options<br \/>\ndefault: True<br \/>\ndescription:<br \/>\n&#8211; &#8220;This allows changing how multiple &#8211;tags and &#8211;skip-tags arguments are handled on the command line.<br \/>\nIn Ansible up to and including 2.3, specifying &#8211;tags more than once will only take the last value of &#8211;tags.&#8221;<br \/>\n&#8211; &#8220;Setting this config value to True will mean that all of the &#8211;tags options will be merged together. The same holds true for &#8211;skip-tags.&#8221;<br \/>\nenv: [{name: ANSIBLE_MERGE_MULTIPLE_CLI_TAGS}]<br \/>\nini:<br \/>\n&#8211; {key: merge_multiple_cli_tags, section: defaults}<br \/>\ntype: bool<br \/>\nversion_added: &#8220;2.3&#8221;<br \/>\nNETWORK_GROUP_MODULES:<br \/>\nname: Network module families<br \/>\ndefault: [eos, nxos, ios, iosxr, junos, ce, vyos, sros, dellos9, dellos10, dellos6, asa, aruba, aireos]<br \/>\ndescription: &#8216;TODO: write it&#8217;<br \/>\nenv: [{name: NETWORK_GROUP_MODULES}]<br \/>\nini:<br \/>\n&#8211; {key: network_group_modules, section: defaults}<br \/>\ntype: list<br \/>\nyaml: {key: defaults.network_group_modules}<br \/>\n#ONLY_NAMESPACE_FACTS:<br \/>\n# Deffered to 2.5<br \/>\n# FIXME: reenable when we can remove ansible_ prefix from namespaced facts<br \/>\n# default: False<br \/>\n# description:<br \/>\n# &#8211; Facts normally get injected as top level variables, this setting prevents that.<br \/>\n# &#8211; Facts are still available in the `ansible_facts` variable w\/o the `ansible_` prefix.<br \/>\n# env: [{name: ANSIBLE_RESTRICT_FACTS}]<br \/>\n# ini:<br \/>\n# &#8211; {key: restrict_facts_namespace, section: defaults}<br \/>\n# type: boolean<br \/>\n# yaml: {key: defaults.restrict_facts_namespace}<br \/>\n# version_added: &#8220;2.4&#8221;<br \/>\nPARAMIKO_HOST_KEY_AUTO_ADD:<br \/>\n# TODO: move to plugin<br \/>\ndefault: False<br \/>\ndescription: &#8216;TODO: write it&#8217;<br \/>\nenv: [{name: ANSIBLE_PARAMIKO_HOST_KEY_AUTO_ADD}]<br \/>\nini:<br \/>\n&#8211; {key: host_key_auto_add, section: paramiko_connection}<br \/>\ntype: boolean<br \/>\nPARAMIKO_LOOK_FOR_KEYS:<br \/>\n# TODO: move to plugin<br \/>\ndefault: True<br \/>\ndescription: &#8216;TODO: write it&#8217;<br \/>\nenv: [{name: ANSIBLE_PARAMIKO_LOOK_FOR_KEYS}]<br \/>\nini:<br \/>\n&#8211; {key: look_for_keys, section: paramiko_connection}<br \/>\ntype: boolean<br \/>\nPARAMIKO_PROXY_COMMAND:<br \/>\n# TODO: move to plugin<br \/>\ndefault:<br \/>\ndescription: &#8216;TODO: write it&#8217;<br \/>\nenv: [{name: ANSIBLE_PARAMIKO_PROXY_COMMAND}]<br \/>\nini:<br \/>\n&#8211; {key: proxy_command, section: paramiko_connection}<br \/>\nPARAMIKO_PTY:<br \/>\n# TODO: move to plugin<br \/>\ndefault: True<br \/>\ndescription: &#8216;TODO: write it&#8217;<br \/>\nenv: [{name: ANSIBLE_PARAMIKO_PTY}]<br \/>\nini:<br \/>\n&#8211; {key: pty, section: paramiko_connection}<br \/>\ntype: boolean<br \/>\nPARAMIKO_RECORD_HOST_KEYS:<br \/>\n# TODO: move to plugin<br \/>\ndefault: True<br \/>\ndescription: &#8216;TODO: write it&#8217;<br \/>\nenv: [{name: ANSIBLE_PARAMIKO_RECORD_HOST_KEYS}]<br \/>\nini:<br \/>\n&#8211; {key: record_host_keys, section: paramiko_connection}<br \/>\ntype: boolean<br \/>\nPERSISTENT_CONTROL_PATH_DIR:<br \/>\nname: Persistence socket path<br \/>\ndefault: ~\/.ansible\/pc<br \/>\ndescription: Path to socket to be used by the connection persistence system.<br \/>\nenv: [{name: ANSIBLE_PERSISTENT_CONTROL_PATH_DIR}]<br \/>\nini:<br \/>\n&#8211; {key: control_path_dir, section: persistent_connection}<br \/>\ntype: path<br \/>\nPERSISTENT_CONNECT_TIMEOUT:<br \/>\nname: Persistence timeout<br \/>\ndefault: 30<br \/>\ndescription: This controls how long the persistent connection will remain idle before it is destroyed.<br \/>\nenv: [{name: ANSIBLE_PERSISTENT_CONNECT_TIMEOUT}]<br \/>\nini:<br \/>\n&#8211; {key: connect_timeout, section: persistent_connection}<br \/>\ntype: integer<br \/>\nPERSISTENT_CONNECT_RETRY_TIMEOUT:<br \/>\nname: Persistence connection retry timeout<br \/>\ndefault: 15<br \/>\ndescription: This contorls the retry timeout for presistent connection to connect to the local domain socket.<br \/>\nenv: [{name: ANSIBLE_PERSISTENT_CONNECT_RETRY_TIMEOUT}]<br \/>\nini:<br \/>\n&#8211; {key: connect_retry_timeout, section: persistent_connection}<br \/>\ntype: integer<br \/>\nPERSISTENT_COMMAND_TIMEOUT:<br \/>\nname: Persistence command timeout<br \/>\ndefault: 10<br \/>\ndescription: This controls the amount of time to wait for response from remote device before timing out presistent connection.<br \/>\nenv: [{name: ANSIBLE_PERSISTENT_COMMAND_TIMEOUT}]<br \/>\nini:<br \/>\n&#8211; {key: command_timeout, section: persistent_connection}<br \/>\ntype: int<br \/>\nPLAYBOOK_VARS_ROOT:<br \/>\nname: playbook vars files root<br \/>\ndefault: top<br \/>\nversion_added: &#8220;2.4.1&#8221;<br \/>\ndescription:<br \/>\n&#8211; This sets which playbook dirs will be used as a root to process vars plugins, which includes finding host_vars\/group_vars<br \/>\n&#8211; The &#8220;top&#8220; option follows the traditional behaviour of using the top playbook in the chain to find the root directory.<br \/>\n&#8211; The &#8220;bottom&#8220; option follows the 2.4.0 behaviour of using the current playbook to find the root directory.<br \/>\n&#8211; The &#8220;all&#8220; option examines from the first parent to the current playbook.<br \/>\nenv: [{name: ANSIBLE_PLAYBOOK_VARS_ROOT}]<br \/>\nini:<br \/>\n&#8211; {key: playbook_vars_root, section: defaults}<br \/>\nchoices: [ top, bottom, all ]<br \/>\nRETRY_FILES_ENABLED:<br \/>\nname: Retry files<br \/>\ndefault: True<br \/>\ndescription: This controls whether a failed Ansible playbook should create a .retry file.<br \/>\nenv: [{name: ANSIBLE_RETRY_FILES_ENABLED}]<br \/>\nini:<br \/>\n&#8211; {key: retry_files_enabled, section: defaults}<br \/>\ntype: bool<br \/>\nRETRY_FILES_SAVE_PATH:<br \/>\nname: Retry files path<br \/>\ndefault: ~<br \/>\ndescription: This sets the path in which Ansible will save .retry files when a playbook fails and retry files are enabled.<br \/>\nenv: [{name: ANSIBLE_RETRY_FILES_SAVE_PATH}]<br \/>\nini:<br \/>\n&#8211; {key: retry_files_save_path, section: defaults}<br \/>\ntype: path<br \/>\nSHOW_CUSTOM_STATS:<br \/>\nname: Display custom stats<br \/>\ndefault: False<br \/>\ndescription: &#8216;This adds the custom stats set via the set_stats plugin to the default output&#8217;<br \/>\nenv: [{name: ANSIBLE_SHOW_CUSTOM_STATS}]<br \/>\nini:<br \/>\n&#8211; {key: show_custom_stats, section: defaults}<br \/>\ntype: bool<br \/>\nSTRING_TYPE_FILTERS:<br \/>\nname: Filters to preserve strings<br \/>\ndefault: [string, to_json, to_nice_json, to_yaml, ppretty, json]<br \/>\ndescription:<br \/>\n&#8211; &#8220;This list of filters avoids &#8216;type conversion&#8217; when templating variables&#8221;<br \/>\n&#8211; Useful when you want to avoid conversion into lists or dictionaries for JSON strings, for example.<br \/>\nenv: [{name: ANSIBLE_STRING_TYPE_FILTERS}]<br \/>\nini:<br \/>\n&#8211; {key: dont_type_filters, section: jinja2}<br \/>\ntype: list<br \/>\nSYSTEM_WARNINGS:<br \/>\nname: System warnings<br \/>\ndefault: True<br \/>\ndescription:<br \/>\n&#8211; Allows disabling of warnings related to potential issues on the system running ansible itself (not on the managed hosts)<br \/>\n&#8211; These may include warnings about 3rd party packages or other conditions that should be resolved if possible.<br \/>\nenv: [{name: ANSIBLE_SYSTEM_WARNINGS}]<br \/>\nini:<br \/>\n&#8211; {key: system_warnings, section: defaults}<br \/>\ntype: boolean<br \/>\nUSE_PERSISTENT_CONNECTIONS:<br \/>\nname: Persistence<br \/>\ndefault: False<br \/>\ndescription: Toggles the use of persistence for connections.<br \/>\nenv: [{name: ANSIBLE_USE_PERSISTENT_CONNECTIONS}]<br \/>\nini:<br \/>\n&#8211; {key: use_persistent_connections, section: defaults}<br \/>\ntype: boolean<br \/>\nVARIABLE_PRECEDENCE:<br \/>\nname: Group variable precedence<br \/>\ndefault: [&#8216;all_inventory&#8217;, &#8216;groups_inventory&#8217;, &#8216;all_plugins_inventory&#8217;, &#8216;all_plugins_play&#8217;, &#8216;groups_plugins_inventory&#8217;, &#8216;groups_plugins_play&#8217;]<br \/>\ndescription: Allows to change the group variable precedence merge order.<br \/>\nenv: [{name: ANSIBLE_PRECEDENCE}]<br \/>\nini:<br \/>\n&#8211; {key: precedence, section: defaults}<br \/>\ntype: list<br \/>\nversion_added: &#8220;2.4&#8221;<br \/>\nYAML_FILENAME_EXTENSIONS:<br \/>\nname: Valid YAML extensions<br \/>\ndefault: [&#8220;.yml&#8221;, &#8220;.yaml&#8221;, &#8220;.json&#8221;]<br \/>\ndescription:<br \/>\n&#8211; &#8220;Check all of these extensions when looking for &#8216;variable&#8217; files which should be YAML or JSON or vaulted versions of these.&#8221;<br \/>\n&#8211; &#8216;This affects vars_files, include_vars, inventory and vars plugins among others.&#8217;<br \/>\nenv:<br \/>\n&#8211; name: ANSIBLE_YAML_FILENAME_EXT<br \/>\nini:<br \/>\n&#8211; section: defaults<br \/>\nkey: yaml_valid_extensions<br \/>\ntype: list<br \/>\n&#8230;<\/p>\n<\/details>\n<p>\u4f7f\u7528\u8fd9\u4e9b\u4eba\uff0c\u4f1a\u53d8\u6210\u8fd9\u6837\u3002\u8ddf\u9884\u60f3\u7684\u4e00\u6837\u3002<\/p>\n<pre class=\"post-pre\"><code>$ ansible-playbook -i hosts echo-sd.yml\r\n\r\n\uff3f\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\uff3f\r\n\uff1e\u3000PLAY [localhost]\u3000\uff1c\r\n\uffe3Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^\uffe3\r\n\r\n\r\n\uff3f\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\uff3f\r\n\uff1e\u3000TASK [Gathering Facts]\u3000\uff1c\r\n\uffe3Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^\uffe3\r\n\r\nok: [localhost]\r\n\r\n\uff3f\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\uff3f\r\n\uff1e\u3000TASK [Display message]\u3000\uff1c\r\n\uffe3Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^\uffe3\r\n\r\nok: [localhost] =&gt; {\r\n    \"msg\": \"\u7a81\u7136\u306e\u6b7b\"\r\n}\r\n\r\n\uff3f\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\uff3f\r\n\uff1e\u3000PLAY RECAP\u3000\uff1c\r\n\uffe3Y^Y^Y^Y^Y^Y^Y^\uffe3\r\n\r\nlocalhost                  : ok=2    changed=0    unreachable=0    failed=0\r\n<\/code><\/pre>\n<p>cowsay\u7684\u7248\u672c\u611f\u89c9\u5f88\u5947\u602a\uff0c\u4f46\u662fecho-sd\u7248\u5c31\u6709\u70b9&#8230;\u5435\u95f9\u5427\u3002\u8f93\u51fa\u58f0\u97f3\u5f88\u5435\u3002<br \/>\n\u867d\u7136\u6700\u521d\u7684\u76ee\u6807\u8fbe\u5230\u4e86\uff0c\u4f46\u6211\u7279\u522b\u6ca1\u6709\u559c\u60a6\u800c\u611f\u5230\u56f0\u6270\u3002<\/p>\n<h2>\u89e3\u91ca<\/h2>\n<p>\u6211\u60f3\u89e3\u91ca\u4e00\u4e0b\u4e0eecho-sd\u5316\u76f8\u5173\u7684\u90e8\u5206\u3002<\/p>\n<h3>\u6d41\u7a0b\u5904\u7406<\/h3>\n<p>\u5728 display.py \u4e2d\uff0c\u4f1a\u5c06\u4efb\u52a1\u6267\u884c\u65f6\u7684\u6d88\u606f\u8f93\u51fa\u5230\u5c4f\u5e55\u4e0a\uff0c\u4f46\u5bf9\u4e8e cowsay\uff0c\u901a\u5e38\u4f1a\u6309\u7167\u4ee5\u4e0b\u6d41\u7a0b\u53bb\u8bfb\u53d6\u548c\u6267\u884c\u3002<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u8bfb\u53d6<\/ol>\n<\/li>\n<\/ol>\n<p>\u786e\u5b9acowsay\u8def\u5f84<br \/>\n\u6392\u9664cowsay\u89d2\u8272<\/p>\n<p>\u6267\u884c<\/p>\n<p>\u8f93\u51facowsay\u7684\u6a2a\u5e45<\/p>\n<p>\u8ba9\u6211\u4eec\u786e\u8ba4\u6bcf\u4e2a\u5904\u7406\u8fc7\u7a0b\uff0c\u5e76\u5c06\u5176\u66ff\u6362\u4e3aecho-sd\uff0c\u8fc8\u5411\u5b9e\u73b0 \u3002<\/p>\n<h3>\u52a0\u8f7d<\/h3>\n<p>\u5728Ansible\u542f\u52a8\u65f6\uff0c\u4f1a\u52a0\u8f7d\u5404\u79cd\u6a21\u5757\uff0c\u5176\u4e2d\u5305\u62ecDisplay\u6a21\u5757\uff0c\u7136\u540e\u6267\u884cinit\u5904\u7406\u3002<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">verbosity<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">):<\/span>\r\n\r\n        <span class=\"p\">(<\/span><span class=\"n\">\u7565<\/span><span class=\"p\">)<\/span>\r\n\r\n        <span class=\"c1\"># cowsay\u306e\u5b9f\u884c\u30d1\u30b9\u3092\u683c\u7d0d\u3059\u308b\u5909\u6570\r\n<\/span>        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">b_cowsay<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">None<\/span>\r\n\r\n        <span class=\"c1\"># cowsay\u30ad\u30e3\u30e9\u30af\u30bf\u3092\u30b3\u30f3\u30d5\u30a3\u30b0\u304b\u3089\u8aad\u307f\u8fbc\u3080\r\n<\/span>        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">noncow<\/span> <span class=\"o\">=<\/span> <span class=\"n\">C<\/span><span class=\"p\">.<\/span><span class=\"n\">ANSIBLE_COW_SELECTION<\/span>\r\n\r\n        <span class=\"c1\"># cowsay\u306e\u5b9f\u884c\u30d1\u30b9\u3092\u6c7a\u5b9a\r\n<\/span>        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">set_cowsay_info<\/span><span class=\"p\">()<\/span>\r\n\r\n        <span class=\"c1\"># \u30b3\u30f3\u30d5\u30a3\u30b0\u8a2d\u5b9a\u3068\u5408\u308f\u305b\u3066\u4f7f\u7528\u53ef\u80fd\u306acowsay\u30ad\u30e3\u30e9\u30af\u30bf\u3092\u6c7a\u5b9a\r\n<\/span>        <span class=\"k\">if<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">b_cowsay<\/span><span class=\"p\">:<\/span>\r\n            <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"c1\"># cowsay -l\u30b3\u30de\u30f3\u30c9\u304b\u3089\u74b0\u5883\u4e0a\u4f7f\u7528\u53ef\u80fd\u306acowsay\u30ad\u30e3\u30e9\u30af\u30bf\u3092\u53d6\u5f97\r\n<\/span>                <span class=\"n\">cmd<\/span> <span class=\"o\">=<\/span> <span class=\"n\">subprocess<\/span><span class=\"p\">.<\/span><span class=\"n\">Popen<\/span><span class=\"p\">([<\/span><span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">b_cowsay<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"-l\"<\/span><span class=\"p\">],<\/span> <span class=\"n\">stdout<\/span><span class=\"o\">=<\/span><span class=\"n\">subprocess<\/span><span class=\"p\">.<\/span><span class=\"n\">PIPE<\/span><span class=\"p\">,<\/span> <span class=\"n\">stderr<\/span><span class=\"o\">=<\/span><span class=\"n\">subprocess<\/span><span class=\"p\">.<\/span><span class=\"n\">PIPE<\/span><span class=\"p\">)<\/span>\r\n                <span class=\"p\">(<\/span><span class=\"n\">out<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cmd<\/span><span class=\"p\">.<\/span><span class=\"n\">communicate<\/span><span class=\"p\">()<\/span>\r\n                <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">cows_available<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">set<\/span><span class=\"p\">([<\/span><span class=\"n\">to_text<\/span><span class=\"p\">(<\/span><span class=\"n\">c<\/span><span class=\"p\">)<\/span> <span class=\"k\">for<\/span> <span class=\"n\">c<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">out<\/span><span class=\"p\">.<\/span><span class=\"n\">split<\/span><span class=\"p\">()])<\/span>\r\n\r\n                <span class=\"c1\"># \u4f7f\u7528\u53ef\u80fd\u306a\u3082\u306e\u306e\u3046\u3061\u3001\u30db\u30ef\u30a4\u30c8\u30ea\u30b9\u30c8\u3067\u3082\u6307\u5b9a\u3055\u308c\u305f\u30ad\u30e3\u30e9\u30af\u30bf\u306e\u307f\u3092\u629c\u304d\u51fa\u3059\r\n<\/span>                <span class=\"k\">if<\/span> <span class=\"n\">C<\/span><span class=\"p\">.<\/span><span class=\"n\">ANSIBLE_COW_WHITELIST<\/span><span class=\"p\">:<\/span>\r\n                    <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">cows_available<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">set<\/span><span class=\"p\">(<\/span><span class=\"n\">C<\/span><span class=\"p\">.<\/span><span class=\"n\">ANSIBLE_COW_WHITELIST<\/span><span class=\"p\">).<\/span><span class=\"n\">intersection<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">cows_available<\/span><span class=\"p\">)<\/span>\r\n            <span class=\"k\">except<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"c1\"># cowsay -l\u30b3\u30de\u30f3\u30c9\u304c\u5b9f\u884c\u3067\u304d\u306a\u3044\u306a\u3069\u3001\u4f55\u3089\u304b\u306e\u4f8b\u5916\u304c\u8d77\u304d\u305f\u3089cowsay\u3057\u306a\u3044\u3088\u3046\u306b\u3059\u308b\r\n<\/span>                <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">b_cowsay<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">False<\/span>\r\n\r\n        <span class=\"p\">(<\/span><span class=\"n\">\u7565<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u901a\u8fc7 ANSIBLE_COW_WHITELIST \uff0c\u53ef\u4ee5\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u5b57\u7b26\uff0c\u5c31\u50cf\u8fd9\u6837\u7684\u64cd\u4f5c\u4e00\u6837\u3002<br \/>\n\u6267\u884c\u8def\u5f84\u4f1a\u5728 set_cowsay_info() \u4e2d\u8fdb\u884c\u8bbe\u7f6e\uff0c\u5c31\u50cf\u8fd9\u6837\u5b50\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># \u63a2\u7d22\u3059\u308bcowsay\u5b9f\u884c\u30d1\u30b9\u306e\u30ea\u30b9\u30c8\r\n<\/span><span class=\"n\">b_COW_PATHS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"sa\">b<\/span><span class=\"s\">\"\/usr\/bin\/cowsay\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"sa\">b<\/span><span class=\"s\">\"\/usr\/games\/cowsay\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"sa\">b<\/span><span class=\"s\">\"\/usr\/local\/bin\/cowsay\"<\/span><span class=\"p\">,<\/span>  <span class=\"c1\"># BSD path for cowsay\r\n<\/span>    <span class=\"sa\">b<\/span><span class=\"s\">\"\/opt\/local\/bin\/cowsay\"<\/span><span class=\"p\">,<\/span>  <span class=\"c1\"># MacPorts path for cowsay\r\n<\/span><span class=\"p\">)<\/span>\r\n\r\n<span class=\"p\">(<\/span><span class=\"n\">\u7565<\/span><span class=\"p\">)<\/span>\r\n\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">set_cowsay_info<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"c1\"># ANSIBLE_NOCOWS\u3067\u7121\u52b9\u5316\u3055\u308c\u3066\u3044\u306a\u3051\u308c\u3070\u5b9f\u884c\u30d1\u30b9\u3092\u30bb\u30c3\u30c8\u3059\u308b\r\n<\/span>        <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">C<\/span><span class=\"p\">.<\/span><span class=\"n\">ANSIBLE_NOCOWS<\/span><span class=\"p\">:<\/span>\r\n\r\n            <span class=\"c1\"># b_COW_PATHS\u306b\u542b\u307e\u308c\u308b\u3082\u306e\u306e\u3046\u3061\u3001\u5b58\u5728\u3059\u308b\u3082\u306e\u3092b_cowsay\u306b\u30bb\u30c3\u30c8\r\n<\/span>            <span class=\"k\">for<\/span> <span class=\"n\">b_cow_path<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">b_COW_PATHS<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"k\">if<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">exists<\/span><span class=\"p\">(<\/span><span class=\"n\">b_cow_path<\/span><span class=\"p\">):<\/span>\r\n                    <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">b_cowsay<\/span> <span class=\"o\">=<\/span> <span class=\"n\">b_cow_path<\/span>\r\n<\/code><\/pre>\n<p>\u5f53b_cowsay\u6267\u884c\u8def\u5f84\u8bbe\u7f6e\u6210\u529f\u540e\uff0ccowsay\u72b6\u6001\u5c06\u53d8\u5f97\u5f88\u7f8e\u5999\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u5728base.yml\u4e2d\u5df2\u7ecf\u4f7f\u7528\u4e86\u4ee5\u4e0b\u4e09\u4e2a\u914d\u7f6e\u53d8\u91cf\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">ANSIBLE_COW_SELECTION<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">ANSIBLE_COW_WHITELIST<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">ANSIBLE_NOCOWS<\/ul>\n<details>\u57fa\u4e8ebase.yml\u7684\u63d0\u53d6ANSIBLE_COW_SELECTION\uff1a<br \/>\n\u540d\u79f0\uff1aCowsay\u8fc7\u6ee4\u5668\u9009\u62e9<br \/>\n\u9ed8\u8ba4\u503c\uff1adefault<br \/>\n\u63cf\u8ff0\uff1a\u53ef\u4ee5\u9009\u62e9\u7279\u5b9a\u7684Cowsay\u6a21\u677f\u6765\u521b\u5efa\u6a2a\u5e45\uff0c\u6216\u8005\u4f7f\u7528\u201crandom\u201d\u6765\u5faa\u73af\u4f7f\u7528\u5b83\u4eec\u3002<br \/>\n\u73af\u5883\u53d8\u91cf\uff1a[{name: ANSIBLE_COW_SELECTION}]<br \/>\nini\uff1a<br \/>\n&#8211; {key: cow_selection, section: defaults}<\/p>\n<p>ANSIBLE_COW_WHITELIST\uff1a<br \/>\n\u540d\u79f0\uff1aCowsay\u8fc7\u6ee4\u5668\u767d\u540d\u5355<br \/>\n\u9ed8\u8ba4\u503c\uff1a[&#8216;bud-frogs&#8217;\uff0c&#8217;bunny&#8217;\uff0c&#8217;cheese&#8217;\uff0c&#8217;daemon&#8217;\uff0c&#8217;default&#8217;\uff0c&#8217;dragon&#8217;\uff0c&#8217;elephant-in-snake&#8217;\uff0c&#8217;elephant&#8217;\uff0c&#8217;eyes&#8217;\uff0c&#8217;hellokitty&#8217;\uff0c&#8217;kitty&#8217;\uff0c&#8217;luke-koala&#8217;\uff0c&#8217;meow&#8217;\uff0c&#8217;milk&#8217;\uff0c&#8217;moofasa&#8217;\uff0c&#8217;moose&#8217;\uff0c&#8217;ren&#8217;\uff0c&#8217;sheep&#8217;\uff0c&#8217;small&#8217;\uff0c&#8217;stegosaurus&#8217;\uff0c&#8217;stimpy&#8217;\uff0c&#8217;supermilker&#8217;\uff0c&#8217;three-eyes&#8217;\uff0c&#8217;turkey&#8217;\uff0c&#8217;turtle&#8217;\uff0c&#8217;tux&#8217;\uff0c&#8217;udder&#8217;\uff0c&#8217;vader-koala&#8217;\uff0c&#8217;vader&#8217;\uff0c&#8217;www&#8217;]<br \/>\n\u63cf\u8ff0\uff1aCowsay\u6a21\u677f\u7684\u767d\u540d\u5355\uff0c\u8bbe\u7f6e\u4e3a\u7a7a\u5217\u8868\u5219\u542f\u7528\u6240\u6709\u5df2\u5b89\u88c5\u7684\u6a21\u677f\u3002<br \/>\n\u73af\u5883\u53d8\u91cf\uff1a[{name: ANSIBLE_COW_WHITELIST}]<br \/>\nini\uff1a<br \/>\n&#8211; {key: cow_whitelist, section: defaults}<br \/>\n\u7c7b\u578b\uff1a\u5217\u8868<br \/>\nyaml\uff1a{key: display.cowsay_whitelist}<\/p>\n<p>ANSIBLE_NOCOWS\uff1a<br \/>\n\u540d\u79f0\uff1a\u7981\u6b62Cowsay\u8f93\u51fa<br \/>\n\u9ed8\u8ba4\u503c\uff1aFalse<br \/>\n\u63cf\u8ff0\uff1a\u5982\u679c\u4f60\u5b89\u88c5\u4e86Cowsay\u4f46\u4e0d\u60f3\u4f7f\u7528\u201c\u725b\u201d\uff08\u4e3a\u4ec0\u4e48\uff1f\uff09\uff0c\u8bf7\u4f7f\u7528\u6b64\u9009\u9879\u3002<br \/>\n\u73af\u5883\u53d8\u91cf\uff1a[{name: ANSIBLE_NOCOWS}]<br \/>\nini\uff1a<br \/>\n&#8211; {key: nocows, section: defaults}<br \/>\n\u7c7b\u578b\uff1a\u5e03\u5c14<br \/>\nyaml\uff1a{key: display.i_am_no_fun}<\/p>\n<\/details>\n<h3>\u6267\u884c<\/h3>\n<p>\u6839\u636e\u8bfb\u53d6\u7684cowsay\u8def\u5f84\uff0c\u4f7f\u7528banner\u5728\u5c4f\u5e55\u4e0a\u8f93\u51fa\u6a2a\u5e45\u3002<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"k\">def<\/span> <span class=\"nf\">banner<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">msg<\/span><span class=\"p\">,<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"bp\">None<\/span><span class=\"p\">,<\/span> <span class=\"n\">cows<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"s\">'''\r\n        Prints a header-looking line with cowsay or stars wit hlength depending on terminal width (3 minimum)\r\n        '''<\/span>\r\n        <span class=\"c1\"># cowsay\u306e\u5b9f\u884c\u30d1\u30b9\u304c\u6307\u5b9a\u3055\u308c\u3066\u304a\u308a\u3001\u660e\u793a\u7684\u306b\u5b9f\u884c\u3057\u306a\u3044\u3088\u3046(cows=False)\u306b\r\n<\/span>        <span class=\"c1\"># \u3055\u308c\u3066\u3044\u306a\u3051\u308c\u3070banner_cowsay\u3092\u5229\u7528\u3059\u308b\r\n<\/span>        <span class=\"k\">if<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">b_cowsay<\/span> <span class=\"ow\">and<\/span> <span class=\"n\">cows<\/span><span class=\"p\">:<\/span>\r\n            <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"c1\"># cowsay\u3067\u30d0\u30ca\u30fc\u51fa\u529b\u3057\u305f\u3089\u30d0\u30ca\u30fc\u51e6\u7406\u304c\u7d42\u4e86\u3059\u308b\r\n<\/span>                <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">banner_cowsay<\/span><span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"p\">)<\/span>\r\n                <span class=\"k\">return<\/span>\r\n            <span class=\"k\">except<\/span> <span class=\"nb\">OSError<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"c1\"># \u4f55\u304b\u3042\u3063\u305f\u3089\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u51fa\u3057\u3066\u901a\u5e38\u30d0\u30ca\u30fc\u3067\u51e6\u7406\u3092\u7d9a\u884c\r\n<\/span>                <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">warning<\/span><span class=\"p\">(<\/span><span class=\"s\">\"somebody cleverly deleted cowsay or something during the PB run.  heh.\"<\/span><span class=\"p\">)<\/span>\r\n\r\n        <span class=\"c1\"># \u3053\u3053\u304b\u3089\u901a\u5e38\u30d0\u30ca\u30fc\u51e6\u7406\r\n<\/span>        <span class=\"n\">msg<\/span> <span class=\"o\">=<\/span> <span class=\"n\">msg<\/span><span class=\"p\">.<\/span><span class=\"n\">strip<\/span><span class=\"p\">()<\/span>\r\n        <span class=\"n\">star_len<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">columns<\/span> <span class=\"o\">-<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"n\">star_len<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"mi\">3<\/span><span class=\"p\">:<\/span>\r\n            <span class=\"n\">star_len<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">3<\/span>\r\n        <span class=\"n\">stars<\/span> <span class=\"o\">=<\/span> <span class=\"sa\">u<\/span><span class=\"s\">\"*\"<\/span> <span class=\"o\">*<\/span> <span class=\"n\">star_len<\/span>\r\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">display<\/span><span class=\"p\">(<\/span><span class=\"sa\">u<\/span><span class=\"s\">\"<\/span><span class=\"se\">\\n<\/span><span class=\"s\">%s %s\"<\/span> <span class=\"o\">%<\/span> <span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"p\">,<\/span> <span class=\"n\">stars<\/span><span class=\"p\">),<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"n\">color<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u6211\u660e\u767d\u4e86\uff0c\u4f60\u7684\u610f\u601d\u662f\uff0c\u4e0e\u5e38\u89c4\u7684\u6a2a\u5e45\u5904\u7406\u4e0d\u540c\uff0c\u4f60\u662f\u901a\u8fc7cowsay\u5b9e\u73b0\u4e86\u6a2a\u5e45\u5904\u7406\u4e2d\u65ad\u7684\u65b9\u5f0f\u5bf9\u5176\u8fdb\u884c\u5904\u7406\u7684\u3002<br \/>\n\u5982\u679c\u4e2d\u65ad\u7684\u5904\u7406\u6210\u529f\uff0c\u5c31\u5728\u90a3\u91cc\u8fd4\u56de\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u963b\u6b62\u5e38\u89c4\u6a2a\u5e45\u7684\u663e\u793a\uff0c\u540c\u65f6\u5728\u53d1\u751f\u4e86\u4e00\u4e9b\u9519\u8bef\u65f6\uff0c\u4ecd\u7136\u53ef\u4ee5\u663e\u793a\u5e38\u89c4\u6a2a\u5e45\u3002<\/p>\n<p>\u6700\u540e\u8ba9\u6211\u4eec\u6765\u770b\u770b\u6700\u91cd\u8981\u7684 banner_cowsay\u3002<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"k\">def<\/span> <span class=\"nf\">banner_cowsay<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">msg<\/span><span class=\"p\">,<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"bp\">None<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"c1\"># \u30e1\u30c3\u30bb\u30fc\u30b8\u4e2d\u306b\u3042\u308b \"[\" \"]\" \u306e\u30bb\u30c3\u30c8\u3092\u524a\u9664\u3059\u308b\r\n<\/span>        <span class=\"k\">if<\/span> <span class=\"sa\">u<\/span><span class=\"s\">\": [\"<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">msg<\/span><span class=\"p\">:<\/span>\r\n            <span class=\"n\">msg<\/span> <span class=\"o\">=<\/span> <span class=\"n\">msg<\/span><span class=\"p\">.<\/span><span class=\"n\">replace<\/span><span class=\"p\">(<\/span><span class=\"sa\">u<\/span><span class=\"s\">\"[\"<\/span><span class=\"p\">,<\/span> <span class=\"sa\">u<\/span><span class=\"s\">\"\"<\/span><span class=\"p\">)<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"n\">msg<\/span><span class=\"p\">.<\/span><span class=\"n\">endswith<\/span><span class=\"p\">(<\/span><span class=\"sa\">u<\/span><span class=\"s\">\"]\"<\/span><span class=\"p\">):<\/span>\r\n                <span class=\"n\">msg<\/span> <span class=\"o\">=<\/span> <span class=\"n\">msg<\/span><span class=\"p\">[:<\/span><span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span>\r\n\r\n        <span class=\"c1\"># \u5b9f\u884c\u3059\u308bcowsay\u30b3\u30de\u30f3\u30c9\u3092\u7d44\u307f\u7acb\u3066\r\n<\/span>        <span class=\"n\">runcmd<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">b_cowsay<\/span><span class=\"p\">,<\/span> <span class=\"sa\">b<\/span><span class=\"s\">\"-W\"<\/span><span class=\"p\">,<\/span> <span class=\"sa\">b<\/span><span class=\"s\">\"60\"<\/span><span class=\"p\">]<\/span>\r\n\r\n        <span class=\"c1\"># cowsay\u30ad\u30e3\u30e9\u30af\u30bf\u3092\u9078\u629e\r\n<\/span>        <span class=\"c1\"># random\u306e\u5834\u5408\u306fcows_available\u304b\u3089\u30e9\u30f3\u30c0\u30e0\u306b\u9078\u3076\r\n<\/span>        <span class=\"k\">if<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">noncow<\/span><span class=\"p\">:<\/span>\r\n            <span class=\"n\">thecow<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">noncow<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"n\">thecow<\/span> <span class=\"o\">==<\/span> <span class=\"s\">'random'<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"n\">thecow<\/span> <span class=\"o\">=<\/span> <span class=\"n\">random<\/span><span class=\"p\">.<\/span><span class=\"n\">choice<\/span><span class=\"p\">(<\/span><span class=\"nb\">list<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">cows_available<\/span><span class=\"p\">))<\/span>\r\n            <span class=\"n\">runcmd<\/span><span class=\"p\">.<\/span><span class=\"n\">append<\/span><span class=\"p\">(<\/span><span class=\"sa\">b<\/span><span class=\"s\">'-f'<\/span><span class=\"p\">)<\/span>\r\n            <span class=\"n\">runcmd<\/span><span class=\"p\">.<\/span><span class=\"n\">append<\/span><span class=\"p\">(<\/span><span class=\"n\">to_bytes<\/span><span class=\"p\">(<\/span><span class=\"n\">thecow<\/span><span class=\"p\">))<\/span>\r\n\r\n        <span class=\"c1\"># \u30e1\u30c3\u30bb\u30fc\u30b8\u672c\u6587\u3092\u30b3\u30de\u30f3\u30c9\u306b\u8ffd\u52a0\u3057\u3066\u5b9f\u884c\r\n<\/span>        <span class=\"n\">runcmd<\/span><span class=\"p\">.<\/span><span class=\"n\">append<\/span><span class=\"p\">(<\/span><span class=\"n\">to_bytes<\/span><span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"p\">))<\/span>\r\n        <span class=\"n\">cmd<\/span> <span class=\"o\">=<\/span> <span class=\"n\">subprocess<\/span><span class=\"p\">.<\/span><span class=\"n\">Popen<\/span><span class=\"p\">(<\/span><span class=\"n\">runcmd<\/span><span class=\"p\">,<\/span> <span class=\"n\">stdout<\/span><span class=\"o\">=<\/span><span class=\"n\">subprocess<\/span><span class=\"p\">.<\/span><span class=\"n\">PIPE<\/span><span class=\"p\">,<\/span> <span class=\"n\">stderr<\/span><span class=\"o\">=<\/span><span class=\"n\">subprocess<\/span><span class=\"p\">.<\/span><span class=\"n\">PIPE<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"p\">(<\/span><span class=\"n\">out<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cmd<\/span><span class=\"p\">.<\/span><span class=\"n\">communicate<\/span><span class=\"p\">()<\/span>\r\n\r\n        <span class=\"c1\"># display\u30e1\u30bd\u30c3\u30c9\u3067cowsay\u30b3\u30de\u30f3\u30c9\u304b\u3089\u53d7\u3051\u53d6\u3063\u305f\u51fa\u529b\u3092\u753b\u9762\u3078\u51fa\u529b\r\n<\/span>        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">display<\/span><span class=\"p\">(<\/span><span class=\"sa\">u<\/span><span class=\"s\">\"%s<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span> <span class=\"o\">%<\/span> <span class=\"n\">to_text<\/span><span class=\"p\">(<\/span><span class=\"n\">out<\/span><span class=\"p\">),<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"n\">color<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u55ef\uff0c\u8fd9\u4e2a\u5730\u65b9\u672c\u8eab\u5e76\u4e0d\u592a\u6709\u8da3\u3002<br \/>\n\u4e00\u5f00\u59cb\u5220\u9664\u65b9\u62ec\u53f7\u7684\u90e8\u5206\u4e00\u773c\u770b\u4e0a\u53bb\u6ca1\u4ec0\u4e48\u610f\u4e49\uff0c\u4f46\u51b7\u9759\u5730\u9605\u8bfb\u4e4b\u540e\u53d1\u73b0\u5176\u5b9e\u53ea\u662f\u4e00\u4e2a\u65e0\u5173\u7d27\u8981\u7684\u5904\u7406\u800c\u5df2\u3002<\/p>\n<p>\u4ee5\u4e00\u79cd\u7c7b\u4f3c\u7684\u611f\u89c9\uff0c\u53ef\u4ee5\u83b7\u5f97cowsay\u7248\u672c\u7684\u8f93\u51fa\u3002<\/p>\n<h3>\u8bfb\u53d6\uff08\u56de\u58f0-SD\u7248\u672c\uff09<\/h3>\n<p>\u8bfb\u53d6\u90e8\u5206\u5df2\u7ecf\u7a33\u5b9a\u4e0b\u6765\u4e86\u3002<br \/>\n\u7531\u4e8eecho-sd\u7684\u8f93\u51fa\u6837\u5f0f\u4e0d\u50cfcowsay\u90a3\u6837\u4e30\u5bcc\uff0c\u56e0\u6b64\u4e0ecows_available\u5bf9\u5e94\u7684\u90e8\u5206\u76f4\u63a5\u6539\u6210\u4e86b_ECHO_SD_STYLES\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># echo-sd\u5b9f\u884c\u30d1\u30b9\u306e\u30ea\u30b9\u30c8\r\n<\/span><span class=\"n\">b_ECHO_SD_PATHS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span>\r\n<span class=\"sa\">b<\/span><span class=\"s\">\"\/usr\/local\/bin\/echo-sd\"<\/span><span class=\"p\">,<\/span> <span class=\"c1\"># path for echo-sd\r\n<\/span><span class=\"p\">)<\/span>\r\n\r\n<span class=\"c1\"># echo-sd\u306e\u51fa\u529b\u30b9\u30bf\u30a4\u30eb\u4e00\u89a7\r\n<\/span><span class=\"n\">b_ECHO_SD_STYLES<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span>\r\n<span class=\"sa\">b<\/span><span class=\"s\">\"vertical\"<\/span><span class=\"p\">,<\/span>\r\n<span class=\"sa\">b<\/span><span class=\"s\">\"tanzaku\"<\/span><span class=\"p\">,<\/span>\r\n<span class=\"sa\">b<\/span><span class=\"s\">\"default\"<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">)<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">Display<\/span><span class=\"p\">:<\/span>\r\n\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">verbosity<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">):<\/span>\r\n\r\n        <span class=\"p\">(<\/span><span class=\"n\">\u7565<\/span><span class=\"p\">)<\/span>\r\n\r\n        <span class=\"c1\"># echo-sd\u5b9f\u884c\u30d1\u30b9\r\n<\/span>        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">b_echo_sd<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">None<\/span>\r\n\r\n        <span class=\"c1\"># echo-sd\u306e\u51fa\u529b\u30b9\u30bf\u30a4\u30eb\u3092\u30b3\u30f3\u30d5\u30a3\u30b0\u304b\u3089\u8aad\u307f\u8fbc\u3080\r\n<\/span>        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">nonsd<\/span> <span class=\"o\">=<\/span> <span class=\"n\">C<\/span><span class=\"p\">.<\/span><span class=\"n\">ANSIBLE_SD_SELECTION<\/span>\r\n\r\n        <span class=\"c1\"># echo-sd\u306e\u5b9f\u884c\u30d1\u30b9\u3092\u6c7a\u5b9a\r\n<\/span>        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">set_echo_sd_info<\/span><span class=\"p\">()<\/span>\r\n\r\n        <span class=\"p\">(<\/span><span class=\"n\">\u7565<\/span><span class=\"p\">)<\/span>\r\n\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">set_echo_sd_info<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">C<\/span><span class=\"p\">.<\/span><span class=\"n\">ANSIBLE_NOSD<\/span><span class=\"p\">:<\/span>\r\n            <span class=\"k\">for<\/span> <span class=\"n\">b_echo_sd_path<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">b_ECHO_SD_PATHS<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"k\">if<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">exists<\/span><span class=\"p\">(<\/span><span class=\"n\">b_echo_sd_path<\/span><span class=\"p\">):<\/span>\r\n                    <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">b_echo_sd<\/span> <span class=\"o\">=<\/span> <span class=\"n\">b_echo_sd_path<\/span>\r\n\r\n<span class=\"p\">(<\/span><span class=\"n\">\u7565<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u4f60\u770b\u4e86\u4ee3\u7801\uff0c\u5c31\u4f1a\u660e\u767d\u914d\u7f6e\u53d8\u91cf\u662f\u4ec0\u4e48\u3002 (If you read the code, you will understand what the configuration variables are.)<\/p>\n<p>ANSIBLE_SD_SELECTION<\/p>\n<p>echo-sd\u306e\u51fa\u529b\u30b9\u30bf\u30a4\u30eb\u3092\u6307\u5b9a<br \/>\nrandom\u3067\u300c\u901a\u5e38\u30e2\u30fc\u30c9(default)\u300d\u300c\u7e26\u66f8\u304d\u30e2\u30fc\u30c9(vertical)\u300d\u300c\u77ed\u518a\u30e2\u30fc\u30c9(tanzaku)\u300d\u304b\u3089\u9078\u3070\u308c\u308b<\/p>\n<p>ANSIBLE_NOSD<\/p>\n<p>True\u306b\u3059\u308b\u3068echo-sd\u306b\u3088\u308b\u30d0\u30ca\u30fc\u51fa\u529b\u304c\u6291\u5236\u3055\u308c\u308b<br \/>\n\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u306fFalse\u306a\u306e\u3067\u30b5\u30fc\u30d0\u4e0a\u306becho-sd\u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308c\u3070echo-sd\u30b9\u30bf\u30a4\u30eb\u3067\u52d5\u304f<\/p>\n<p>\u4f1a\u4f7f\u7528\u4e24\u4e2a\u3002<\/p>\n<p>\u73b0\u5728\u5df2\u7ecf\u51c6\u5907\u597d\u6267\u884c echo-sd \u4e86\u3002<\/p>\n<h3>\u6267\u884c\uff08\u56de\u58f0-sd\u7248\uff09<\/h3>\n<p>\u8fd9\u4e2a\u5730\u65b9\u5c31\u662f\u8fd9\u6837\u3002\u5904\u7406\u65b9\u5f0f\u4fdd\u6301\u4e0d\u53d8\uff0c\u53ea\u662f\u6539\u53d8\u4e86\u8c03\u7528\u7684\u65b9\u6cd5\u540d\u3002<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"k\">def<\/span> <span class=\"nf\">banner<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">msg<\/span><span class=\"p\">,<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"bp\">None<\/span><span class=\"p\">,<\/span> <span class=\"n\">sd<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"s\">'''\r\n        Prints a header-looking line with echo-sd or stars wit hlength depending on terminal width (3 minimum)\r\n        '''<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">b_echo_sd<\/span> <span class=\"ow\">and<\/span> <span class=\"n\">sd<\/span><span class=\"p\">:<\/span>\r\n            <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">banner_echo_sd<\/span><span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"p\">)<\/span>\r\n                <span class=\"k\">return<\/span>\r\n            <span class=\"k\">except<\/span> <span class=\"nb\">OSError<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">warning<\/span><span class=\"p\">(<\/span><span class=\"s\">\"somebody cleverly deleted echo-sd or something during the PB run.  heh.\"<\/span><span class=\"p\">)<\/span>\r\n\r\n        <span class=\"p\">(<\/span><span class=\"n\">\u7565<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u5177\u4f53\u5904\u7406\u5982\u4e0b\u3002\u57fa\u672c\u6d41\u7a0b\u4fdd\u6301\u4e0d\u53d8\uff0c\u4f46\u8fdb\u884c\u4e86\u4e00\u4e9b\u5fae\u8c03\u3002<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"k\">def<\/span> <span class=\"nf\">banner_echo_sd<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">msg<\/span><span class=\"p\">,<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"bp\">None<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"c1\"># \u30e1\u30c3\u30bb\u30fc\u30b8\u4e2d\u306b\u3042\u308b \"[\" \"]\" \u3092\u524a\u9664\u3059\u308b\r\n<\/span>        <span class=\"k\">if<\/span> <span class=\"sa\">u<\/span><span class=\"s\">\": [\"<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">msg<\/span><span class=\"p\">:<\/span>\r\n            <span class=\"n\">msg<\/span> <span class=\"o\">=<\/span> <span class=\"n\">msg<\/span><span class=\"p\">.<\/span><span class=\"n\">replace<\/span><span class=\"p\">(<\/span><span class=\"sa\">u<\/span><span class=\"s\">\"[\"<\/span><span class=\"p\">,<\/span> <span class=\"sa\">u<\/span><span class=\"s\">\"\"<\/span><span class=\"p\">)<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"n\">msg<\/span><span class=\"p\">.<\/span><span class=\"n\">endswith<\/span><span class=\"p\">(<\/span><span class=\"sa\">u<\/span><span class=\"s\">\"]\"<\/span><span class=\"p\">):<\/span>\r\n                <span class=\"n\">msg<\/span> <span class=\"o\">=<\/span> <span class=\"n\">msg<\/span><span class=\"p\">[:<\/span><span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span>\r\n\r\n        <span class=\"c1\"># \u5b9f\u884c\u3059\u308becho-sd\u30b3\u30de\u30f3\u30c9\u3092\u7d44\u307f\u7acb\u3066\r\n<\/span>        <span class=\"n\">runcmd<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">b_echo_sd<\/span><span class=\"p\">]<\/span>\r\n\r\n        <span class=\"c1\"># echo-sd\u306e\u51fa\u529b\u30b9\u30bf\u30a4\u30eb\u3092\u9078\u629e\r\n<\/span>        <span class=\"k\">if<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">nonsd<\/span><span class=\"p\">:<\/span>\r\n            <span class=\"n\">thesd<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">nonsd<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"n\">thesd<\/span> <span class=\"o\">==<\/span> <span class=\"s\">'random'<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"n\">thesd<\/span> <span class=\"o\">=<\/span> <span class=\"n\">random<\/span><span class=\"p\">.<\/span><span class=\"n\">choice<\/span><span class=\"p\">(<\/span><span class=\"nb\">list<\/span><span class=\"p\">(<\/span><span class=\"n\">b_ECHO_SD_STYLES<\/span><span class=\"p\">))<\/span>\r\n\r\n            <span class=\"c1\"># default\u4ee5\u5916\u3060\u3063\u305f\u3089\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u8ffd\u52a0\r\n<\/span>            <span class=\"k\">if<\/span> <span class=\"n\">thesd<\/span> <span class=\"o\">!=<\/span> <span class=\"s\">'default'<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"n\">runcmd<\/span><span class=\"p\">.<\/span><span class=\"n\">append<\/span><span class=\"p\">(<\/span><span class=\"n\">to_bytes<\/span><span class=\"p\">(<\/span><span class=\"s\">\"--\"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">thesd<\/span><span class=\"p\">))<\/span>\r\n\r\n                <span class=\"c1\"># default\u4ee5\u5916\u306e\u30b9\u30bf\u30a4\u30eb\u3067\u306f\u30e1\u30c3\u30bb\u30fc\u30b8\u306b\r\n<\/span>                <span class=\"c1\"># \"[\" \"]\" \u304c\u5165\u3063\u3066\u3044\u308b\u3068\u306a\u305c\u304b\u51fa\u529b\u304c\u304a\u304b\u3057\u304f\u306a\u308b\u306e\u3067\u524a\u9664\r\n<\/span>                <span class=\"n\">msg<\/span> <span class=\"o\">=<\/span> <span class=\"n\">msg<\/span><span class=\"p\">.<\/span><span class=\"n\">replace<\/span><span class=\"p\">(<\/span><span class=\"sa\">u<\/span><span class=\"s\">\"[\"<\/span><span class=\"p\">,<\/span> <span class=\"sa\">u<\/span><span class=\"s\">\"\"<\/span><span class=\"p\">)<\/span>\r\n                <span class=\"n\">msg<\/span> <span class=\"o\">=<\/span> <span class=\"n\">msg<\/span><span class=\"p\">.<\/span><span class=\"n\">replace<\/span><span class=\"p\">(<\/span><span class=\"sa\">u<\/span><span class=\"s\">\"]\"<\/span><span class=\"p\">,<\/span> <span class=\"sa\">u<\/span><span class=\"s\">\"\"<\/span><span class=\"p\">)<\/span>\r\n\r\n        <span class=\"c1\"># \u30e1\u30c3\u30bb\u30fc\u30b8\u672c\u6587\u3092\u30b3\u30de\u30f3\u30c9\u306b\u8ffd\u52a0\u3057\u3066\u5b9f\u884c\r\n<\/span>        <span class=\"n\">runcmd<\/span><span class=\"p\">.<\/span><span class=\"n\">append<\/span><span class=\"p\">(<\/span><span class=\"n\">to_bytes<\/span><span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"p\">))<\/span>\r\n        <span class=\"n\">cmd<\/span> <span class=\"o\">=<\/span> <span class=\"n\">subprocess<\/span><span class=\"p\">.<\/span><span class=\"n\">Popen<\/span><span class=\"p\">(<\/span><span class=\"n\">runcmd<\/span><span class=\"p\">,<\/span> <span class=\"n\">stdout<\/span><span class=\"o\">=<\/span><span class=\"n\">subprocess<\/span><span class=\"p\">.<\/span><span class=\"n\">PIPE<\/span><span class=\"p\">,<\/span> <span class=\"n\">stderr<\/span><span class=\"o\">=<\/span><span class=\"n\">subprocess<\/span><span class=\"p\">.<\/span><span class=\"n\">PIPE<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"p\">(<\/span><span class=\"n\">out<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cmd<\/span><span class=\"p\">.<\/span><span class=\"n\">communicate<\/span><span class=\"p\">()<\/span>\r\n\r\n        <span class=\"c1\"># display\u30e1\u30bd\u30c3\u30c9\u3067cowsay\u30b3\u30de\u30f3\u30c9\u304b\u3089\u53d7\u3051\u53d6\u3063\u305f\u51fa\u529b\u3092\u753b\u9762\u3078\u51fa\u529b\r\n<\/span>        <span class=\"c1\"># \u8868\u793a\u304c\u304d\u3064\u304f\u306a\u308b\u306e\u30671\u884c\u5206\u6539\u884c\u3057\u3066\u306f\u3058\u3081\u308b\r\n<\/span>        <span class=\"k\">print<\/span><span class=\"p\">()<\/span>\r\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">display<\/span><span class=\"p\">(<\/span><span class=\"sa\">u<\/span><span class=\"s\">\"%s<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span> <span class=\"o\">%<\/span> <span class=\"n\">to_text<\/span><span class=\"p\">(<\/span><span class=\"n\">out<\/span><span class=\"p\">),<\/span> <span class=\"n\">color<\/span><span class=\"o\">=<\/span><span class=\"n\">color<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u4e2d\u6587\u4e2d\uff0c\u8fd9\u4e2a\u53e5\u5b50\u7684\u7ffb\u8bd1\u53ef\u4ee5\u662f\uff1a<br \/>\n\u6211\u4e0d\u592a\u660e\u767d\u7684\u662f\uff0c\u201c\u5f53\u6d88\u606f\u6b63\u6587\u5305\u542b [ ] \u65f6\uff0c\u4e3a\u4ec0\u4e48\u8f93\u51fa\u7ed3\u679c\u4f1a\u53d8\u5f97\u602a\u5f02\u201d\u8fd9\u4e00\u70b9\u3002<br \/>\n\u5982\u679c\u4e0d\u8fdb\u884c\u8fd9\u4e2a\u5220\u9664\u64cd\u4f5c\uff0c<\/p>\n<pre class=\"post-pre\"><code>\uff3f\u4eba\u4eba\uff3f\r\n\uff1e PLAY [localhost]\u3000\u3000\u3000\u3000\u3000\u3000\u3000 \uff1c\r\n\uff1e LAY [localhost]\u3000\u3000\u3000\u3000\u3000\u3000\u3000\uff1c\r\n\uff1e AY [localhost]\u3000\u3000\u3000\u3000\u3000\u3000 \uff1c\r\n\uff1e Y [localhost]\u3000\u3000\u3000\u3000\u3000\u3000\uff1c\r\n\uff1e\u3000[localhost]\u3000\u3000\u3000\u3000\u3000 \uff1c\r\n\uff1e ? \uff1c\r\n\uff1e l\u3000\uff1c\r\n\uff1e o\u3000\uff1c\r\n\uff1e c\u3000\uff1c\r\n\uff1e a\u3000\uff1c\r\n\uff1e l\u3000\uff1c\r\n\uff1e h\u3000\uff1c\r\n\uff1e o\u3000\uff1c\r\n\uff1e s\u3000\uff1c\r\n\uff1e t\u3000\uff1c\r\n\uff1e ? \uff1c\r\n\uffe3Y^Y^\uffe3\r\n<\/code><\/pre>\n<p>\u6700\u521d\u6211\u4ee5\u4e3a\u662fPython\u89e3\u6790\u6d88\u606f\u6b63\u6587\u65f6\u51fa\u4e86\u95ee\u9898\uff0c\u4f46\u5b9e\u9645\u4e0a\u5728\u76f4\u63a5\u4f7f\u7528echo-sd\u6d4b\u8bd5\u540e\u611f\u89c9\u50cf\u662f\u95ee\u53f7\u5947\u602a\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code># \u30b3\u30de\u30f3\u30c9\u3067\u76f4\u63a5\u3084\u3063\u3066\u3082\u304a\u304b\u3057\u3044\r\n$ echo-sd --vertical \"TASK [Display message]\"\r\n\uff3f\u4eba\u4eba\uff3f\r\n\uff1e TASK [Display message]\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000 \uff1c\r\n\uff1e ASK [Display message]\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\uff1c\r\n\uff1e SK [Display message]\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000 \uff1c\r\n\uff1e K [Display message]\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\uff1c\r\n\uff1e\u3000[Display message]\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000 \uff1c\r\n\uff1e ? \uff1c\r\n\uff1e D\u3000\uff1c\r\n\uff1e i\u3000\uff1c\r\n\uff1e s\u3000\uff1c\r\n\uff1e p\u3000\uff1c\r\n\uff1e l\u3000\uff1c\r\n\uff1e a\u3000\uff1c\r\n\uff1e y\u3000\uff1c\r\n\uff1e\u3000\u3000\uff1c\r\n\uff1e m\u3000\uff1c\r\n\uff1e e\u3000\uff1c\r\n\uff1e s\u3000\uff1c\r\n\uff1e s\u3000\uff1c\r\n\uff1e a\u3000\uff1c\r\n\uff1e g\u3000\uff1c\r\n\uff1e e\u3000\uff1c\r\n\uff1e ? \uff1c\r\n\uffe3Y^Y^\uffe3\r\n\r\n# \"[\" \"]\" \u3092\u9664\u53bb\u3059\u308b\u3068\u3061\u3083\u3093\u3068\u51fa\u308b\r\n$ echo-sd --vertical \"TASK Display message\"\r\n\uff3f\u4eba\u4eba\uff3f\r\n\uff1e T\u3000\uff1c\r\n\uff1e A\u3000\uff1c\r\n\uff1e S\u3000\uff1c\r\n\uff1e K\u3000\uff1c\r\n\uff1e\u3000\u3000\uff1c\r\n\uff1e D\u3000\uff1c\r\n\uff1e i\u3000\uff1c\r\n\uff1e s\u3000\uff1c\r\n\uff1e p\u3000\uff1c\r\n\uff1e l\u3000\uff1c\r\n\uff1e a\u3000\uff1c\r\n\uff1e y\u3000\uff1c\r\n\uff1e\u3000\u3000\uff1c\r\n\uff1e m\u3000\uff1c\r\n\uff1e e\u3000\uff1c\r\n\uff1e s\u3000\uff1c\r\n\uff1e s\u3000\uff1c\r\n\uff1e a\u3000\uff1c\r\n\uff1e g\u3000\uff1c\r\n\uff1e e\u3000\uff1c\r\n\uffe3Y^Y^\uffe3\r\n<\/code><\/pre>\n<p>\u6709\u65f6\uff0c\u4e3a\u4e86\u5728\u9664\u9ed8\u8ba4\u9009\u9879\u4ee5\u5916\u7684\u60c5\u51b5\u4e0b\u8f93\u51fa\uff0c\u6211\u4f1a\u4ece\u6d88\u606f\u6b63\u6587\u4e2d\u5220\u9664\u65b9\u62ec\u53f7[]\u3002<br \/>\n\u5728echo-sd\u4e2d\uff0c\u5f53\u4ee5\u7eb5\u5411\u5199\u4f5c\u65b9\u5f0f\u8f93\u51fa\u65f6\uff0c\u4e3a\u4e86\u8fdb\u884c\u683c\u5f0f\u5bf9\u9f50\uff0c\u4f3c\u4e4e\u5c06\u5b57\u6bcd\u8f6c\u6362\u4e3a\u5168\u89d2\u5b57\u7b26\uff0c\u4f46\u5982\u679c\u6709\u65b9\u62ec\u53f7[]\u7684\u8bdd\uff0c\u6b63\u5219\u8868\u8fbe\u5f0f\u6216\u5176\u4ed6\u5185\u5bb9\u53ef\u80fd\u4f1a\u51fa\u9519\u5427\uff1f<br \/>\n\u6211\u8ba4\u4e3a\u5982\u679c\u4f60\u770b\u6e90\u4ee3\u7801\u7684\u8bdd\u5e94\u8be5\u80fd\u660e\u767d\uff0c\u4f46\u6211\u76ee\u524d\u5df2\u7ecf\u5f97\u5230\u4e86\u95ee\u9898\u7684\u89e3\u51b3\uff0c\u6240\u4ee5\u6ca1\u6709\u8fdb\u4e00\u6b65\u6df1\u7a76\u3002<\/p>\n<h1>\u793a\u4f8b\u6267\u884c<\/h1>\n<p>\u5982\u6b64\u4e00\u6765\uff0c\u5c31\u5b8c\u6210\u4e86\u8fd9\u6837\u7684\u4e1c\u897f\u3002\u5982\u679c\u8fd8\u52a0\u4e0a\u7eb5\u5411\u4e66\u5199\u7684\u8bdd\uff0c\u66f4\u52a0\u70e6\u4eba\u5f97\u65e0\u6cd5\u5fcd\u53d7\u5462\u3002<\/p>\n<pre class=\"post-pre\"><code>$ export ANSIBLE_SD_SELECTION=random\r\n$ ansible-playbook -i hosts echo-sd.yml\r\n\r\n\uff3f\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\uff3f\r\n\uff1e\u3000PLAY [localhost]\u3000\uff1c\r\n\uffe3Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^\uffe3\r\n\r\n\r\n\uff3f\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\u4eba\uff3f\r\n\uff1e\u3000TASK [Gathering Facts]\u3000\uff1c\r\n\uffe3Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^\uffe3\r\n\r\nok: [localhost]\r\n\r\n\u250f-\u2537-\u2513\r\n\u2503 T\u3000\u2503\r\n\u2503 A\u3000\u2503\r\n\u2503 S\u3000\u2503\r\n\u2503 K\u3000\u2503\r\n\u2503\u3000\u3000\u2503\r\n\u2503 D\u3000\u2503\r\n\u2503 i\u3000\u2503\r\n\u2503 s\u3000\u2503\r\n\u2503 p\u3000\u2503\r\n\u2503 l\u3000\u2503\r\n\u2503 a\u3000\u2503\r\n\u2503 y\u3000\u2503\r\n\u2503\u3000\u3000\u2503\r\n\u2503 m\u3000\u2503\r\n\u2503 e\u3000\u2503\r\n\u2503 s\u3000\u2503\r\n\u2503 s\u3000\u2503\r\n\u2503 a\u3000\u2503\r\n\u2503 g\u3000\u2503\r\n\u2503 e\u3000\u2503\r\n\u2517\u2501\u2501\u251b\r\n\r\nok: [localhost] =&gt; {\r\n    \"msg\": \"\u7a81\u7136\u306e\u6b7b\"\r\n}\r\n\r\n\uff3f\u4eba\u4eba\uff3f\r\n\uff1e P\u3000\uff1c\r\n\uff1e L\u3000\uff1c\r\n\uff1e A\u3000\uff1c\r\n\uff1e Y\u3000\uff1c\r\n\uff1e\u3000\u3000\uff1c\r\n\uff1e R\u3000\uff1c\r\n\uff1e E\u3000\uff1c\r\n\uff1e C\u3000\uff1c\r\n\uff1e A\u3000\uff1c\r\n\uff1e P\u3000\uff1c\r\n\uffe3Y^Y^\uffe3\r\n\r\nlocalhost                  : ok=2    changed=0    unreachable=0    failed=0\r\n<\/code><\/pre>\n<p>\u559c\u95fb\u4e50\u89c1\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u8fd9\u662f\u300aAnsible Advent Calendar 2017\u300b\u7684\u7b2c10\u7bc7\u6587\u7ae0\u3002 \u8fd9\u662f\u4e00\u4e2a\u6709\u8da3\u7684\u8bdd\u9898\u3002  [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-42676","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u6211\u5bb6\u7684Ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u5bb6\u7684ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u6211\u5bb6\u7684Ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u8fd9\u662f\u300aAnsible Advent Calendar 2017\u300b\u7684\u7b2c10\u7bc7\u6587\u7ae0\u3002 \u8fd9\u662f\u4e00\u4e2a\u6709\u8da3\u7684\u8bdd\u9898\u3002 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u5bb6\u7684ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-26T11:59:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T07:07:18+00:00\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"51 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/\",\"name\":\"\u6211\u5bb6\u7684Ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-03-26T11:59:08+00:00\",\"dateModified\":\"2024-05-04T07:07:18+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u6211\u5bb6\u7684Ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u6211\u5bb6\u7684Ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u5bb6\u7684ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u6211\u5bb6\u7684Ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb","og_description":"\u9996\u5148 \u8fd9\u662f\u300aAnsible Advent Calendar 2017\u300b\u7684\u7b2c10\u7bc7\u6587\u7ae0\u3002 \u8fd9\u662f\u4e00\u4e2a\u6709\u8da3\u7684\u8bdd\u9898\u3002 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u5bb6\u7684ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-03-26T11:59:08+00:00","article_modified_time":"2024-05-04T07:07:18+00:00","author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"51 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/","name":"\u6211\u5bb6\u7684Ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-03-26T11:59:08+00:00","dateModified":"2024-05-04T07:07:18+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u6211\u5bb6\u7684Ansible\u6e34\u671b\u7a81\u5982\u5176\u6765\u5730\u6b7b\u53bb"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%ae%b6%e7%9a%84ansible%e6%b8%b4%e6%9c%9b%e7%aa%81%e5%a6%82%e5%85%b6%e6%9d%a5%e5%9c%b0%e6%ad%bb%e5%8e%bb%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42676","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=42676"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42676\/revisions"}],"predecessor-version":[{"id":99047,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42676\/revisions\/99047"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=42676"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=42676"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=42676"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}