小编Ale*_*hen的帖子

如何在失败时自动重试 github Action 作业?

我正在构建 github 操作管道,我想在我的作业中添加自动重试,类似于retry 关键字在 gitlab 中的工作方式,失败时将再次运行完整步骤。github actions 中有什么允许这样做的吗?

这是我正在使用的一个示例作业:

jobs:
  env-check:
    runs-on: ubuntu-latest
    container:
      image: myimage
    steps:
      - uses: actions/checkout@v2
      - name: env-check
        run: |
          echo "foobar"
Run Code Online (Sandbox Code Playgroud)

github

27
推荐指数
2
解决办法
2万
查看次数

如何使用terraform将ssh密钥添加到GCP实例?

所以我有一个在Google Cloud Platform中创建实例的terraform脚本,我希望能够让我的terraform脚本也将我的ssh密钥添加到我创建的实例中,以便我可以通过ssh配置它们.这是我目前的terraform脚本.

#PROVIDER INFO
provider "google" {
  credentials = "${file("account.json")}"
  project     = "myProject"
  region      = "us-central1"
}


#MAKING CONSUL SERVERS
resource "google_compute_instance" "default" {
  count    =  3
  name     =  "a-consul${count.index}"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  disk {
    image = "ubuntu-1404-trusty-v20160627"
  }

  # Local SSD disk
  disk {
    type    = "local-ssd"
    scratch = true
  }

  network_interface {
    network = "myNetwork"
    access_config {}
  }
}
Run Code Online (Sandbox Code Playgroud)

为了让我的terraform脚本添加我的ssh密钥,我需要添加/Users/myUsername/.ssh/id_rsa.pub什么?

ssh google-cloud-platform terraform

12
推荐指数
5
解决办法
1万
查看次数

Terraform:如何多次运行remote-exec?

我注意到terraform只会在资源上运行一次"file","remote-exec"或"local-exec".一旦资源被配置,如果"remote-exec"中的命令被更改或者来自供应者"file"的文件被更改,则terraform将不会对实例进行任何更改.那么每次运行terraform时,如何让terraform运行供应商"file","remote-exec"或"local-exec"?

更多细节:

由于"remote-exec"错误导致terraform停止(通常是因为我在编写脚本时输入了错误的命令),我经常部署资源.在此之后再次运行terraform将导致先前创建的资源被破坏并强制terraform从头开始创建新资源.这也是我可以在资源上运行两次"remote-exec"的唯一方法......从头开始创建它.

对于terraform来说,这确实是一个缺点,而不是ansible,它可以做与terraform完全相同的工作,除了它完全是幂等的.当使用Ansible执行诸如"ec2","shell"和"copy"之类的任务时,我可以完成与terraform相同的任务,只有每个任务都是幂等的.Ansible会自动识别何时不需要进行更改,它会在何处进行更改,因此可以自动识别失败的ansible-playbook停止的位置而不会破坏所有内容并从头开始.Terraform缺乏此功能.

这里是一个简单的terraform资源块,供ec2实例使用"remote-exec"和"file"配置器:

resource "aws_instance" "test" {

count = ${var.amt}
ami = "ami-2d39803a"
instance_type = "t2.micro"
key_name = "ansible_aws"
tags {
  name = "test${count.index}"
}

#creates ssh connection to consul servers
connection {
  user = "ubuntu"
  private_key="${file("/home/ubuntu/.ssh/id_rsa")}"
  agent = true
  timeout = "3m"
} 

provisioner "remote-exec" {
  inline = [<<EOF

    sudo apt-get update
    sudo apt-get install curl unzip
    echo hi

  EOF
  ]
}

#copying a file over
provisioner "file" {
  source = "scripts/test.txt"
  destination = "/path/to/file/test.txt"
}

}
Run Code Online (Sandbox Code Playgroud)

idempotent ansible terraform

12
推荐指数
2
解决办法
9702
查看次数

msg:没有处理程序准备好进行身份验证.检查了1名处理程序.['HmacAuthV4Handler']检查您的凭据

所以我试图在aws上的ec2实例上运行ansible,这是第一次在一个新的实例上,但每次我尝试运行一个游戏我都无法解决这个错误信息:

PLAY [localhost]
**************************************************************

TASK: [make one instance]
***************************************************** 
failed: [localhost] => {"failed": true} msg: No handler was ready to
authenticate. 1 handlers were checked. ['HmacAuthV4Handler'] Check
your credentials

FATAL: all hosts have already failed -- aborting

PLAY RECAP
********************************************************************
   to retry, use: --limit @/home/ubuntu/ans_test.retry

localhost                  : ok=0    changed=0    unreachable=0   
failed=1
Run Code Online (Sandbox Code Playgroud)

我认为我的IAM用户和组中的权限可能有问题.我已经给了我的IAM用户和组ReadOnlyAccess,AdministratorAccess和PowerUserAccess.我有一个访问ID和秘密访问密钥,我使用命令设置为环境变量:

   export AWS_ACCESS_KEY_ID='AK123'
   export AWS_SECRET_ACCESS_KEY='abc123'
Run Code Online (Sandbox Code Playgroud)

用'AK123'和'abc123'替换为我的实际id和键值.为了让ansible ec2任务有效,我还需要做些什么?

更新:
我解决了问题,我想我并没有真正了解环境变量是什么.我通过在ec2任务中设置我的aws_access_key和aws_secret_key来修复它,下面是我的工作剧本

- hosts: localhost  
  connection: local  
  gather_facts: False  

  tasks:  
    #this task creates 5 ec2 instances that are all named demo and …
Run Code Online (Sandbox Code Playgroud)

amazon-ec2 amazon-web-services ec2-ami ansible aws-ec2

10
推荐指数
2
解决办法
1万
查看次数

如何使用 JQ 字符串化 JSON

使用 JQ,我想获取一个复杂的 JSON 对象,其中包含作为字符串嵌入的 JSON,然后将其全部转换为可以轻松嵌入其他 JSON 对象的有效字符串。

例如,假设我有这个 json 对象:

{
  "region": "CA",
  "waf_rule_tags": "{\"RULEID:942100\":[\"application-multi\",\"language-multi\",\"platform-multi\",\"attack-sqli\",\"OWASP_CRS/WEB_ATTACK/SQL_INJECTION\",\"WASCTC/WASC-19\",\"OWASP_TOP_10/A1\",\"OWASP_AppSensor/CIE1\",\"PCI/6.5.2\"]}"
}
Run Code Online (Sandbox Code Playgroud)

我需要将其全部转换为以下字符串:

"{\"region\": \"CA\",\"waf_rule_tags\": \"{\\\"RULEID:942100\\\":[\\\"application-multi\\\",\\\"language-multi\\\",\\\"platform-multi\\\",\\\"attack-sqli\\\",\\\"OWASP_CRS/WEB_ATTACK/SQL_INJECTION\\\",\\\"WASCTC/WASC-19\\\",\\\"OWASP_TOP_10/A1\\\",\\\"OWASP_AppSensor/CIE1\\\",\\\"PCI/6.5.2\\\"]}\"}"
Run Code Online (Sandbox Code Playgroud)

这样我就可以获取该字符串并将其准确插入到text另一个 JSON 对象的字段下以创建以下内容。

{
      "title": "12345-accesslogs",
      "text": "{\"region\": \"CA\",\"waf_rule_tags\": \"{\\\"RULEID:942100\\\":[\\\"application-multi\\\",\\\"language-multi\\\",\\\"platform-multi\\\",\\\"attack-sqli\\\",\\\"OWASP_CRS/WEB_ATTACK/SQL_INJECTION\\\",\\\"WASCTC/WASC-19\\\",\\\"OWASP_TOP_10/A1\\\",\\\"OWASP_AppSensor/CIE1\\\",\\\"PCI/6.5.2\\\"]}\"}",
      "priority": "normal",
      "tags": ["environment:test"],
      "alert_type": "info"
}
Run Code Online (Sandbox Code Playgroud)

json jq datadog

10
推荐指数
2
解决办法
1万
查看次数

如何使用公共密钥对.pem文件的ansible playbooks?

我想使用公共aws keypair .pem文件来运行ansible playbooks.我想在不改变我的情况下这样做~/.ssh/id_rsa.pub,我不能从我当前创建一个新的密钥对,~/.ssh/id_rsa.pub并将其应用于我想要改变的ec2实例.

$ ansible --version
ansible 1.9.6
  configured module search path = None
Run Code Online (Sandbox Code Playgroud)

这是我的主机文件(请注意我的实际IP替换为1.2.3.4).这可能是问题,因为我需要一种方法来设置公钥变量并使用它:

[all_servers:vars]
ansible_ssh_private_key_file = ./mykeypair.pem

[dashboard]
1.2.3.4 dashboard_domain=my.domain.info 
Run Code Online (Sandbox Code Playgroud)

这是我的剧本:

---
- hosts: dashboard
  gather_facts: False
  remote_user: ubuntu

  tasks:
    - name: ping
      ping:
Run Code Online (Sandbox Code Playgroud)

这是我用来运行它的命令:

ansible-playbook -i ./hosts test.yml
Run Code Online (Sandbox Code Playgroud)

它会导致以下错误:

fatal: [1.2.3.4] => SSH Error: Permission denied (publickey).
    while connecting to 1.2.3.4:22
Run Code Online (Sandbox Code Playgroud)

我的密钥对没有问题:

$ ssh -i mykeypair.pem ubuntu@1.2.3.4 'whoami'
ubuntu
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

ssh amazon-ec2 ansible

9
推荐指数
2
解决办法
2万
查看次数

Terraform:heredoc锚中的无效字符

我试图在provisioner "remote-exec"我的terraform脚本块中使用多行字符串.然而,每当我使用EOT文档和各种示例中概述的语法时,我都会收到一个错误,抱怨:invalid characters in heredoc anchor.

下面是一个provisioner "remote-exec"收到此错误的简单示例(两种类型的EOT在单独尝试时都会收到此错误):

provisioner "remote-exec" {
  inline = [
    << EOT 
    echo hi 
    EOT,

    << EOT 
    echo \
    hi 
    EOT,
  ]
}
Run Code Online (Sandbox Code Playgroud)

更新:这是工作解决方案,如果您遇到此问题,请仔细阅读,因为在EOF方面,terraform非常挑剔:

provisioner "remote-exec" {
  inline = [<<EOF

   echo foo
   echo bar

  EOF
  ]
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果要使用EOF,则provisioner "remote-exec"块中使用的所有命令都必须位于EOF中.你不能同时拥有EOF和非EOF.

EOF的第一行必须像这样开始,你不能在这行中有任何空格,<<EOF否则它会抱怨invalid characters in heredoc anchor:

  inline = [<<EOF
Run Code Online (Sandbox Code Playgroud)

你的EOF必须以这样的方式结束,与之EOF相同的缩进]

  EOF
  ]
Run Code Online (Sandbox Code Playgroud)

terraform

8
推荐指数
1
解决办法
5282
查看次数

如何在terraform中运行sudo命令?

我的问题类似于这个git hub帖子,但遗憾的是它尚未解决:

https://github.com/hashicorp/terraform/issues/550

我想要一种简单的方法来provisioner "remote-exec" { }为我的terraform脚本块中运行的命令赋予sudo权限.

我来自一个ansible背景,它有一个sudo: yes选项,允许任何命令ansible运行--ask-sudo-pass在我的ansible-playbook运行命令中使用可选项时使用sudo权限运行命令.我想在provisioner "remote-exec"我的terraform脚本中执行类似的操作.

这是provisioner "remote-exec"我想要运行的块:

  provisioner "remote-exec" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y curl"
    ]
  }
Run Code Online (Sandbox Code Playgroud)

当我在我的运行中运行时,我terraform apply看到此命令的输出中出现以下行:

openstack_compute_instance_v2.test.0 (remote-exec): [sudo] password for myUserName:
openstack_compute_instance_v2.test.1 (remote-exec): [sudo] password for myUserName:
openstack_compute_instance_v2.test.2 (remote-exec): [sudo] password for myUserName:
Run Code Online (Sandbox Code Playgroud)

然后它只给了我无数的这些:

openstack_compute_instance_v2.test.0: Still creating... 
openstack_compute_instance_v2.test.1: Still creating... 
openstack_compute_instance_v2.test.2: Still creating... 
Run Code Online (Sandbox Code Playgroud)

那么如何解决这个问题并让terraform运行sudo命令呢?

注意:我的provisioner "remote-exec"块的连接不能是root,所以即使这是一个简单的解决方案,但它不是我可以使用的.

sudo provisioning terraform

7
推荐指数
1
解决办法
7218
查看次数

Ansible 如何在 ansible 2.7.x 之前忽略无法访问的主机

我正在使用 ansible 一次针对多个服务器运行命令。我想忽略由于“ "SSH Error: data could not be sent to remote host \"1.2.3.4\". Make sure this host can be reached over ssh"”错误而失败的任何主机,因为列表中的某些主机将处于脱机状态。我怎样才能做到这一点?ansible 中是否有默认选项可以忽略离线主机而不会使剧本失败?是否可以选择在ansible剧本之外的单个cli 参数中执行此操作?

更新:我知道ignore_unreachable: true适用于 ansible 2.7 或更高版本,但我在 ansible 2.6.1 环境中工作。

ssh ansible

7
推荐指数
2
解决办法
9374
查看次数

在 gitlab CI/CD 中使用 GOOGLE_APPLICATION_CREDENTIALS 的最佳实践

我正在尝试制作通过GCP terraform provider部署 GCP 实例的 GitLab 管道。像AWS其他平台有这样的环境变量$AWS_ACCESS_KEY_ID,并$AWS_SECRET_ACCESS_KEY可以用于验证请求,但GCP似乎使用服务帐户凭据文件,而不是。

我可以创建一个 CI gitlab 文件变量来包含我的 GCP 服务帐户凭据文件,但我只能以不安全的方式添加它。如果我尝试在 GitLab ci-cd 设置下屏蔽我的文件变量,则会产生错误消息This variable can not be masked.

在 GitLab CI/CD 环境变量中存储 GCP 服务帐户凭据文件的最佳实践是什么?

gitlab google-cloud-platform gitlab-ci terraform

7
推荐指数
1
解决办法
990
查看次数