【Ansible 文档】【译文】常见问题
http://docs.ansible.com/ansible/latest/faq.html
- 如何为一个task或者整个Playbook设置PATH或者任意其他环境变量?
通过environment关键词设置环境变量,可以在task或者play层级使用:
environment:
PATH: "{{ ansible_env.PATH }}:/thingy/bin"
SOME: value
注意:自从2.0.1开始,gather_facts setup 任务,也会从play中继承环境指令,你也许需要使用 | 默认过滤器来避免错误,如果在play级别设置环境变量
- 如何为不同主机设置不同的用户名和密码、端口等等?
设置主机清单变量,在清单文档中是最简单的方式:
注意:Ansible已经弃用
ansible_ssh_user
,ansible_ssh_host
, andansible_ssh_port
中的“ssh”,成为ansible_user
,ansible_host
, andansible_port。
如果你正在使用2.0以前的版本,你应该继续使用老风格的变量名。短变量名会被忽略。
举个例子,假设主机有不同的用户名和端口
[webservers]
asdf.example.com ansible_port=5000 ansible_user=alice
jkl.example.com ansible_port=5001 ansible_user=bob
也可以指定不同的连接方式:
[testcluster]
localhost ansible_connection=local
/path/to/chroot1 ansible_connection=chroot
foo.example.com ansible_connection=paramiko
也可以分文件分组定义变量: host_vars/<hostname>、 group_vars/<groupname>
- 如何让Ansible重用连接,启用kerberized SSH,或者让Ansible注意到本地的ssh config文件?
转换默认连接类型,在配置文件里面设置为,’ssh’,或者使用 ‘-c ssh’选项使用OpenSSH连接,而不是python的paramiko库。在 Ansible 1.2.1之后,’ssh’会默认使用。
paramiko在刚开始的时候是不错的,但是OpenSSH提供更多的高级选项。如果你正在使用这种连接类型的话,你可能会想在一个支持 ControlPersist 的新机器上运行 Ansible。
你同样可以管理老的客户端。如果你正在用 RHEL6,CentOS6,SLES 10或 SLES 11,OpenSSH的版本仍然有些过时,因此考虑使用Fedora或OpenSUSE客户端来管理节点,或者使用paramiko。
我们默认让paramiko作为默认选项,如果你第一次安装Ansible在一个EL box(rhel/centos)上,它提供了更好的用户体验。
- 如何配置跳板机来访问我没有直接访问权限的服务器
使用Ansible 2,你可以设置ProxyCommand用ansible_ssh_common_args 主机变量,任何指定的参数值被添加到sftp/scp/ssh命令行。
举个例子:
[gatewayed]
foo ansible_host=192.0.2.1
bar ansible_host=192.0.2.2
可以创建组变量,group_vars/gatewayed.yml 可以设置为下面的内容:
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q user@gateway.example.com"'
- 如何处理远端机器没有Python 2.x在/usr/bin/python 的位置
尽管你可以使用其他语言编写 Ansible 模块,但大部分 Ansible 模块是用 Python 写的 ,而且一些是非常重要的核心模块
默认情况下, Ansible 假定它可以在远程机器上找到 2.x版本以上的 /usr/bin/python ,指定为2.4或者更高的版本。
设置 inventory 变量 ‘ansible_python_interpreter’ ,允许 Ansible自动替换掉默认的 python解释器。因此你可以指向任何版本的 python ,尽管/usr/bin/python不存在
一些 Linux 操作系统,例如 Arch 可能默认安装的是 Python 3. 这会让你在运行模块的时候出现语法错误信息。 Python 3和 Python 2 在本质上还是有些区别的。Ansible 当前需要支持哪些更老版本的 Python 用户,因此还没有支持 Python 3.0。这不是一个问题,只需要安装 Python2 就可以解决问题。
当 Ansible 或 Python3.0 后来变得更加主流的时候,会支持Python 3.0
不要替换 python 模块的 shebang 行,Ansible 在部署的时候会自动处理。
- 确定配置文件位置
- 如何查看所有的ansible_开头的变量列表
Ansible 默认收集被管理的机器的 “facts” 。并且这些facts可以在Playbook和template中访问。为了查看某一台及其可以访问的所有facts,可以运行“setup”模块:
ansible -m setup hostname
这回打印一个字典,对于某个特定主机所有可以获取的facts。
- 如何查看我的主机所有已定义的清单变量
运行下面的命令,你可以看到你在inventory定义的变量结果。
ansible -m debug -a "var=hostvars['hostname']" localhost
- 如何遍历一个组的主机列表,在一个模版中
一个普遍的任务是遍历主机组内的主机列表,可能是为一组服务器填充模版配置文件。可以按照如下的方式使用:
{% for host in groups['db_servers'] %}
{{ host }}
{% endfor %}
如果你需要访问那些主机的facts,例如,每一个主机的ip地址,你需要确保facts已经被填充。
例如,确保你有一个与db_servers通信的play:
- hosts: db_servers
tasks:
- debug: msg="doesn't matter what you do, just that they were talked to previously."
然后,你可以在template中使用facts,像下面这样:
{% for host in groups['db_servers'] %}
{{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
{% endfor %}
- 如何以编程的方式访问变量
可能出现这种情况,我们需要一个任意的ipv4地址接口,同时这个接口是通过角色提供参数或其他输入提供的。变量名可以通过组合字符串来构建,就像这样:
{{ hostvars[inventory_hostname]['ansible_' + which_interface]['ipv4']['address'] }}
这个遍历主机变量的技巧是必要的,因为它是一变量名称扣减的字典。’inventory_hostname’ 是一个神奇的变量,因为它告诉你你在主机组循环中当前的主机是谁。
- 如何访问组中第一台主机的变量
假设如果我们需要web服务器组中第一台web服务器的ip地址怎么做?注意,如果你使用了动态的inventory,第一台host可能不是确定的,因此你可能不希望这样做,除非你的inventory是静态的或者可预期的。
ps: 如果你使用Ansible Tower,他会使用数据库顺序,因此这不是一个问题即使你使用的是基于云的inventory脚本。
如下:
{{ hostvars[groups['webservers'][0]]['ansible_eth0']['ipv4']['address'] }}
注意,我们如何获得 webserver 组内的第一台机器的主机名。如果你也在在模板中这么做,你可以用 Jinja2 “#set” 指令来简化,或者在一个playbook中,你也可以set_fact
- set_fact: headnode={{ groups[['webservers'][0]] }} - debug: msg={{ hostvars[headnode].ansible_eth0.ipv4.address }}
- 如何递归的复制文件到目标主机
copy模块有递归参数,如果你想更加高效的处理大量的文件,看一下 “synchronize”模块,封装了rsync。自行看一些模块索引获取一些他们的信息。
- 如何访问shell环境变量
如果你需要访问存在的变量,使用env lookup 插件。例如:
---
# ...
vars:
local_home: "{{ lookup('env','HOME') }}"
如果你需要设置环境变量,移步Advanced Playbooks部分,关于环境。
自从Ansible 1.4起,远程环境变量是可获得的,通过facts中ansible_env的变量:
{{ ansible_env.SOME_VARIABLE }}
- 如何为用户模块产生加密的密码
mkpasswd 工具在大部分Linux下都可以使用,是一个很好的选择:
mkpasswd --method=sha-512
如果上述的工具没有安装,你仍然可以使用Python来产生密码,但是首相确保 Passlib 的Python库已安装。
pip install passlib
如果库已经安装,按照如下方式产生密码:
python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.using(rounds=5000).hash(getpass.getpass())"
使用集成的 Hashing filters 来产生一个hash版本的密码。你不应该在你的Playbook或者host_vars使用普通的文本密码,相反, Using Vault in playbooks 来加密敏感数据
- 什么时候使用 {{}}。如何插入变量或动态变量名
一个固定的规则是:“总是使用{{}},除了使用when:的时候”。条件性的总是通过Jinja2运行来解析表达式,因此,when: /fail_when: /changed_when: 总是模版化的,并且避免添加{{}}。
在大部分其他情况下,你应该使用括号,即使你可以使用变量而不需要指定(像with_clauses),因为这使得很难区分未定义变量和一个字符串。
下面这种叠加的方式不起作用:
{{ somevar_{{other_var}} }}
如果你需要使用动态变量,恰当地使用hostvars或者vars字典:
{{ hostvars[inventory_hostname]['somevar_' + other_var] }}
【Ansible 文档】【译文】常见问题的更多相关文章
- 【Ansible 文档】【译文】配置文件
这里说明一下配置文件的内容,原文地址:http://docs.ansible.com/ansible/latest/intro_configuration.html 这个与[Ansible 文档]配置 ...
- 【Ansible 文档】【译文】Playbooks 变量
Variables 变量 自动化的存在使得重复的做事情变得很容易,但是我们的系统不可能完全一样. 在某些系统中,你可能想要设置一些与其他系统不一样的行为和配置. 同样地,远程系统的行为和状态也可以影响 ...
- 【Ansible 文档】【译文】网络支持
Networking Support 网络支持 Working with Networking Devices 使用网络设备 自从Ansible 2.1开始,你现在可以使用成熟模型 - 编写 play ...
- 【Ansible 文档】【译文】Windows 支持
see also:List of Windows Modules Windows Support Windows 支持 Windows: How Does It Work Windows:如何工作 正 ...
- 【Ansible 文档】【译文】Ad-Hoc 命令介绍
Introduction To Ad-Hoc Commands Ad-Hoc命令介绍 下面的例子展示了如何使用 /usr/bin/ansible 来运行ad hoc任务. 什么是ad hoc命令? 一 ...
- 【Ansible 文档】【译文】入门教程
http://docs.ansible.com/ansible/latest/intro_getting_started.html Foreword 前言 到这里,你应该已经安装了Ansible,是时 ...
- .NET生成word文档服务器配置常见问题
注意:安装office2003的时候一定要选择 "完全安装" 而不是 "典型安装" 错误:System.Runtime.InteropServices.COME ...
- 【Ansible 文档】【译文】模版(Jinja2)
Templating (Jinja2) 正如在 variables 部分描述的那样, Ansible 使用Jinja2模版来启用动态表达式和访问变量. Ansible 扩展了许多 filtes 和 t ...
- 【Ansible 文档】【译文】模式
Patterns 模式 Ansible中的模式是指我们如何决定那些机器执行管理操作.这里意味着与那些主机通信,但是对于playbook,它是指哪些主机应用特定的配置或执行特定程序. 我们将重温一下In ...
随机推荐
- 网络之NSURLSession
NSUrlSession参考的这篇博客,自己也调试了它的代码:http://www.it165.net/pro/html/201406/15223.html ,对NSUrlSession还不太理解,先 ...
- Quartz2D截屏
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- 爬虫---selenium动态网页数据抓取
动态网页数据抓取 什么是AJAX: AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML.过在后台与服务器进行少量数据交换,Ajax 可以使网页 ...
- Spring基础(8) : properties配置文件
<context:property-placeholder location="p.properties"/> <bean id="p" cl ...
- WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter
一.如何从 Datagrid 中获得单元格的内容 DataGrid 属于一种 ItemsControl, 因此,它有 Items 属性并且用ItemContainer 封装它的 items. 但是,W ...
- JSON跨域解决方案收集
最近面试问的挺多的一个问题,就是JavaScript的跨域问题.在这里,对跨域的一些方法做个总结.由于浏览器的同源策略,不同域名.不同端口.不同协议都会构成跨域:但在实际的业务中,很多场景需要进行跨域 ...
- Net is as typeof 运行运算符详解
概述 在了解运行运算符的前提我们需要了解什么是RTTI ,在任何一门面向对象的语言中,都有RTTI这个概念(即 运行时). RTTI(Run-Time Type Identification),通过运 ...
- Oracle数据库操作---入门(一)
由于工作原因,近期可能会开始多复习一些数据库相关的知识了,想深入了解的,也可以一起复习.学习~ 前期先巩固一下基础操作,后期会一点点的加深向运维方向深入.开篇主要介绍一些数据库理论知识,不感兴趣的可以 ...
- CentOS总结归纳之基本操作(linux系管与运维一)
原创作品,转载请在文章明显位置注明出处:https://www.cnblogs.com/sunshine5683/p/10170009.html 使用命令关闭和重启系统: 一.条件:只有root用户才 ...
- Crazy Shopping(拓扑排序+完全背包)
Crazy Shopping(拓扑排序+完全背包) Because of the 90th anniversary of the Coherent & Cute Patchouli (C.C. ...