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命令都是并发执行
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"
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'"
使用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
用户管理
1)通过openssl生成密码:因为ansible user的passwd参数需要接受加密后的值
$echo ansible | openssl passwd -1 -stdin
$1$fcpQxeGv$VErvNXelrmLxprVIZC/DS1
使用user模块批量新建用户
ansible192.168.1.2 -m user -a 'name=test password="$1$fcpQxeGv$VErvNXelrmLxprVIZC/DS1"' -f 5 -o
通过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/