如何在同一个ansible剧本中最好地组织安装和删除?

如何在同一个ansible剧本中最好地组织安装和删除?,ansible,ansible-playbook,Ansible,Ansible Playbook,我试图弄清楚我必须如何构造一个ansible playbooks,在这里我可以执行一些操作并撤销它们(我可以安装或删除相同的软件包;放置文件或删除此文件) 如果我创建两个ansible剧本:delete.yml和install.yml。可能存在如下问题: 我在安装中添加了一些内容,但不更改删除 例如: install.yml: --- - name: Add x2go repository apt_repository: repo='deb http://ppa.launchpad.net/

我试图弄清楚我必须如何构造一个ansible playbooks,在这里我可以执行一些操作并撤销它们(我可以安装或删除相同的软件包;放置文件或删除此文件)

如果我创建两个ansible剧本:delete.yml和install.yml。可能存在如下问题: 我在安装中添加了一些内容,但不更改删除

例如:

install.yml:

---
- name: Add x2go repository
  apt_repository: repo='deb http://ppa.launchpad.net/x2go/stable/ubuntu precise main' state=present
  apt_repository: repo='deb-src http://ppa.launchpad.net/x2go/stable/ubuntu precise main' state=present
  when: ansible_os_family == "Debian"
  tags:
    - remote-access-x2go
- name: Install x2go application
  apt: name=x2goserver update_cache=yes state=present
  apt: name=x2goserver-xsession update_cache=no state=present
  when: ansible_os_family == "Debian"
  tags:
    - remote-access-x2go
delete.yml:

---
- name: Add x2go repository
  apt_repository: repo='deb http://ppa.launchpad.net/x2go/stable/ubuntu precise main' state=absent
  apt_repository: repo='deb-src http://ppa.launchpad.net/x2go/stable/ubuntu precise main' state=present
  when: ansible_os_family == "Debian"
  tags:
    - remote-access-x2go
- name: Install x2go application
  apt: name=x2goserver update_cache=yes state=absent
  apt: name=x2goserver-xsession update_cache=no state=absent
  when: ansible_os_family == "Debian"
  tags:
    - remote-access-x2go

在某些情况下,我使用的一种方法是简单地列出要安装的软件包列表和要删除的软件包列表,然后遍历每个列表。我不仅对包使用此基本方法,还对其他东西使用此基本方法,如用户、组等。例如,我有一个“包”角色,其中包含以下文件:

vars/main.yml:

---
installed_system_packages:
  - telnet
  - screen
  - postfix

latest_system_packages:
 - glibc

removed_packages:
 - sendmail
---
- name: Install system packages (latest)
  yum: pkg={{ item }} state=latest
  with_items: latest_system_packages

- name: Install system packages
  action: yum pkg={{ item }} state=installed
  with_items: installed_system_packages

- name: Remove unwanted packages
  action: yum pkg={{ item }} state=removed
  with_items: removed_packages
tasks/main.yml:

---
installed_system_packages:
  - telnet
  - screen
  - postfix

latest_system_packages:
 - glibc

removed_packages:
 - sendmail
---
- name: Install system packages (latest)
  yum: pkg={{ item }} state=latest
  with_items: latest_system_packages

- name: Install system packages
  action: yum pkg={{ item }} state=installed
  with_items: installed_system_packages

- name: Remove unwanted packages
  action: yum pkg={{ item }} state=removed
  with_items: removed_packages

这样,如果我决定不再需要安装telnet这样的软件包,我可以将其从
已安装的系统软件包
移动到
已删除的软件包
。或者,如果我想确保运行的是最新版本的screen,我只需将其移动到
最新的系统软件包
列表中即可。然后,只需重新运行角色以应用更改。

这是一个非常有趣的想法。我个人从未尝试过“撤销”工作流,但我可以看到这个想法的好处,并希望有机会使用它。这就是我要做的

  • 在我的
    ansible角色/defaults/main.yml
    中,我将定义一个变量标志

    # defaults file for ansible-role
    flag_undo: false
    
  • 在我的
    ansible角色/tasks/main.yml中,我会

    - name: task foo bar
      command: falana dhimaka
    
    - name: undoing task foo bar
      command: undo falana dhimaka
      when: flag_undo=true
    
  • 因此,默认情况下,我们的标志始终为false。因此,在安装东西时,我会使用下面的第一个命令来运行我的剧本。要卸载,我将使用第二个命令

    ansible-playbook foo-play.yml
    ansible-playbook foo-play.yml --extra-vars "flag_undo=true"
    

  • 请注意:您不能在一个ansible任务中多次使用ansible模块,只能使用一个。这是因为ansible playbook中的任务基本上是关联数组,所以这里的单个键不能有多个值。@marbu不明白。在ansible 1.4.4中,我在任务中多次使用apt模块。@marbu是对的,您不能在每个任务中多次使用
    apt
    或任何其他模块。一项任务=一项行动。在上面的代码中,有多个
    apt
    apt\u存储库
    操作不起作用。你必须为每个动作定义一个单独的任务。我的问题是:如果我想撤销剧本?我有东西要删除/安装。当我想要撤销此->我需要安装已删除的内容并删除已安装的内容在上面的示例中,您只需将软件包放入相应的列表中。如果您决定不再需要“screen”,则将其移动以删除_包并运行此角色。如果以后您决定需要它,那么您只需将它移回已安装的_system_包并再次运行该角色。直到测试在以下情况下才起作用:flag_undo | bool==true
    when:flag_undo | bool