Ansible基础记录如下:


Ansible架构图:

wKiom1gxs3nB9hBCAAIpSECX-zc484.png

ansible核心组件:
    - ansible core:Ansible的核心程序
    - host iventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等
    - core modules:Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机
    - custom modules:自定义模块
    - playbook(yaml,jinjia2):YAML格式文件,多个任务定义在一个文件中
    - connect plugin:连接插件,Ansible和Host通信使用

ansible特性:
    - 基于python实现,由Paramike,PyYAML和Jinjia2三个关键模块
    - 部署简单,agentless
    - 使用ssh协议
    - 主从集中化模式
    - 支持自定义模块
    - 支持playbook
    - 幂等性:一种操作可重复多次结果相同

invetory文件说明:

[web01]
192.168.0.1 ansible_ssh_user=root ansible_ssh_pass=xxx
[web02]
192.168.0.[2:5]    #从2到5的主机
[web03]    #对应变量
192.168.0.8 port=80 hostname="test01"    
192.168.0.9 port=8080 hostname="test02"
[web03:vars]    #对web03组定义变量
server1=ttxsgoto1.com
server2=ttxsgoto2.com
[webservers:children]    #组嵌套,webservers组包括web01和web02下的主机
web01
web02
[webservers:vars]    #组定义变量
server1=tttxsgoto.com

查看模块帮助信息:
    - ansible-doc -l
    - ansible-doc -s  module_name

ansible命令应用:
    ansible <host-pattern> [-f forks] [-m module_name] [-a args]
    -f forks:启动并发线程数
    -m module_name:使用的模块名
    -a args:模块特有的参数

常见模块:
    - command
    - cron
    - user
    - group
    - copy
    - file
    - ping
    - setup
    - service
    - shell
    - script
    - yum/apt

cron:计划任务
        present: 安装任务
        absent:移除任务
        ansible local -m cron -a 'minute=*/5 job="/bin/echo abc > /root/abc.log" name="test cron job"  state="absent" '
user:用户管理
        name:指明添加的用户名
        ansible local -m user -a 'name="user1"'
group:用户组管理
        ansible local -m group -a 'name=user1 gid=306 system=yes'    #添加用户组
        ansible local -m group -a 'name=user1 gid=306 system=yes state=absent'    #删除用户组
copy:文件复制
        src=:定义本地源路径
        content=:取代src=,定义内容直接写入到远程文件中
        dest=:定义远程路径,绝对路径
        ansible local -m copy -a 'src=/etc/fstab dest=/tmp/fstab.bak owner=root  mode=777'
        ansible local -m copy -a 'content="hello wrold\nabc\n" dest=/tmp/fstab.bak owner=root  mode=777'
file:文件管理属性
        path=: 指明文件路径,可以使用name、dest来替换
        ansible local -m file -a ' owner=bigdata group=bigdata  mode=644 path=/tmp/fstab.bak'    #修改权限和组信息
        ansible local -m file -a 'path=/tmp/fstab.bak.link src=/tmp/fstab.bak state=link'  #软链接
ping:测试主机联通性
        ansible local -m ping
setup:收集远程主机的facts
        每个被管理节点会将自己相关的信息发生给远程的ansible主机,用于模板调用变量
        ansible local -m setup
service:常用服务的运行状态
        enabled=: 开机自启动,为true和false
        name=: 服务名称
        state=: 启动状态,started,stopped,restarted;
        ansible local -m service -a "enabled=true name=nginx state=started"
shell:远程执行命令,可传递参数
        用到管道等功能的复杂命令时使用shell命令
        ansible local -m shell -a "echo xxx | passwd --stdin user1"
script:将本地脚本在远程上执行
        注意:使用相对路径指定脚本
        ansible local -m script -a "./test.sh"
yum/apt: 安装程序包
        name=:    需要安装的程序包,可以加版本号
        state=:    present,lastest安装,absent表示卸载
        ansible local -m yum -a "name=zsh"    #安装
        ansible local -m apt -a "name=zsh state=absent"    #卸载

playbook:通过yaml将多个模块组装起来运行多个任务

组成结构:
Playbooks:
    Tasks:任务列表
    Variables:变量
    Templates:模板
    Handlers:处理器,由某事件触发执行的操作
    Roles:角色

运行说明:
0)yaml语法检测
ansible-playbook –syntax-check /path/to/playbook.yaml
1)yaml测试运行
ansible-playbook -C /path/to/playbook.yaml
2)运行
ansiable-playbook /path/to/playbook.yml
-t TAGS  #给指定的任务定义一个调用标识
--tags=TAGS #给指定的任务定义一个调用标识
--skip-tags=SKIP_TAGS #跳过指定的标签
--start-at-task=START_AT #从哪个任务后执行
--list-tags    #查看标签

基本结构:

例子1:
- hosts: webservers
  remote_user: root
  tasks:
  - name: create nginx group
      group: name=nginx system=yes gid=208
  - name: create nginx user
      user: name=nginx uid=208 system=yes
- hosts: dbservers
  remote_user: root
  tasks:
  - name: copy file to dbsrvs
      copy: src=/etc/inittab dest=/tmp/inittab.bak
例子2(handler,vars):
- hosts: webservers
  remote_user: root
  vars:
  - package: httpd
  - service: httpd
  tasks:
  - name: install httpd package
    yum: name={{ package }} state=lastest
  - name: install configuration file for httpd
      copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify:
      - restart httpd
  - name: start httpd service
      service: enabled=true name=httpd state=started
  handlers:
  - name: restart httpd
    service: name=httpd state=restarted
  - name: copy file
    copy: content="{{ ansible_all_ipv4_addresses }}" dest=/tmp/test.txt
例子3(条件测试):
- hosts: webservers
  remote_user: root
  vars:
  - username: user1
  tasks:
  - name: create {{ username }}
      user: name={{ userneam }}
      when: ansible_fqdn == 'ttxsgoto'
例子4(迭代-for):
- hosts: webservers
  remote_user: root
  - name: add username
    user: name={{ item.name }} state=present groups={{ item.groups }}
    with_items:
      - {name:'testuser1',groups='user1'}
      - {name:'testuser2',groups='user2'}
- hosts: webservers
  remote_user: root
  - name: add username
    user: name={{ item }} state=present groups=group1
    with_items:
      - testuser1
      - testuser2
例子5(templates/tags  ansible-playbook test.yml --tags='conf_chage'):
 #tags: 在playbook可以为某个任务定义一个标签,在执行playbook时,通过tags可实现仅运行指定tasks任务
 - hosts: webservers
  remote_user: root
  vars:
  - package: httpd
  - service: httpd
  tasks:
  - name: install httpd package
    yum: name={{ package }} state=lastest
  - name: install configuration file for httpd
      template: src=/root/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
     tags:
     - conf_chage
     notify:
      - restart httpd
  - name: start httpd service
      service: enabled=true name=httpd state=started
  handlers:
  - name: restart httpd
    service: name=httpd state=restarted

roles:用于层次化、结构化的组织playbook;role能够根据层次结构自动装载变量文件、task以及handlers等,要使用roles只需要在playbook中使用include指令;roles通过分别将变量、文件、任务、模块及处理器放置在单独的目录中,并可以便捷地通过include它们的一种机制,角色一般用于基于主机构建服务的场景中;无实例,用到时在记录