1、import_role模块 调用roles角色
- name: **
hosts: webapp
remote_user: root
gather_facts: no
vars_files:
- ./vars/ini.cfg
tasks:
- import_role: name=ssh_trust
2、
- import_role:
name: manage_jdk
tasks_from: other
调用角色manage_jdk,且调用角色里tasks目录里的other.yml,若未指明则默认运行main.yml
3、import_tasks模块 调用角色的具体任务
main.yml解释:
- name: **
import_tasks: install.yml 【指明调用任务里install.yml脚本】
或
- name: **
import_tasks: install.yml
when: hostvar is defined
4、
- name: 检查是否安装jdk的rpm包
shell: (rpm -qa|grep "^java" && echo "yes" || echo "no") | grep -v java | tail -1
register: check_jdk_result
【解释:register登记,记录,将shell模块执行的结果保存至check_jdk_result变量里】
- name: 卸载jdk的rpm包
shell: for javapkg in $(rpm -qa|grep java); do rpm -e --nodeps $javapkg;done
when: check_jdk_result.stdout=="yes"
【解释:when模块判断check_jdk_result变量的输出值为yes就执行卸载】
register用于注册一个变量,保存命令的结果(shell或command模块),这个变量可以在后面的task、when语句或模板文件中使用
- name: test
shell: /bin/pwd
register: pwd_result
此时变量pwd_result的结果为:(register的结果集就是一个字典k/v)
【如下的详细信息如何获取?可以先单独执行shell模块,使用参数-vv查看其详细信息】
ansible-playbook test.yml -i invnetory/ini -vv
{
u'changed': True,
u'end': u'2014-02-23 12:02:51.982893',
u'cmd': [u'/bin/pwd'],
u'start': u'2014-02-23 12:02:51.980191',
u'delta': u'0:00:00.002702',
u'stderr': u'',
u'rc': 0, #这个就是命令返回状态,非0表示执行失败
'invocation': {'module_name': 'command', 'module_args': '/bin/pwd'},
u'stdout': u'/home/sapser', #以一个字符串保存命令结果
'stdout_lines': [u'/home/sapser'] #以列表保存命令结果
}
所以可以再加入when语句判断:
- name: test
shell: /bin/pwd
register: pwd_result
debug: msg="{{ pwd_result }}"
when: pwd_result.src=="0" 【如果不知道register保存的变量字典值,可以先执行shell模块带参数-vv查看其详细信息】
举例2:
- name: echo date
command: date
register: date_output
- name: echo date_output
command: echo "30"
when: date_output.stdout.split(' ')[2] == "30"
因为 register 获取到的输出内容都是字符串,而ansible又是python写的,所以可以使用python字符串的方法对其做处理,比如本文中使用的split,还可以使用find方法
6、- name: **
hosts: localhost
remoute_user: root
【 hosts: localhost 表示只作用于本机,hosts指定的主机是什么,接下来的ansible脚本就作用于哪个主机上】
7、为用户建立互信
- name: **
hosts: localhost 【注:这里作用的主机是本地】
remoute_user: root
gather_facts: no
tasks:
- name: 创建公钥集临时文件
file: path=/tmp/authorized_keys state=touch mode=0777
- name: 将公钥集文件置空
shell: cat /dev/null > /tmp/authorized_keys
- name: 将所有节点上的秘钥复制到公钥集文件中追加
shell: sshpass -p 密码 ssh {{ item }} -o StrictHostKeyChecking=no cat /home/{{ user_name }}/.ssh/id_rsa.pub >> /tmp/authorized_keys
with_items: "{{ host_list }}"
- name: 将本地的秘钥集文件复制到远程所有节点上
shell: sshpass -p 密码 scp -o StrictHostKeyChecking=no /tmp/authorized_keys {{ item }}:/home/{{user_name }}/.ssh/
with_items: "{{ host_list }}"
【故scp远程复制命令本地/tmp/authorized_key就指localhost的本地文件了;如果hosts指定的是IP1,那么/tmp/authorized_key
就指IP1所在的主机的本地文件了】
注:如上使用的远程用户是root,所以将本地的秘钥文件authorized_keys拷贝至远程目标主机后属组为root,因此还需修改其属组权限
如果是配置root的用户的互信,那么就不必修改属组权限
且前提是要创建用户的时候生成了秘钥文件id_rsa.pub
- name: 修改远程目标主机的authorized_keys的属组权限
shell: sshpass -p 密码 ssh {{ item }} -o StrictHostKeyChecking=no chown -R {{ user_name }}:{{ user_name }} {{ item }}:/home/{{user_name }}
with_items: "{{ host_list }}"
【注】:
ansible脚本执行关于shell命令ssh之类的报错信息如下:
The fingerprint for RS key sent by the remote hosts is SHA256. Offending ECDSA key in /root/.ssh/known_hosts.
说明是linux系统在一开始ssh各机器之间使用的是如下协议:
/etc/ssh/sshd_config文件中:HostKey /etc/ssh/ssh_host_ecdsa_key(协议)
后又改为:HostKey /etc/ssh/ssh_host_rsa_key(协议)
所以导致/root/.ssh/known_hosts文件中存在两种不同的协议,这就导致ansible使用ssh时报错!
解决方法:
删除/root/.ssh/known_hosts文件关于ECDSA协议的连接信息或清空整个/root/.ssh/known_hosts文件。
8、ansible执行远程使用的remote_user如root用户,未配置互信时该如何?
如
hosts: webapp
remote_user: root
在远程机器上未配置互信,可以在主机清单里添加上root用户的密码:
[webapp]
10.132.42.36
10.132.42.37
[webapp:vars]
ansible_user='root'
ansible_ssh_pass='123456'
主机清单hosts部分中常用到的变量:
ansible_ssh_host #要连接的主机名
ansible_ssh_port #端口号默认是22
ansible_ssh_user #ssh连接时默认使用的用户名【ansible_user】
ansible_ssh_pass #ssh连接时的密码
ansible_sudo_pass #使用sudo连接用户时的密码
ansible_ssh_private_key_file #秘钥文件如果不想使用ssh-agent管理时可以使用此选项
ansible_shell_type #shell的类型默认sh
ansible_connection #SSH连接的类型:优先使用基于 ControlPersist 的 ssh (支持的前提)
ansible_python_interpreter #用来指定 python 解释器的路径,同样可以指定ruby 、perl 的路径
9、facts组件是用来收集被管理节点信息的,使用setup模块可以获取这些信息
ansible 192.168.1.105 -m setup
当编写playbook时,gather_facts值True/Yes表示获取主机facts信息
gather_facts值False/No 表示不获取主机facts信息,因此主机facts变量值即不可用