IP 주소와 이름이 다른 여러 노드로 부팅하기 위한 쉘 스크립트

IP 주소와 이름이 다른 여러 노드로 부팅하기 위한 쉘 스크립트

안녕하세요, IP 파일과 이름을 전달하여 여러 노드로 부팅하려고 합니다. 아래는 내 코드입니다

출력: ip.txt 파일에서 IP를 가져와야 하며 name.txt 파일에서 이름을 가져와야 합니다.

IP=`cat ip.txt`

USER="ubuntu"

KEY="test.pem"

NAME=`cat name.txt`

for ip in $IP; do

        knife bootstrap  $ip -ssh-port 22 --ssh-user $USER --sudo  --i $KEY --no-host-key-verify -N $NAME --run-list "role[webserver]"

  done

exit $?

답변1

#!/bin/bash

# Read ip.txt and names.txt into arrays 'ips' and 'names'. This assumes that
# the files have the same number of lines, and that both files are in the
# correct order (i.e. line N of ip.txt corresponds to line N of name.txt),
# so that the indices for both arrays match.
mapfile -t ips < ip.txt 
mapfile -t names < name.txt 

# Don't use all-caps variable names in your own scripts, they're probably already
# used by other programs.  $USER certainly is.  Use lowercase variable names.
user="ubuntu"
key="test.pem"

for i in "${!ips[@]}"; do
  knife bootstrap  "${ips[$i]}" -ssh-port 22 \
    --ssh-user "$user" --sudo  --i "$key" \
    --no-host-key-verify -N "${names[$i]}" --run-list "role[webserver]"
done

참고: 내장되어 mapfile있습니다 . bash의 동의어입니다 readarray.

또한 참고: 저는 여기서 이것을 실행하지 않으므로 귀하의 명령이 원하는 대로 작동하는지 chef알 수 없습니다 . knife bootstrap구문이 정확하고 적절한 옵션을 사용했다고 가정합니다.

답변2

최신 스크립팅 사용:

ip=$(< ip.txt)
user="ubuntu"
key="test.pem"
name=$(< name.txt)

for i in $ip; do
    knife bootstrap  $i -ssh-port 22 \
        --ssh-user $user --sudo  --i $key \
        --no-host-key-verify -N $name --run-list "role[webserver]"
 done

그것이 무엇인지 잘 모르겠습니다

"role[webserver]"

연관 배열의 값인 경우 다음과 같이 작성해야 합니다.

"${role[webserver]}"

답변3

실제로 두 개의 서로 다른 파일에서 $IP 및 $NAME을 전달하여 다음 형식으로 출력을 얻으려고 합니다.

1.1.1.1 웹사이트 1

2.2.2.2 웹페이지 2

3.3.3.3 웹페이지 3

관련 정보