ansible 常见问题
获取模块信息
- 获取所有模块信息,100多个
- ansible-doc -l
获取每个模块的具体信息
ansible-doc
example:ansible-doc pingPING
A trivial test module, this module always returns
pong' on successful contact. It does not make sense in playbooks, but it is useful from
/usr/bin/udp’EXAMPLES:
Test ‘webservers’ statusudp webservers -m ping
嵌套执行命令roles
- name: create jdk home
file: path={{ remote_jdk_home }} state=directory mode=0755
- name: xxxxxxxxx
include: ../../init/tasks/main.yml
defaults 中变量定义
1:加双引号;2:变量名和变量之间,有空格;
diamond_db_key: "{{ diamond_db_ip }}_{{ diamond_db_name }}_dbkey"
manager_user1: "{{ manager_user_name }}"
tags
相同的tasks在不同的环境下面执行,通过tag来进行表面,如下图:
useage:
udp-playbook setup.yml -v -kK -i hosts.ini --tags "ta"
- name: 1
authorized_key: user={{ ansible_ssh_user }} key="{{ lookup('file', '~/.ssh/id_rsa.pub') }}" state=present
tags: ta
- name: 2
group: name={{ remote_user }}
tags: always
- name: 3
file: path={{ remote_home }} owner={{ remote_user }} group={{ remote_user }} state=directory recurse=yes mode=0755
tags: tb
常见错误
ansible 中 scp scp: ambiguous target 错误还是因为ssh 增加了 -t 参数, scp不支持 -t 参数
disable python warning
To control the discovery behavior:
- for individual hosts and groups, use the
ansible_python_interpreter
inventory variable - globally, use the
interpreter_python
key in the[defaults]
section ofansible.cfg
1 | [defaults] |
其它常见错误
问题 | 解决方案 |
---|---|
性能 | ansible现在并发执行的任务好像还不够,执行批量传大文件的任务等的比较久 — 用 synchronize 并将 fork 默认的5改大 |
sudoers | 尝试解决ansible不能执行的问题,搜索各种英文文档,有人说版本的原因,有人反馈是脚本错误,最终无解。 继续在本地进行测试,发现使用原始的ansible命令可以执行ls,但是sudo ls时会提示 sudo need tty 之类的报错。 定位这个错误是因为在/etc/sudoers文件中设置了 Defaults requiretty,修改为 #Defaults requiretty,重试发现问题解决。 手工修改所有机器的配置文件,问题解决。{“msg”: “ssh connection closed waiting for a privilege escalation password prompt”}—实际在部分机器上执行ansible命令时仍然有:sudo: no tty present and no askpass program specified 可以给ssh 增加-t/-tt参数来强制分配一个tty |
failed to transfer file to xxx | 远端机器磁盘已经满,查看df -h,特别是/tmp |
requires a json module, none found | 问题已经通过nginx进行解决部署,安装ansible的时候,在目标机器上面安装 python-simplejson 通过如下命令:yum install python-simplejson -y |
openssh升级后无法登录报错 | sshrpm 升级后会修改/etc/pam.d/sshd 文件。需要升级前备份此文件最后还原即可登录。 |
安装EagleEye出现的问题 | 1.hadoop name -format 这个需要输入Y/N;2.ssh-key没搞定;3.我们原来可以for循环的地方,古谦脚本只能1条1条的加 |
使用lineinfile方法时,内容不能包含”: “(冒号+空格),这个与ansible底层的分隔符冲突; | 让用户在内容中不要包含”: “ |
https 相关 | SSL validation is not available in your version of python. You can use validate_certs=no, however this is unsafe and not recommended. You can also install python-ssl from EPEL |
You need a C++ compiler for C++ support | yum install -y gcc gcc-c++ |
1:udp权限问题,有时候会出现权限认证失败;2:udp如何执行本地命令; 3:udp线上有什么方便的安装方法 | 问题1:方法一 去掉sudo试试(报访问文件 /opt/aliUDP/logs/udp.log 失败,备份重新建一个udp.log 文件给于 777 权限); 方法二 指定 –private-key=PRIVATE_KEY_FILE (先试试直接ssh登录某台目标机器行不行) 问题2:udp支持直接运行目标机器上的命令,用法:udp server -i ~/ali/udp-roles/roles/udp-install/udp-hosts.ini -m shell -a “ uptime ; df -lh “ -u admin |
同一个ip部署不同的工程时,定义的变量会冲突;例如ip1同时部署mysql和diamond,都定义project_name;这样上面的会生效,下面定义的会被冲掉 | Wiki:http://gitlab.alibaba-inc.com/middleware-udp/udp-doc/wikis/Different_Hosts_With_Different_Variables 将变量分别定义在 ./roles/mysql/defaults/main.yml 和 ./roles/diamond/defaults/main.yml中 或者使用不同的变量名 |
执行udp-play-book 时会报找不到key的问题 | 在udp机器上执行 ssh-keygen 来生成key,解决 |
ssh 的时候需要手工 yes/no | 增加参数 -o StrictHostKeyChecking no 就不需要输入了 |
防火墙问题,本地可以访问,远程不能 | 通过抓包/telnet等方式来确认这个问题, 通过iptables stop 来临时关闭防火墙; 修改iptables 的配置永久关闭或者增加所有其它节点到白名单中 |
重要! hostname -i 一定要是本机在局域网内的真实ip地址(不是127.0.0.1 )。 要绑定etc/hosts 下面 把自己的hostname绑定到对应的真实ip上。 | |
在UDP PlayBook中如何定义不同的机器、不同的Role使用不同的变量 | http://gitlab.alibaba-inc.com/middleware-udp/udp-doc/wikis/Different_Hosts_With_Different_Variables |
Dauth部署问题总结 | http://gitlab.alibaba-inc.com/middleware-udp/udp-doc/wikis/Dauth-UDP-deployment-issues |
Device or resource busy | 一般出现在Docker中修改/etc/hosts会有这个问题,ansible会rm它,实际它是-v进去的,通过脚本补丁绕过去 |
ansible 中 scp scp: ambiguous target 错误还是因为ssh 增加了 -t 参数, scp不支持 -t 参数