ansible知识点记录

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" && ech "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的用户的互信,那么就不必修改属组权限
    - name: 修改远程目标主机的authorized_keys的属组权限
      shell: sshpass -p 密码 scp -o StrictHostKeyChecking=no ssh {{ item }} chown -R {{ user_name }}:{{ user_name }} {{ item }}:/home/{{user_name }}
      with_items: "{{ host_list }}"

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变量值即不可用

你可能感兴趣的:(ansible知识点记录)