我正在尝试使用Ansible来配置我的Vagrantbox,但我无法弄清楚如何处理主机文件.
根据文档应该存储/etc/ansible/hosts
,但我在我的系统(Mac OS X)上找不到这个.我还看到了host.ini
文件位于文件根目录中与vagrant文件相邻的示例.
所以我的问题是你在哪里存储你的主机文件来设置一个流浪盒?
我正在使用Ansible来设置EC2实例并部署应用程序.有一个主机脚本,它收集标签相关的服务器和组信息.我想把这些动作作为一个单一的剧本来运行,所以
但是,如果在播放期间创建/更新了服务器,则提前加载库存,因此没有服务器/组数据.我可以1)单独提供和部署剧本2)使用add_host技巧在服务器更新时模拟动态库存,但这些方法存在缺陷.
我可以强制Ansible重新加载库存吗?我的测试文件是:
hosts
脚本:
#!/bin/sh
echo `date` >> log.log
echo "{\"standalone\":[\"localhost\"]}"
Run Code Online (Sandbox Code Playgroud)
样品playbook.yml
:
---
- hosts: all
tasks:
- name: show inventory_hostname
command: echo {{ inventory_hostname }}
Run Code Online (Sandbox Code Playgroud)
我运行它ansible-playbook -i hosts playbook.yml -v
,看到两个运行:
$> cat log.log
Thu Mar 12 09:43:16 SAMT 2015
Thu Mar 12 09:43:16 SAMT 2015
Run Code Online (Sandbox Code Playgroud)
但是我还没有找到加倍它的命令.
我正在使用ansible 2.1.我有以下清单主机文件和一个需要访问主机文件变量的播放器调用的角色.有关如何访问它的任何想法(目前收到错误):
主机文件
[test1]
test-1 ansible_ssh_host=abc.def.ghi.jkl ansible_ssh_port=1212
[test2]
test2-1 ansible_ssh_host=abc.def.ghi.mno ansible_ssh_port=1212
[test3]
test3-1 ansible_ssh_host=abc.def.ghi.pqr ansible_ssh_port=1212
test3-2 ansible_ssh_host=abc.def.ghi.stu ansible_ssh_port=1212
[all:children]
test1
test2
test3
Run Code Online (Sandbox Code Playgroud)
角色 我试图访问在以下时尚的作用:
{{ hostvars.ansible_ssh_host }}
Run Code Online (Sandbox Code Playgroud)
&&
{{ hostvars.test1.ansible_ssh_host }}
Run Code Online (Sandbox Code Playgroud)
我试图访问test1部分中的ansible_ssh_host.
错误
fatal: [localhost]: FAILED! => {"failed": true, "msg": "'ansible.vars.hostvars.HostVars object' has no attribute 'ansible'"}
Run Code Online (Sandbox Code Playgroud) 对于备份,我需要遍历清单文件中的所有主机,以确保备份目标存在.我的结构看起来像
/var/backups/
example.com/
sub.example.com/
Run Code Online (Sandbox Code Playgroud)
所以我需要一个(内置)变量/方法来列出库存文件中的所有主机,而不仅仅是一个组.
对于团体,它看起来像这样
- name: ensure backup directories are present
action: file path=/var/backups/{{ item }} state=directory
owner=backup group=backup mode=0700
with_items: groups['group_name']
tags:
- backup
Run Code Online (Sandbox Code Playgroud) 我有一个虚假的怀疑让我长时间陷入困境.我有一个非常平庸的库存文件,包含主机和变量:
[lb]
10.112.84.122
[tomcat]
10.112.84.124
[jboss5]
10.112.84.122
...
[tests:children]
lb
tomcat
jboss5
[default:children]
tests
[tests:vars]
data_base_user=NETWIN-4.3
data_base_password=NETWIN
data_base_encrypted_password=
data_base_host=10.112.69.48
data_base_port=1521
data_base_service=ssdenwdb
data_base_url=jdbc:oracle:thin:@10.112.69.48:1521/ssdenwdb
Run Code Online (Sandbox Code Playgroud)
问题是我需要从inventory_vars/all文件访问清单文件中的所有这些主机和变量.
我尝试了以下方式来访问主机IP:
{{ lb }}
"{{ hostvars[lb] }}"
"{{ hostvars['lb'] }}"
{{ hostvars[lb] }}
Run Code Online (Sandbox Code Playgroud)
要访问我尝试的主机变量:
"{{ hostvars[tests].['data_base_host'] }}"
Run Code Online (Sandbox Code Playgroud)
所有这些都是错的!!! 任何人都可以帮我找出访问主机和变量的最佳实践,而不是从剧本中,而是从变量文件中获取?
编辑:
好.让我们澄清一下.
问题:在库存文件中使用变量文件中声明的主机,例如:group_vars/all.
示例:我有一个数据库主机IP:10.112.83.37
.
库存文件:
[db]
10.112.83.37
Run Code Online (Sandbox Code Playgroud)
在组中:vars/all文件我想使用该IP来构建变量.
group_vars/all文件:
data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb
Run Code Online (Sandbox Code Playgroud)
在模板中,我使用group_vars/all文件中内置的变量.
模板文件:
oracle_url = {{ data_base_url }}
Run Code Online (Sandbox Code Playgroud)
问题是{{ db }}
group_vars/all文件中的变量不会被DB主机IP替换.用户只能编辑库存文件.
我在 ubuntu 中运行我的服务器:
+ sudo cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
Run Code Online (Sandbox Code Playgroud)
我使用ansible,当我运行它时,出现以下错误:
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Failed to import the required Python library (Docker SDK for Python: docker (Python >= 2.7) or docker-py (Python 2.6)) on dd63315fad06's Python /usr/bin/python. Please read module documentation and install in the appropriate location, for example via `pip install docker` or `pip install docker-py` (Python 2.6). The error was: No …
Run Code Online (Sandbox Code Playgroud) 考虑我是否想快速检查一下.不需要连接到主机的东西(检查ansible本身的工作原理,包括处理程序或其他东西).或者localhost会这样做.我可能会放弃这个,但是手册页说:
-i PATH, - inventory = PATH
清单的PATH,默认为/ etc/ansible/hosts.或者,您可以使用以逗号分隔的主机列表或具有尾随逗号主机的单个主机.
当我在没有库存的情况下运行ansible-playbook时,它说:
[警告]:提供的主机列表为空,只有localhost可用
是否有一种简单的方法来针对没有主机或可能是localhost运行playbook?
在Ansible中,有几个地方可以定义变量:在库存中,在剧本中,在变量文件中等.任何人都可以解释我所做的以下观察吗?
例如,我在清单中定义了两个变量:
abc=false
xyz=False
Run Code Online (Sandbox Code Playgroud)
并且当在角色内部调试这些变量的类型时......
- debug:
msg: "abc={{ abc | type_debug }} xyz={{ xyz | type_debug }}"
Run Code Online (Sandbox Code Playgroud)
...然后abc
变成unicode
但xyz
被解释为bool
:
ok: [localhost] => {
"msg": "abc=unicode xyz=bool"
}
Run Code Online (Sandbox Code Playgroud)
但是,在剧本中定义相同的变量时,如下所示:
vars:
abc: false
xyz: False
Run Code Online (Sandbox Code Playgroud)
......然后两个变量都被识别为bool
.
在生产中执行一个剧本后,我不得不意识到这一点,运行一些不应该运行的东西,因为库存中的变量设置为'false'而不是'False'.因此,我真的想找到一个明确的答案,关于Ansible如何理解布尔值以及它如何取决于变量的定义位置和方式.我是否应该始终使用大写的True/False来保证安全?是否可以说YAML文件中的布尔值(格式key: value
)不区分大小写,而在属性文件(格式化key=value
)中它们区分大小写?任何更深入的见解将受到高度赞赏.
正如主题所说.我在主机清单文件中定义了一些主机变量.如何在我的剧本中访问它们?
这是一个例子.基于我所有的研究,我期待foo
并bar
成为其中的一部分hostvars
.我可以将主机特定变量放在单独的var文件中,但我希望将它们保存在我的库存文件"附加"到主机中.我不想在模板中使用它.ansible版本:1.3.2,ansible_distribution_version:6.4
bash $
bash $ ansible --version
ansible 1.3.2
bash $
bash $ cat test_inv.ini
[foobar]
someHost foo="some string" bar=123
someOtherHost foo="some other string" bar=456
bash $
bash $ cat test.yml
---
- name: test variables...
hosts: all
vars:
- some_junk: "1"
# gather_facts: no # foo and bar are unavailable whether I gather facts or not.
tasks:
- debug: msg="hostvars={{hostvars}}"
- debug: msg="vars={{vars}}"
- debug: msg="groups={{groups}}"
- debug: msg="some_junk={{some_junk}}"
# - debug: …
Run Code Online (Sandbox Code Playgroud)