我正在使用Ansible进行一些简单的用户管理任务和一小组计算机.目前,我将我的手册设置为hosts: all
,我的主机文件只是一个列出了所有机器的组:
# file: hosts
[office]
imac-1.local
imac-2.local
imac-3.local
Run Code Online (Sandbox Code Playgroud)
我发现自己经常不得不针对一台机器.该ansible-playbook
命令可以限制这样的播放:
ansible-playbook --limit imac-2.local user.yml
Run Code Online (Sandbox Code Playgroud)
但这似乎有点脆弱,特别是对于潜在的破坏性剧本.离开limit
旗帜意味着剧本将在任何地方运行.由于这些工具偶尔会被使用,所以似乎值得采取措施来简化播放,因此我们不会在几个月后意外地进行核实操作.
是否有将playbook运行限制为单台机器的最佳实践?理想情况下,如果省略一些重要细节,剧本应该是无害的.
我是ansible的新手并且想知道如何这样做,因为以下不起作用
ansible-playbook -i '10.0.0.1,' yada-yada.yml --tags 'loaddata' django_fixtures="tile_colors"
Run Code Online (Sandbox Code Playgroud)
django_fixtures
我的变量在哪里?
variables command-line command-line-arguments ansible ansible-playbook
我遇到了一个我以前从未见过的错误.这是命令和错误:
$ ansible-playbook create_api.yml
PLAY [straw] ******************************************************************
GATHERING FACTS ***************************************************************
failed: [104.55.47.224] => {"failed": true, "parsed": false}
/bin/sh: 1: /usr/bin/python: not found
TASK: [typical | install required system packages] *****************************
FATAL: no hosts matched or all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/Users/john/create_api.retry
104.55.47.224 : ok=0 changed=0 unreachable=0 failed=1
Run Code Online (Sandbox Code Playgroud)
这是create_api.yml文件:
---
- hosts: api
remote_user: root
roles:
- api
Run Code Online (Sandbox Code Playgroud)
这是hosts文件:
[api]
104.55.47.224
Run Code Online (Sandbox Code Playgroud)
我可以删除角色部分,它不会进入第一个任务,它将使它只会使它成为行/bin/sh: 1: /usr/bin/python: not found
.这可能会发生什么?
注意:如果有人正在ping IP地址并且没有得到响应,您应该知道自从粘贴代码后我已经更改了IP地址.
编辑 …
当Ansible在对主机运行播放时遇到问题时,它会将主机名输出到用户主目录中以'.retry'结尾的文件中.这些通常不使用,只是导致混乱,有没有办法将它们关闭或放在不同的目录?
所有我的Ansible剧本/角色都签入我的git仓库.
但是,对于Ansible Galaxy角色,我总是必须在我想运行Ansible的每台机器上逐个明确地下载它们.
在Ansible抱怨在运行时缺少角色之前,确切地知道确切需要哪些Ansible Galaxy角色甚至是很难的.
如何管理Ansible Galaxy角色依赖项?我想让他们检查我的git repo以及其余的ansible代码,或者在我在新机器上运行Ansible时自动识别和下载它们.
当ansible变量不是寄存器/未定义时,我正在寻找一种执行任务的方法,例如
-- name: some task
command: sed -n '5p' "{{app.dirs.includes}}/BUILD.info" | awk '{print $2}'
when: (! deployed_revision) AND ( !deployed_revision.stdout )
register: deployed_revision
Run Code Online (Sandbox Code Playgroud) 我通过URI模块提取JSON,并希望将收到的内容写入文件.我能够获取内容并将其输出到调试器,因此我知道已收到内容,但我不知道编写文件的最佳做法.
根据Ansible文档,Playbook 是:
...真正简单的配置管理和多机器部署系统的基础,与已有的系统不同,非常适合部署复杂的应用程序.
而且,根据那些相同的文档,角色 是:
...基于已知文件结构自动加载某些vars_files,任务和处理程序的方法.按角色对内容进行分组还可以轻松与其他用户共享角色.
但是,这些与不同用例之间的区别对我来说并不是很明显.例如,如果我将我的/etc/ansible/hosts
文件配置为:
[databases]
mydb01.example.org
mydb02.example.org
[mail_servers]
mymail01.example.org
mymail_dr.example.org
Run Code Online (Sandbox Code Playgroud)
......那么这个" [databases]
"条目是什么......一个角色?或者某个剧本YAML文件的名称?或者是其他东西?!?
如果有人可以向我解释这些差异,我对Ansible的理解会大大提升!
[databases]
和类似的条目/etc/ansible/hosts
ansible.cfg
Ansible服务器上的生活,如何使用可用的Playbooks/Roles添加/配置Ansible?例如,当我跑步时ansible-playbook someplaybook.yaml
,Ansible如何知道在哪里找到该剧本?这是我正在使用的剧本片段(server.yml
):
- name: Determine Remote User
hosts: web
gather_facts: false
roles:
- { role: remote-user, tags: [remote-user, always] }
Run Code Online (Sandbox Code Playgroud)
我的主机文件有不同的服务器组,例如
[web]
x.x.x.x
[droplets]
x.x.x.x
Run Code Online (Sandbox Code Playgroud)
现在我想执行ansible-playbook -i hosts/<env> server.yml
,并覆盖hosts: web
从server.yml
运行这个剧本的[droplets]
.
我可以直接覆盖一次性的东西,而不server.yml
直接编辑吗?
谢谢.
我正在使用ec2模块,ansible-playbook
我想将变量设置为文件的内容.这是我目前正在做的事情.
cat
文件cat
传递给ec2模块的结果.我的剧本的示例内容.
vars:
amazon_linux_ami: "ami-fb8e9292"
user_data_file: "base-ami-userdata.sh"
tasks:
- name: user_data_contents
shell: cat {{ user_data_file }}
register: user_data_action
- name: launch ec2-instance
local_action:
...
user_data: "{{ user_data_action.stdout }}"
Run Code Online (Sandbox Code Playgroud)
我假设有一个更简单的方法来做到这一点,但我在搜索Ansible文档时找不到它.