当 运行 一个 shell 脚本时 Ansible 剧本失败
Ansible playbook failed when running a shell script
所以我创建了这个 Ansible 剧本来:
- 复制一个 zip 文件并解压
- 复制一个 zip 文件并解压
- 使文件内的脚本可执行
- 运行 脚本
- 启用 2 项服务
- name: fideliplaybook
hosts: k8scluster
tasks:
- name: copying file with playbook
become: true
copy:
src: /home/lc/lc.zip
dest: /home/lc/
mode: 755
- name: Update apt cache and install unzip
become: true
command: apt install unzip
- name: unzip file
become: true
unarchive:
src: /home/lc/lc.zip
dest: /home/lc/
- name: make script executable
become: true
file: dest=/home/lc/lc/install.sh mode=755
- name: Execute the script
become: true
command: sh /home/lc/lc/install.sh
- name: Enable service 1
become: true
command: systemctl enable service1.service
- name: Enable service 2
become: true
command: systemctl enable service1.service
我在这里面临的问题是当ansible试图执行脚本“install.sh”
它以某种方式失败,因为脚本无法找到其他 2 个脚本,尽管其他脚本在同一个文件中。
所以 3 个脚本在 lc.zip 中,但是当 运行ning install.sh 使用 ansible 时,它找不到其他 2 个脚本。
我通过在第一个脚本中输入 2 个脚本的完整路径解决了这个问题。
但是任何人都知道为什么会出现这个问题。
当我使用 ansible 主机文件定义主机和变量时,还有一个问题,它不能像这样与 INI 一起工作:
[webservers]
www[01:50].example.com
它只在 YAML 中有效:
...
webservers:
hosts:
www[01:50].example.com:
有人知道为什么吗?
关于脚本没有找到其他两个脚本,如果路径总是固定的,你应该更新其他两个脚本的完整路径或者如果你想使用相对路径,你可以尝试以下,
- name: Execute the script
become: true
command: sh install.sh
args:
chdir: /home/lc/lc/
库存看起来不错。这里有一个测试来确认。
# cat test.ini
[webservers]
tstsrv[7:8]
# ansible-playbook -i test.ini test.yaml -u admin -k
SSH password:
PLAY [webservers] ***********************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************
ok: [tstsrv8]
ok: [tstsrv7]
TASK [print hostname] ***********************************************************************************************************************************************
changed: [tstsrv8]
changed: [tstsrv7]
PLAY RECAP **********************************************************************************************************************************************************
tstsrv7 : ok=2 changed=1 unreachable=0 failed=0
tstsrv8 : ok=2 changed=1 unreachable=0 failed=0
#
如果可能,考虑 script 模块专用于目标上的 运行 脚本。
所以我创建了这个 Ansible 剧本来:
- 复制一个 zip 文件并解压
- 复制一个 zip 文件并解压
- 使文件内的脚本可执行
- 运行 脚本
- 启用 2 项服务
- name: fideliplaybook
hosts: k8scluster
tasks:
- name: copying file with playbook
become: true
copy:
src: /home/lc/lc.zip
dest: /home/lc/
mode: 755
- name: Update apt cache and install unzip
become: true
command: apt install unzip
- name: unzip file
become: true
unarchive:
src: /home/lc/lc.zip
dest: /home/lc/
- name: make script executable
become: true
file: dest=/home/lc/lc/install.sh mode=755
- name: Execute the script
become: true
command: sh /home/lc/lc/install.sh
- name: Enable service 1
become: true
command: systemctl enable service1.service
- name: Enable service 2
become: true
command: systemctl enable service1.service
我在这里面临的问题是当ansible试图执行脚本“install.sh” 它以某种方式失败,因为脚本无法找到其他 2 个脚本,尽管其他脚本在同一个文件中。
所以 3 个脚本在 lc.zip 中,但是当 运行ning install.sh 使用 ansible 时,它找不到其他 2 个脚本。 我通过在第一个脚本中输入 2 个脚本的完整路径解决了这个问题。 但是任何人都知道为什么会出现这个问题。
当我使用 ansible 主机文件定义主机和变量时,还有一个问题,它不能像这样与 INI 一起工作:
[webservers]
www[01:50].example.com
它只在 YAML 中有效:
...
webservers:
hosts:
www[01:50].example.com:
有人知道为什么吗?
关于脚本没有找到其他两个脚本,如果路径总是固定的,你应该更新其他两个脚本的完整路径或者如果你想使用相对路径,你可以尝试以下,
- name: Execute the script
become: true
command: sh install.sh
args:
chdir: /home/lc/lc/
库存看起来不错。这里有一个测试来确认。
# cat test.ini
[webservers]
tstsrv[7:8]
# ansible-playbook -i test.ini test.yaml -u admin -k
SSH password:
PLAY [webservers] ***********************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************
ok: [tstsrv8]
ok: [tstsrv7]
TASK [print hostname] ***********************************************************************************************************************************************
changed: [tstsrv8]
changed: [tstsrv7]
PLAY RECAP **********************************************************************************************************************************************************
tstsrv7 : ok=2 changed=1 unreachable=0 failed=0
tstsrv8 : ok=2 changed=1 unreachable=0 failed=0
#
如果可能,考虑 script 模块专用于目标上的 运行 脚本。