SSH를 통해 액세스하고 .conf 파일의 키-값 쌍 구성 매개변수가 설정되어 있는지 확인해야 하는 50개의 Linux 서버 목록이 있습니다. 키-값 쌍이 존재하는지 확인해야 합니다. 키-값 쌍이 존재하는 경우 부울 값을 FALSE로 수정해야 합니다. 키-값 쌍이 존재하지 않는 경우 FALSE로 설정된 값으로 키-값 쌍을 생성해야 합니다.
SSH 부분에는 문제가 없으며 여기 문서를 사용하여 원격 서버에서 명령 목록을 실행합니다. 그러나 이 특정 솔루션에는 키-값 쌍을 확인하고 결과에 따라 작업을 수행하기 위해 원격 서버에 일부 bash 논리가 필요합니다. 이 문서에 bash 스크립트 논리를 통합할 수 있는 방법이 있습니까? 그렇지 않은 경우 이 특정 사례를 처리하는 다른 방법은 무엇입니까?
각 서버에 bash 스크립트가 있고 원격 서버에 필요한 논리를 수행하는 여기 문서에서 해당 스크립트를 호출할 수 있다고 생각하지만 추가 파일이 필요하지 않고 관리하는 스크립트를 찾고 싶습니다. 50 해당 파일에 대한 솔루션 서버입니다.
아래 샘플 코드는 일부 의사 코드를 사용하여 구현하려고 고려 중인 논리를 보여줍니다. 귀하의 도움과 조언에 미리 감사드립니다.
#! /bin/bash
SERVER_LIST=/path/to/servers_list.txt
for server in $(cat ${SERVER_LIST}); do
ssh ${server} <<CommandList
# if key-value pair exists in my.conf
# modify value to FALSE
# else
# add key-value pair with value set to FALSE
CommandList
done
구성 파일 예
[general]
setting1 = true
setting2 = false
setting3 = true
답변1
의견에서 말했듯이 더 나은 해결책은 ansible
.
또 다른 해결책은 기존 방식을 유지하는 것입니다.트레독, 파일을 올바르게 구문 분석하려면 다음을 TOML
사용할 수 있습니다 awk
.
setting3
그것이 맞는지 false
또는 맞는지 테스트하려면 true
(그런 다음 in 뒤에 임의의 논리를 적용할 수 있음 if/then/else/fi
):
#! /bin/bash
while read -r server; do
ssh ${server} <<'CommandList'
if awk '($1 == "setting3"){exit ($3 == "true") ? 0 : 1}' file.toml; then
echo "true case"
else
echo "false case"
fi
CommandList
done < /path/to/servers_list.txt
TOML
대신 실제 파서를 선호하는 경우 awk
:
perl -MTOML::XS -MFile::Slurper -E '
my $file = shift;
my $toml = File::Slurper::read_binary($file)
or die "arg1 need to be TOML file\n";
my $struct = TOML::XS::from_toml($toml)->to_struct();
if ($struct->{general}->{setting3}) {
say "true";
exit 0;
}
else {
say "false";
exit 1;
}
' file.toml
또 다른 TOML
파서는 Python 구현입니다 yq
(이 go
버전은 구문 분석하지 않습니다 TOML
).파이썬 yq
편집하다제자리에,당신이 사용할 수있는
gawk -i inplace .......
답변2
를 사용하면 <<something
줄 시작 부분에 "무언가"가 보일 때까지 무언가를 설명할 것입니다.
예를 들어 $var
이를 $var 값으로 해석하여 $var 값으로 바꾸거나 다음을 수행할 수 있습니다.$( some shell script here possibly multiline, or with ; or with pipes, all will be interpreted and the resulting output placed as its place in the heredocument )
예를 들어:
cat <<EOF
Hello, I am process $$ running on $( hostname ), and here is a few informations about it:
$( printf "%s\n" "$PATH" | tr ':' '\n' | while read dir; do
printf "PATH entry %-40s: is on %s filesystem" "$dir" "$( df "$dir" | tail -n 1 | awk '{print $NF}' )"
done
)
EOF
# this will output something like :
Hello, I am process 25592 running on myhostname, and here is a few informations about it:
PATH entry /usr/local/bin : is on / filesystem
PATH entry /usr/bin : is on /usr/bin filesystem
...
이 예제는 끔찍하지만 쉘이 heredoc 내에서 이를 해석한다는 것을 보여주기 위한 것입니다.
설명하고 싶지 않다면 다음을 사용할 수 있습니다: <<'something'
cat <<'EOF' # only line different from previous ex.
Hello, I am process $$ running on $( hostname ), and here is a few informations about it:
$( printf "%s\n" "$PATH" | tr ':' '\n' | while read dir; do
printf "PATH entry %-40s: is on %s filesystem\n" "$dir" "$( df "$dir" | tail -n 1 | awk '{print $NF}' )"
done )
# will output:
Hello, I am process $$ running on $( hostname ), and here is a few informations about it:
$( printf "%s\n" "$PATH" | tr ':' '\n' | while read dir; do
printf "PATH entry %-40s: is on %s filesystem\n" "$dir" "$( df "$dir" | tail -n 1 | awk '{print $NF}' )"
done )
예, cat <<something
heredoc 출력의 일부 내용에 색상을 지정하는 등 다른 작업을 라인에서 수행할 수 있습니다.
cat <<something | grep -E --color=always '^|this_will_be_red|this_too'
blah blih
and this_will_be_red ...
and other things
and this_too will be red
foo bar
something