terraform executa o script bash em instância

1

Qual é a maneira de executar um script sh na instância ec2 quando terraform está construindo recursos? Eu criei um ami com alguns arquivos no diretório para executar, se eu entrar via ssh eu posso executar o arquivo da seguinte forma:

sh /home/resources/wso/bin/wso.sh

Eu tenho um arquivo start.tpl com o seguinte conteúdo:

#!/bin/bash

# update ubuntu
sudo apt-get update
# install nginx
sudo apt-get install nginx -y
sudo service nginx start

#start wso2
sh /home/resources/wso/bin/wso.sh

No meu main.tf eu tenho isso:

data "template_file" "start" {
  template = "${file("start.tpl")}"  
}

resource "aws_instance" "wnginx" {
  ami                    = "${var.instance_ami}"
  instance_type          = "${var.instance_type}"    
  user_data = "${data.template_file.start.rendered}"
}

O Nginx começa bem, mas meu script de início wso.sh não pode ser iniciado.

Existe alguma configuração do terraform para depurar meu start.tpl?

    
por mleaf 21.10.2018 / 08:57

3 respostas

0

Você está usando os dados do usuário de maneira errada. Por favor, veja a documentação do cloud-init .

Seu modelo deve conter algo como isto (formato YAML):

#cloud-config
write_files:
- path: /home/resources/wso/bin/wso.sh
    content: |
    #!/bin/bash

    # update ubuntu
    sudo apt-get update
    # install nginx
    sudo apt-get install nginx -y
    sudo service nginx start
runcmd:
- ["sh", "/home/resources/wso/bin/wso.sh"]

Como isso pode ser melhorado com pouco esforço, eu proporia usar isso como modelo:

#cloud-config
packages:
  - nginx
package_update: true
runcmd:
  - [systemctl, daemon-reload]
  - [systemctl, enable, nginx]
  - [systemctl, start, nginx]

Ele alcançará o mesmo que o seu script, mas usará o sistema fornecido para provisionar uma máquina e também removerá a necessidade, por exemplo. para manter sua própria AMI, como você poderia então apenas aplicar uma configuração cloud-init através dos dados do usuário e confiar nas Imagens Debian / Ubuntu.

Se isso não funcionar, você pode verificar /var/log/cloud-init.log . Como o formato do arquivo é YAML, lembre-se de que ele está sendo quebrado usando indention impróprio.

    
por 26.10.2018 / 10:17
0

Isso parece não estar relacionado ao terreno. O mecanismo userdata é uma função EC2. Para depurar userdata, você pode verificar /var/log/ e procurar por arquivos chamados cloud-init . Há pelo menos nas imagens baseadas no CentOS / AWS um arquivo chamado cloud-init-output que contém stdout / stderr do script userdata.

Outra forma seria usar o provisionador remote-exec terraforms, que permite executar comandos do terraform na máquina remota.

link

    
por 21.10.2018 / 12:07
0

Para verificar o conteúdo do script renderizado, você tem várias possibilidades:

  • execute o plano terraform e verifique as saídas
  • verifique os dados do usuário no console do EC2
  • use, por exemplo um null_ressource com um provisionador local-exec que produz o modelo renderizado com, por exemplo, echo ou cat.
por 21.10.2018 / 12:11

Tags