有没有更好的方法有条件地将用户添加到具有Ansible的组?

时间:2018-03-28 17:45:02

标签: ansible

我有一个配置主机用于Rails / rvm / passenger的剧本。我想添加使用相同的剧本来设置测试和制作。

在测试中,要添加到rvm群组的用户是jenkins。生产中的那个是passenger。我的下面的剧集摘录基于inventory_hostname参数执行此操作。

似乎在每个测试或生产主机的剧本中添加一个新的user:/when:块是错误的方法。我应该使用Ansible role吗? 感谢

---
- hosts: all
  become: true
...
  tasks:

  - name: add jenkins user to rvm group when on testing
    user: name={{ item }}
        shell=/bin/bash
        groups=rvm
        append=yes
    with_items:
        - jenkins
    when: "'bob.mydomain' in inventory_hostname"

  - name: add passenger user to rvm group when on rails production
    user: name={{ item }}
        shell=/bin/bash
        groups=rvm
        append=yes
    with_items:
        - passenger
    when: "'alice.mydomain' in inventory_hostname"

1 个答案:

答案 0 :(得分:1)

创建名为inventories/testing

的广告资源文件
[web]
alice.mydomain

[testing:children]
web

这将控制您在testing环境下运行Playbook时所针对的主机。

创建另一个名为group_vars/testing

的文件
rvm_user: jenkins

此文件将保留在testing环境下运行Playbook所需的所有变量。您的production文件应该具有相同的变量,但值不同。

最后在你的剧本中:

---
- hosts: all
  become: true
...
  tasks:

  - name: add user to rvm group
    user:
      name:   "{{ rvm_user }}"
      shell:  "/bin/bash"
      groups: rvm
      append: yes

现在,当您想要运行您的剧本时,您可以这样执行:

ansible-playbook -i inventories/testing site.yml

Ansible将做正确的事情,并在group_vars中查找testing文件并从那里读取变量。它将忽略未在您的环境中命名的文件或文件夹中的变量,但名为all的文件除外,该文件旨在用于整个剧本中的公共变量。

祝你好运 - Ansible是一个了不起的工具:)