通过 ansible playbook 执行 bash 脚本
Execute bash script via ansible playbook
我正在寻找 运行 以下 shell 通过 ansible 剧本编写的脚本。
#!/bin/bash
oci compute instance list --lifecycle-state RUNNING --region ca-toronto-1 --compartment-id < compartment OCID> --all | grep display-name -A 0 > hostnames.txt
for line in `cat hostnames.txt`
do
#echo $line
if [[ $line == *","* ]]; then
# hostname=$(echo ${line//"display-name"/} | tr -d '",: ')
hostname=$(echo "$line" | tr -d '",')
echo "$hostname"
ssh -tt "$hostname" "sudo puppet agent -tv && sleep 10"
# break
fi
done
当我 运行 shell 脚本时,这就像我想要的那样工作,但是当我 运行 通过 ansible 时,我得到一个空白输出。
剧本:
---
- name: puppet agent trigger
gather_facts: false
become_user: true
hosts: all
tasks:
- name: trigger puppet agent
shell: |
oci compute instance list --lifecycle-state RUNNING --region ca-toronto-1 --compartment-id <compartment OCID> --all | grep display-name -A 0 > hostnames.txt
for line in `cat hostnames.txt`
do
if [[ $line == *","* ]]; then
hostname=$(echo "$line" | tr -d '",')
echo "$hostname"
ssh -tt "$hostname" "sudo puppet agent -tv && sleep 10"
fi
done
register: shell_output
- debug:
msg: "{{ shell_output.stdout }}"
请指出我遗漏了什么。
根据您的用例描述,似乎建议将脚本的整个逻辑转移到 Ansible 本身。为此,关于 add_host
_module 的评论,您可以使用类似
的方法
- name: Create an instance list
shell:
cmd: oc get nodes --no-headers | cut -d " " -f 1 | tr '\n' "," | rev | cut -c 2- | rev
register: instance_list
changed_when: false
为了生成 instance_list
我使用了 OpenShift 集群作为示例,因为我没有像 oci compute instance list ...
这样的东西可以访问。
- name: Add all hosts from instance_list to the script group
add_host:
name: '{{ item }}'
groups: script
loop: "{{ instance_list }}"
从那里您可以进一步执行您的命令 puppet agent -tv && sleep 10
。
我正在寻找 运行 以下 shell 通过 ansible 剧本编写的脚本。
#!/bin/bash
oci compute instance list --lifecycle-state RUNNING --region ca-toronto-1 --compartment-id < compartment OCID> --all | grep display-name -A 0 > hostnames.txt
for line in `cat hostnames.txt`
do
#echo $line
if [[ $line == *","* ]]; then
# hostname=$(echo ${line//"display-name"/} | tr -d '",: ')
hostname=$(echo "$line" | tr -d '",')
echo "$hostname"
ssh -tt "$hostname" "sudo puppet agent -tv && sleep 10"
# break
fi
done
当我 运行 shell 脚本时,这就像我想要的那样工作,但是当我 运行 通过 ansible 时,我得到一个空白输出。 剧本:
---
- name: puppet agent trigger
gather_facts: false
become_user: true
hosts: all
tasks:
- name: trigger puppet agent
shell: |
oci compute instance list --lifecycle-state RUNNING --region ca-toronto-1 --compartment-id <compartment OCID> --all | grep display-name -A 0 > hostnames.txt
for line in `cat hostnames.txt`
do
if [[ $line == *","* ]]; then
hostname=$(echo "$line" | tr -d '",')
echo "$hostname"
ssh -tt "$hostname" "sudo puppet agent -tv && sleep 10"
fi
done
register: shell_output
- debug:
msg: "{{ shell_output.stdout }}"
请指出我遗漏了什么。
根据您的用例描述,似乎建议将脚本的整个逻辑转移到 Ansible 本身。为此,关于 add_host
_module 的评论,您可以使用类似
- name: Create an instance list
shell:
cmd: oc get nodes --no-headers | cut -d " " -f 1 | tr '\n' "," | rev | cut -c 2- | rev
register: instance_list
changed_when: false
为了生成 instance_list
我使用了 OpenShift 集群作为示例,因为我没有像 oci compute instance list ...
这样的东西可以访问。
- name: Add all hosts from instance_list to the script group
add_host:
name: '{{ item }}'
groups: script
loop: "{{ instance_list }}"
从那里您可以进一步执行您的命令 puppet agent -tv && sleep 10
。