【问题标题】:How can I run local-exec provisionner AFTER cloud-init / user_data?如何在 cloud-init / user_data 之后运行 local-exec 供应商?
【发布时间】:2022-01-15 14:40:12
【问题描述】:

在使用 local-exec 配置器运行 Ansible 剧本时,我在 Terraform 上遇到了竞争条件问题。在某一时刻,该剧本必须安装 APT 包。

但首先,我正在运行在 user_data 参数中指定的云配置文件 init.yml,它也安装了一个包。 因此,我收到以下错误:

Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

如何防止这种情况发生?


# init.yml

runcmd:
  - sudo apt-get update
  - sudo apt-get -y install python python3

# main.tf

resource "digitalocean_droplet" "hotdog" {
  image     = "ubuntu-18-04-x64"
  name      = "my_droplet"
  region    = "FRA1"
  size      = "s-1vcpu-1gb"
  user_data = file("init.yml")

  provisioner "local-exec" {
    command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i '${self.ipv4_address},' ./playbook.yml"
  }
}

【问题讨论】:

    标签: ansible terraform


    【解决方案1】:

    免责声明:与我的 ansible 相比,我的 terraform 知识相当稀少。以下应该可以工作,但我可能完全错过了以 terraform 为中心的选项


    一个非常简单的解决方案是使用until loop 以便重试任务直到成功。

    - name: retry apt task every 5s during 1mn until it succeeds (e.g. lock is released)
      apt:
        name: my_package
      register: apt_install
      until: apt_install is success
      delay: 5
      retries: 12
    

    更好的方法是确保不同的 dpkg 锁定文件上没有锁定。我没有进行练习以在 ansible 中实现这一点,您可能需要特定的脚本或自定义模块才能成功。如果你想试一试,有a question with a solution on serverfault

    在您的上下文中,由于这个问题实际上似乎很常见,所以我搜索了一下,发现了this issue on github。我认为我的如下调整将满足您的要求,并且可能有助于您的 init 阶段中的任何其他可能的竞争条件。

    将您的user_data 修改为:

    ---
    runcmd:
      - touch /tmp/user-init-running
      - sudo apt-get update
      - sudo apt-get -y install python python3
      - rm /tmp/user-init-running
    

    在你的剧本中:

    - name: wait for init phase to end. Error after 1mn
      wait_for:
        path: /tmp/user-init-running
        state: absent
        delay: 60
    
    - name: install package
      apt:
        name: mypkg
        state: present
    

    【讨论】:

    • 是的,这是我寻求的临时解决方案。但显然不是其他用例的理想选择。
    • 我相信我的编辑可以满足您的要求。
    • 或者从资源触发的null_resource 而不是local-exec 供应商也可以修复这种竞争条件。更理想的是,您可以将 TF 的基础设施链接到 Ansible 的软证明中,并将库存从 TF 连接到 Ansible,以避免这种情况。
    猜你喜欢
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2021-03-08
    • 2019-08-20
    • 2020-10-04
    • 2014-06-02
    • 2020-10-24
    • 2021-11-05
    相关资源
    最近更新 更多