【Ansible 文档】【译文】常见问题

http://docs.ansible.com/ansible/latest/faq.htmlhtml

  • 如何为一个task或者整个Playbook设置PATH或者任意其余环境变量?

  经过environment关键词设置环境变量,能够在task或者play层级使用:node

environment:
  PATH: "{{ ansible_env.PATH }}:/thingy/bin"
  SOME: value

注意:自从2.0.1开始,gather_facts  setup 任务,也会从play中继承环境指令,你也许须要使用 | 默认过滤器来避免错误,若是在play级别设置环境变量python

  • 如何为不一样主机设置不一样的用户名和密码、端口等等?

  设置主机清单变量,在清单文档中是最简单的方式:web

注意:Ansible已经弃用ansible_ssh_useransible_ssh_host, and ansible_ssh_port 中的“ssh”,成为 ansible_useransible_host, and ansible_port。shell

若是你正在使用2.0之前的版本,你应该继续使用老风格的变量名。短变量名会被忽略。数据库

  举个例子,假设主机有不一样的用户名和端口编程

[webservers]
asdf.example.com  ansible_port=5000   ansible_user=alice
jkl.example.com   ansible_port=5001   ansible_user=bob

  也能够指定不一样的链接方式:centos

[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’会默认使用。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] }}
相关文章
相关标签/搜索