如何使 Ansible Shell 任务幂等?

问题描述 投票:0回答:2

我正在接管一个用于部署和升级应用程序的 ansible playbook。

该剧本需要几个小时才能运行,并且由于 shell 任务、sql、依赖项等原因,在多个地方不是幂等的。

我有标签来限制剧本的某些部分,但我更希望有一种方法使每个任务幂等。
例如

- name: Add release application config
  become: yes  
  shell: "./applicationConfig.sh"
  tags: upgrade

- name: Add release database config
  become: yes  
  shell: "./databaseConfig.sh"
  tags: upgrade

是否可以在任务成功时执行诸如创建文件之类的操作,并且仅在文件不存在时重新运行它/将其标记为已更改?

最重要的是,是否可以在一个地方执行此操作并将其应用于每个游戏中的所有任务,以减少每个任务中的重复和混乱?

ansible
2个回答
0
投票

我建议您使用

script
模块,因为它允许 Jinja2 模板化脚本,并将其复制到目标主机并在那里执行。就像 shell 模块一样,脚本模块支持
creates
参数,该参数用于跳过任务(如果存在)。同样,
removes
参数可用于提高幂等性。

使用 Jinja2,您可以在一个地方执行此操作,并将其应用于每个游戏中的所有任务。

- name: Run a script only if file.txt does not exist on the remote node
  ansible.builtin.script: /some/local/create_file.sh --some-argument 1234
  args:
    creates: /the/created/file.txt

0
投票

有点晚了,但你也可以在 shell 模块中使用create,例如:

- name: Create SSH keypair - id_ed25519 and id_ed25519.pub
  ansible.builtin.shell:
    cmd: |
      ssh-keygen -t ed25519 -C "[email protected]" -N "" -f "$HOME/.ssh/id_ed25519"
    executable: /bin/bash
    creates: $HOME/.ssh/id_ed25519
  become: true
  become_user: ubuntu
  register: generate_keypair
  changed_when: generate_keypair.rc != 0

当 $HOME/.ssh/id_ed25519 文件不存在时,这将运行,因此在之后运行时会跳过。

© www.soinside.com 2019 - 2024. All rights reserved.