我正在构建 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) 所以我有一个在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
什么?
我注意到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) 所以我试图在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) 使用 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) 我想使用公共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)
我究竟做错了什么?
我试图在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) 我的问题类似于这个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,所以即使这是一个简单的解决方案,但它不是我可以使用的.
我正在使用 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 环境中工作。
我正在尝试制作通过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 服务帐户凭据文件的最佳实践是什么?
terraform ×5
ansible ×4
ssh ×3
amazon-ec2 ×2
aws-ec2 ×1
datadog ×1
ec2-ami ×1
github ×1
gitlab ×1
gitlab-ci ×1
idempotent ×1
jq ×1
json ×1
provisioning ×1
sudo ×1