Ansible playbook运行shell脚本失败及主机清单INI格式失效问题咨询
问题1:install.sh执行时报同目录脚本不存在的根本原因
Ansible command 模块执行命令时,默认工作目录为远程节点SSH登录用户的家目录,而非install.sh脚本本身的存放目录。你脚本内引用其他脚本时如果用的是相对路径,相对的是命令执行时的工作目录,不是脚本所在目录,自然找不到同目录下的其他文件。你填绝对路径的方案是可行的,也可以在执行脚本的任务中添加chdir参数切换工作目录,写法参考:
- name: Execute the script become: true command: sh install.sh args: chdir: /home/lc/lc/
另外你的playbook还有几处可以优化的地方,避免后续出问题:
- 安装unzip不要用
command直接执行apt命令,用官方apt模块支持幂等,重复执行不会报错:- name: Install unzip become: true apt: name: unzip update_cache: yes unarchive模块默认会先在Ansible控制节点找src指定的文件,你现在是读取远程节点已传好的压缩包,需要加remote_src: yes参数,否则控制节点同路径下没有该文件时会执行失败:- name: unzip file become: true unarchive: src: /home/lc/lc.zip dest: /home/lc/ remote_src: yes- 最后启用服务的第二个任务写错了服务名,还是填的service1.service,另外建议用
systemd模块替代command执行systemctl命令,更规范:- name: Enable services become: true systemd: name: "{{ item }}" enabled: yes loop: - service1.service - service2.service
问题2:INI格式主机范围不生效的原因
Ansible对INI和YAML两种格式的清单范围语法都原生支持,INI格式不生效的核心原因是旧版本Ansible的INI清单解析器对补零格式的数字范围(也就是[01:50]这种带前导零的写法)兼容不好,而YAML格式的清单解析器对这类补零范围的适配更完善,所以换成YAML格式就能正常识别。
如果要排查INI格式的问题,可以执行ansible-inventory -i 你的清单文件路径 --list命令,查看解析后的主机列表是否符合预期。
内容的提问来源于stack exchange,提问作者Ahmed Gamal
相关产品推荐
相关产品推荐

