1.Ansible Inventory定义主机和主机组,定义多个主机组方便维护

例如:

192.168.1.1 ansible_ssh_pass='1111111' #定义了主机和密码

192.168.1.2  ansible_ssh_pass='1111111'

[docker] #定义了一个组叫docker

192.168.1.10[1:3]  #定义了docker组下主机从192.168.1.101到192.168.1.103

[docker:vars]  # 定义docker组ssh登录的密码、端口或者账号等等

ansible_ssh_pass='1111111'

ansible_ssh_port=22  

[ansible:children] #定义一个组叫ansible,这个组下面包含docker组

docker

测试:ansible 192.168.1.1 -m ping -o

    192.168.1.1 | SUCCESS => {"changed": false, "ping": "pong"}

多个主机列表

  1)修改ansible.cfg中host定义到目录inventory      = /etc/ansible/inventory/

测试:ansible docker --list-hosts和ansible ansible --list-hosts

hosts (2):

192.168.1.1

192.168.1.2

#ansible test1 -m ping -o

192.168.1.1 | SUCCESS => {"changed": false, "ping": "pong"}

192.168.1.2 | SUCCESS => {"changed": false, "ping": "pong"}

2.动态Inventory: ansible中主机列表和变量信息支持从外部拉取

需要自己编写脚本获取,不受语言限制

Inventory内置参数

名称                           例子                                   解释
ansible_ssh_host               主机的名字                             SSH目的主机名或IP
ansible_ssh_port               22                                    SSH目的端口
ansible_ssh_user               root                                  SSH登录使用的用户名
ansible_ssh_pass               none                                  SSH认证所使用的密码
ansible_connection             smart                              ansible使用何种连接模式连接到主机
ansible_ssh_private_key_file   none                                  SSH认证所使用的私钥
ansible_shell_type             sh                                    命令所使用的shell
ansible_python_interpreter      /usr/bin/python                        主机上的python解释器
ansible_sudo                   定义host sudo 用户                     ansible_sudo=xxx
ansible_sudo_pass              none                                  host sudo密码
ansible_sudo_exe               ansible_sudo_exe=/usr/bin/sudo        host sudo路径
ansible_connection             ansible_connection=local              定义hosts 链接方式
ansible_ssh_private_key_file   ansible_ssh_private_key_file=/root/key 定义host秘钥

ansible_shell_type            ansible_shell_type=zsh                定义hosts shell类型

ansible_python_interpreter    ansible_python_interpreter=/usr/bin/python2.7 定义hosts任务执行python路径



远程命令模块:command、shell、scripts

Ansible Ad-Hoc组件

ansible命令都是并发执行


  1. copy模块批量下发文件:文件变化通过MD5来判断

    例如:$ansible 192.168.1.2 -m copy -a 'src=/home/test/dump.sh dest=/home/test/ owner=test group=test mode=600 backup=yes' -o

    192.168.1.2 | SUCCESS => {"changed": true, "checksum": "61c25bb854593abf2b6d5bd47b187b207a141c72", "dest": "/home/test/dump.sh", "gid": 500, "group": "test", "md5sum": "2ec1900bf05cadeb74a28f6d6597f4aa", "mode": "0600", "owner": "test", "size": 6979, "src": "/home/test/.ansible/tmp/ansible-tmp-1504495347.87-254032109614069/source", "state": "file", "uid": 500}

    例如:ansible strike -m copy -a 'src=/home/tain/test dest=/usr/tain/test owner=cctain group=cctain mode=644' -o  //指定拷贝到某个组

    获取远程文件状态信息:ansible 192.168.1.2 -m stat -a "path=/etc/sysctl.conf"

  2. 1)get_url 模块:实现在远程主机下载指定URL到本地

    $ansible 192.168.1.2 -m get_url -a "url=http://www.baidu.com dest=/tmp/index.html mode=0440 force=yes"

    2)定时任务模块:

    ansible 192.168.1.2 -m cron -a "name='crontab test' minute=0 hour=5,2 job='ls -alh > /dev/null'"

  3. 使用Ad-Hoc命令管理包和服务

    $ansible 192.168.1.2 -m yum -a 'name=httpd state=latest' -f 5 -o   //安装httpd,卸载就改成state=remove

    $ansible 192.168.1.2 -m service -a 'name=nginx state=started' -f -o

    192.168.1.2 | SUCCESS => {"changed": false, "name": "nginx", "state": "started"}

    验证服务是否有安装:

    $ansible 192.168.1.2 -m shell -a "rpm -qa nginx" -f 5 -o

    192.168.1.2 | SUCCESS | rc=0 | (stdout) nginx-1.12.1-1.el6.x86_64

    $ansible 192.168.1.2 -m shell -a "netstat -tpln| grep nginx" -f 5

    192.168.1.2 | SUCCESS | rc=0 >>

    tcp   0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      9930/nginx

  4. 用户管理

    1)通过openssl生成密码:因为ansible user的passwd参数需要接受加密后的值

    $echo ansible | openssl passwd -1 -stdin

    $1$fcpQxeGv$VErvNXelrmLxprVIZC/DS1

    使用user模块批量新建用户

  5. ansible192.168.1.2 -m user -a 'name=test password="$1$fcpQxeGv$VErvNXelrmLxprVIZC/DS1"' -f 5 -o

  6. 通过ssh 192.168.1.2 -l test 验证是否可以登录




ansible playbook 进行配置管理的组件,Ad-Hoc 无法支撑复杂环境的配置管理工作



1.ansible facts采集主机静态信息的一个组件

例如:ansible 192.168.1.2 -m setup  收集该服务器各种设备信息

ansible test -m setup -a "filter=ansible_all_ipv4_addresses"  //setup中单独指定一个信息

ansible 192.168.1.2 -m shell -a 'rpm -qa ruby-json facter'  //判断被控制机器上是否安装了这2个包

ansible 192.168.1.2 -m facter


2.ohai扩展facts信息

ohai是chef配置管理工具中检测节点属性的工具

ansible 192.168.1.2 -m shell -a "yum list| grep ohai"

ansible 192.168.1.2 -m ohai



Ansible role:采用role方式管理playbook,规范目录结构

[root@node1 playbook]# cat web.yml
- hosts: test  \\主机组,在/etc/ansible/hosts定义
  remote_user: root  \\远端执行任务的用户
  tasks: \\任务
  - name: install httpd  \\任务描述
    command: yum -y install httpd  \\调用ansible的command模块安装httpd
  - name: provide httpd.conf \\任务描述
    copy: src="/root/httpd.conf" dest="/etc/httpd/conf/httpd.conf" \\调用ansible的copy模块,httpd安装完成后将事先准备好的httpd.conf文件复制到/etc/httpd/conf目录下
    tags: conf  \\给此任务打标记,可单独执行标记的任务,使用 ansible-playbook -C 命令执行
    notify:  \\文件内容变更通知
    - server restart  \\通知到指定的任务
  - name: server start  \\任务描述
    service: name=httpd state=started enabled=true \\调用ansible的service模块的属性定义安装完成httpd以后httpd服务的管理
  handlers: \\定义接受关注的资源变化后执行的动作
  - name: server restart  \\任务描述
    service: name=httpd state=restarted   \\当关注的资源发生变化后调用service模块,采取的响应的动作

roles/ \\ansible所有的信息都放到此目录下面对应的目录中
└── nginx  \\角色名称
    ├── default  \\为当前角色设定默认变量时使用此目录,应当包含一个main.yml文件;
    ├── files  \\存放有copy或script等模块调用的文件
    ├── handlers \\此目录总应当包含一个main.yml文件,用于定义各角色用到的各handler
    ├── meta \\应当包含一个main.yml,用于定义角色的特殊设定及其依赖关系;1.3及以后版本支持
    ├── tasks \\至少包含一个名为main.yml的文件,定义了此角色的任务列表,可使用include指令
    ├── templates \\template模块会自动在此目录中寻找Jinja2模板文件
    └── vars  \\应当包含一个main.yml文件,用于定义此角色用到的变量
     mkdir -pv roles/nginx/{tasks,files,templates,handlers,vars,meta,default}

Ansible Galaxy :官方分析role功能的平台

网址:https://galaxy.ansible.com/list#/roles

使用ansible-galaxy install默认安装到/etc/ansible/roles/