通过 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