我正在接管一个用于部署和升级应用程序的 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
是否可以在任务成功时执行诸如创建文件之类的操作,并且仅在文件不存在时重新运行它/将其标记为已更改?
最重要的是,是否可以在一个地方执行此操作并将其应用于每个游戏中的所有任务,以减少每个任务中的重复和混乱?
我建议您使用
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
有点晚了,但你也可以在 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 文件不存在时,这将运行,因此在之后运行时会跳过。