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

时间:2015-03-09 14:57:43

标签: ansible ansible-playbook

我试着想一下如何构建一个ansible playbooks,我可以做一些动作并撤消它们(我可以安装或删除相同的包;放置文件或删除这个文件)。

如果我创建两个ansible playbooks: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

2 个答案:

答案 0 :(得分:3)

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

  1. 在我的ansible-role/defaults/main.yml我会定义一个变量标志

    # defaults file for ansible-role
    flag_undo: false
    
  2. 在我的ansible-role/tasks/main.yml我会

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

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

答案 1 :(得分:1)

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

乏/ main.yml:

---
installed_system_packages:
  - telnet
  - screen
  - postfix

latest_system_packages:
 - glibc

removed_packages:
 - sendmail

任务/ main.yml:

---
- 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这样的软件包,我可以将其从installed_system_packages移到removed_packages。或者,如果我想确保我运行最新版本的屏幕,我只需将其移至latest_system_packages列表即可。然后,只需重新运行角色即可应用更改。