Você pode usar sed
para fazer isso.
A primeira parte é bastante simples, encontrando uma rede comentada. O host e substituí-la por uma não comentada com um valor diferente pode ser feito com:
sed -i -e 's/^#network\.host: .*/network.host: 1.2.3.4/' "${ES_HOME}/config/elasticsearch.yml"
A opção -i
faz uma modificação no local, portanto, ela substituirá seu arquivo elasticsearch.yml
atual. (Você pode salvar um backup dele, por exemplo, elasticsearch.yml.bak
usando -i.bak
).
O argumento para -e
é um script sed, neste caso uma expressão regular com um comando search / replace. Ele corresponde a uma linha comentada, começando com #network.host
e a substitui por uma linha descomentada, incluindo um IP.
Se você deseja obter o IP ou o nome do host de uma variável de ambiente, pode fazer isso quebrando a string '...' em dois e inserindo a variável externa:
sed -i -e 's/^#network\.host: .*/network.host: '"${ip_address}"'/' "${ES_HOME}/config/elasticsearch.yml"
Mas note que isso pode ser frágil ... Se o conteúdo de ${ip_address}
incluir um caractere /
, isso quebrará o comando sed ...
Para a segunda parte, inserindo as linhas transport.host, você pode usar o comando i\
do sed para inserir uma linha antes da que você corresponde. Por exemplo, você pode combinar o último comentário na seção Rede ("... consulte a documentação do módulo de rede") e insira lá. Como você está inserindo várias linhas, você vai querer iniciar um novo bloco {
para que você possa executar vários comandos.
Isso deve ser feito (observe que esse é um comando que abrange várias linhas!):
sed -i -e '
/consult the network module documentation/{
i\
# Set custom transport settings:
i\
#
i\
transport.host: localhost
i\
transport.tcp.port: 9300
i\
#
}' "${ES_HOME}/config/elasticsearch.yml"
Agora podemos juntar tudo, e também adicionar um cheque para pular a inserção, se já foi feito antes. Podemos fazer isso procurando o comentário que inserimos ("Definir configuração de transporte personalizada") e usando o comando b
para pular para o final do script, pulando a seguinte edição nesse caso.
O script final é:
# Set your own IP into ${ip_address} however you have to.
ip_address=1.2.3.4
sed -i -e '
s/^#network\.host: .*/network.host: '"${ip_address}"'/
/^# Set custom transport settings/,$b
/consult the network module documentation/{
i\
# Set custom transport settings:
i\
#
i\
transport.host: localhost
i\
transport.tcp.port: 9300
i\
#
}' "${ES_HOME}/config/elasticsearch.yml"