ansible: 拼接字符串

需求

现在想拼接出如下的字符串:

192.168.10.1:2181,192.168.10.2:2181,192.168.10.3:2181

其中:

  • 主机ip可以通过groups[‘zk’]获取
  • 2181是定制的变量 zk_port
    本来想通过,如下形式得到:
{{ groups['zk'] | map() | join(',') }}

奈何没有一个过滤器能达到拼接字符串的功能

解决办法
在模板中写追加逻辑
{% set zk_hosts = [] %}
{% for item in groups['zk'] %}
     {{  zk_hosts.append("{}:{}".format(item, "2181")) }}
{% endfor %}
{{ zk_hosts |  join(',') }}
自己定义过滤器

我觉的这种办法比较靠谱,其他playbook也能用到的
代码仓库的链接

class FilterModule(object):

    def filters(self):
        return {
            'concat': self.concat_val
        }

    def concat_val(self, content, sep, *vals):
        end_data = [str(part) for part in vals]
        return content + sep.join(end_data)

使用的话,代码如下

{{ groups[‘zk’] | map(‘concat’, ‘’, ‘:’, ‘2181’) | join(‘,’) }}

[root@node-1 ~]# ansible all -m script -a '/root/1.sh' An exception occurred during task execution. To see the full traceback, use -vvv. The error was: NoneType: None 192.168.10.120 | FAILED! => { "changed": true, "msg": "non-zero return code", "rc": 127, "stderr": "Shared connection to 192.168.10.120 closed.\r\n", "stderr_lines": [ "Shared connection to 192.168.10.120 closed." ], "stdout": "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令\r\n", "stdout_lines": [ "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令", "/root/.ansible/tmp/ansible-tmp-1741417720.2994483-3150-28918715788217/1.sh:行4: ansible:未找到命令" ] }
03-09
<think>好的,我现在需要解决用户在使用Ansible执行脚本时遇到的错误。首先,用户运行了命令`ansible all -m script -a '/root/1.sh'`,结果返回了错误信息,显示目标主机192.168.10.120执行失败,返回码是127,并且有“ansible:未找到命令”的提示。 首先,我应该理解错误的原因。返回码127通常表示Shell命令中找不到可执行文件或命令。查看用户的错误输出,发现脚本的第4行多次出现“ansible:未找到命令”,这说明在目标主机上执行脚本时,系统无法找到ansible这个命令。 接下来,我需要分析为什么会发生这种情况。Ansible的script模块是将本地脚本传输到远程主机并在那里执行。所以,问题出在远程主机上,而不是控制节点。用户可能在脚本中调用了ansible命令,而远程主机并没有安装Ansible,导致找不到该命令。 可能的解决步骤包括: 1. **检查脚本内容**:用户使用的脚本/root/1.sh中的第4行是否有调用ansible命令。如果有,那么问题显然是因为远程主机没有安装Ansible。 2. **确认远程主机的环境**:需要确保远程主机上安装了Ansible,或者是否有必要在脚本中调用ansible命令。可能用户的本意是在控制节点上运行Ansible,但错误地在远程主机上执行了该命令。 3. **修改脚本或执行方式**:如果脚本确实需要在远程主机上运行Ansible,那么需要在那些主机上安装Ansible。但通常情况下,Ansible命令应该从控制节点发起,而不是在远程主机上执行。因此,可能需要调整脚本的逻辑,将需要在远程主机执行的任务通过Ansible模块直接管理,而不是通过脚本调用ansible命令。 4. **替代方案**:如果用户是想在控制节点上执行某些操作,应该直接在控制节点运行脚本,而不是通过Ansible的script模块分发到远程主机。或者,如果脚本中的任务可以通过Ansible的模块(如shell、command等)实现,那么直接使用这些模块会更合适。 此外,用户看到的错误信息中的路径`/root/.ansible/tmp/...`是Ansible在远程主机上临时存储脚本的位置,执行完后会自动清理。这也进一步说明脚本是在远程主机上运行的。 总结下来,根本原因是脚本中调用了ansible命令,而远程主机没有安装Ansible。解决方法要么在远程主机安装Ansible,要么修改脚本逻辑,避免在远程执行ansible命令。需要建议用户检查脚本内容,并考虑调整他们的工作流程,合理使用Ansible模块来完成任务,而不是在脚本中嵌套调用ansible命令。</think>以下是问题分析和解决方案的逐步说明: --- ### **错误原因分析** 1. **返回码127解读** `rc: 127`表示目标主机在执行脚本时找不到命令。具体错误信息`ansible:未找到命令`表明**远程主机**上不存在`ansible`命令。 2. **script模块的特性** 通过`ansible script`模块执行的脚本会被传输到**目标主机**运行(而非控制节点)。若脚本中包含`ansible`命令,则要求**所有目标主机必须安装Ansible**,否则会报此错误。 --- ### **验证步骤** 1. **检查脚本内容** 查看`/root/1.sh`第4行内容(错误提示位置),确认是否包含类似命令: ```bash ansible ... # 此命令在目标主机上执行时会失败 ``` 2. **验证目标主机的Ansible安装** 在目标主机上手动执行以下命令: ```bash which ansible || echo "Ansible未安装" ``` 如果输出提示未安装,则确认问题根源。 --- ### **解决方案** #### **方案一:修改脚本逻辑(推荐)** - **核心思路**:避免在远程主机上调用`ansible`命令,改用Ansible原生模块直接管理任务。 - **操作步骤**: 1. 将`1.sh`脚本中的任务改写为Ansible Playbook或直接通过`command`/`shell`模块执行。 2. 示例: ```bash # 直接通过Ansible执行命令,无需脚本嵌套 ansible all -m shell -a "your_original_command" ``` #### **方案二:在目标主机安装Ansible(不推荐)** - **适用场景**:确需在远程主机运行`ansible`命令时。 - **操作步骤**: 1. 通过Ansible临时命令安装Ansible(需具备权限): ```bash ansible all -m raw -a "yum install -y ansible" # CentOS ansible all -m raw -a "apt-get install -y ansible" # Ubuntu ``` 2. **风险提示**:此方法会导致Ansible嵌套调用,可能引发管理混乱。 --- ### **附加建议** - **调试技巧**: 添加`-vvv`参数查看完整错误堆栈: ```bash ansible all -m script -a '/root/1.sh' -vvv ``` - **路径检查**: 确保脚本中所有命令在目标主机的`$PATH`环境变量中存在,或使用绝对路径(如`/usr/bin/ansible`)。 --- ### **总结** 问题根源是**目标主机未安装Ansible**,而脚本中调用了`ansible`命令。建议优先重构脚本,直接使用Ansible模块替代嵌套的Ansible调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值