54

所以我想我应该尽可能开始使用 Ansible Galaxy,而不是编写自己的角色。我刚刚安装了我的第一个角色,它被安装到/etc/local/ansible/roles(我在 OSX 上)。

现在我想知道你如何在我真正需要的地方安装这个角色?我只是将角色复制到我需要的地方,还是有 Ansible 的方法?

4

6 回答 6

60

是的,您可以根据示例项目结构复制它们:

site.yml
webservers.yml
fooservers.yml
kubernetes.yaml
roles/
   common/
     files/
     templates/
     tasks/
     handlers/
     vars/
     meta/
   webservers/
     files/
     templates/
     tasks/
     handlers/
     vars/
     meta/
   kubernetes/
     files/
     templates/
     tasks/
     handlers/
     vars/
     meta/

或者您可以使用 or 选项运行ansible-galaxy以将-p ROLES_PATH--roles-path=ROLES_PATH安装在/your/project/root

/etc/local/ansible如果您愿意,也可以将该目录用作项目根目录。

此外,您可以通过运行命令获得帮助ansible-galaxy install --help

于 2014-03-06T04:24:41.437 回答
43

一般来说,我将所有共享角色都放在一个主文件夹中,该文件夹在我的所有项目中共享。这避免了手动复制/粘贴和更新同一角色的多个副本的繁琐。

除了本地项目文件夹之外,我还修改了每个项目ansible.cfg以告诉在该主文件夹中查找角色。ansible

样品ansible.cfg

[defaults]
roles_path = ~/Code/ansible_roles 

Ansible 首先在本地项目中搜索角色,然后搜索roles_path. 您可以通过用冒号分隔多个路径来指定它们。

默认情况下,ansible-galaxy install username.rolename会将角色安装到roles_path配置的 in 中ansible.cfg,所以这几乎就是您需要做的所有事情。

有时我想将角色安装到特定项目而不是主文件夹中。例如,当两个角色具有需要同一角色的不同版本的角色依赖关系时,避免版本冲突。在这种情况下,您可以使用-p ROLES_PATHor--roles-path=ROLES_PATH选项:

ansible-galaxy install username.rolename -p ~/Code/project_deploy/ansible/roles/

在 Ansible 1.9 中,您可以手动指定要将角色安装在项目的requirements.yml. 不幸的是,这个path参数在 Ansible 2 中被删除了

# from galaxy
- src: jeffwidman.elasticsearch

# from private github repo, installing to a relative path
- src: https://github.com/jeffwidman/private_ansible_role
  path: vagrant/roles/

如果您想进一步自定义内容,有一个未解决的问题来添加对多个ansible.cfg 文件的支持,这可以让您轻松设置roles_path不同级别的特异性。Ansible 将在当前工作目录、主目录或 中读取ANSIBLE_CONFIG,无论它先找到哪个。ansible.cfg.ansible.cfg/etc/ansible/ansible.cfg

于 2015-09-22T22:29:32.863 回答
31

以下是我如何解决处理星系角色的问题并适用于任何平台。

编辑您的ansible.cfg文件,该文件应该是您的源代码管理的一部分,并将其添加到其中:

roles_path = roles.galaxy:roles

创建一个名为roles.galaxyand 从现在开始的目录,当您这样做时ansible-galaxy install xxx.yyy,它将安装到roles.galaxy.

您将继续将本地角色保留在roles目录中,将社区角色保留在roles.galaxy. 它们都应该保存在你的 git repo 中。

永远不要考虑从 Galaxy 上安装它们,除了增加几个额外的故障点之外,这将是一个很大的安全风险。

于 2016-02-27T12:13:45.603 回答
15

我可能回答这个问题太晚了。但是你想要的可以用一个命令来完成:

ansible-galaxy install -p ./roles thefinn93.letsencrypt

会将letsencrypt角色安装到角色目录中,您无需复制内容。

于 2017-07-27T03:03:33.647 回答
2

要将您的角色保存在您的存储库文件夹中(这可能是您想要的,让您所有的东西版本受控是基础设施即代码之一),并假设这是您的目录布局:

repo-folder
    inventory     << likely you have this already
    roles         << this, too
    roles.galaxy  << create if you dont have it
    site.yml      << or whatever your playbook is called
    ansible.cfg   << repo-local config overriding gloabal ~/.ansible.cfg

打开上面显示的ansible.cfg(或者如果你还没有的话,重新创建它),并添加这个内容:

[defaults]
roles_path = roles.galaxy:roles

然后运行ansible-galaxy install SOMETHING会将其内容保存在roles.galaxy文件夹中。

于 2019-05-12T13:12:45.157 回答
1

我希望我的角色有一条全球路径。你可以这样做,我将 ansible.cfg 放在 ~/.ansible.cfg 中。基于项目的将始终优先。

cat ~/.ansible.cfg
[defaults]
roles_path = ~/.ansible/roles
于 2016-08-10T19:53:15.337 回答