一、ansible的安装
1、yum源在线安装
在网易镜像上下载.repo文件,添加到本地的yum源目录下
http://mirrors.163.com/.help/centos.html
2、检测是否安装正确:ansible --version
3、配置文件的查看
/etc/ansible/ansible.cfg //ansible的主配置文件
/etc/ansible/hosts //这个配置文件就是默认主机清单配置文件
4、除了以上两个重要的配置文件还有三个重要的可执行文件分别是:
ansible 主执行程序,一般用于命令行下执行
ansible-playbook 执行playbook中的任务
ansible-doc 获取各模块的帮助信息
二、基本使用
1、定义主机组
host_key_checking = False //修改主配置文件,不需要检测key文件,直接登陆
ansible web --list-hosts //检测web包含哪些主机
[web] //定义组名
192.168.4.85 ansible_ssh_user="root"
ansible_ssh_pass="123456" ansible_ssh_port="22"
192.168.4.86 ansible_ssh_user="root"
ansible_ssh_pass="123456" ansible_ssh_port="22"
//上面定义了IP地址,远程的用户,远程的密码以及端口
2、基本的命令用法
ansible web -m ping 测试是否通信
ansible all -m command -a 'hostname' -k
//远程执行命令,-m调用的模块,-a调用的命令,-k交互式输入密码
3、批量部署密钥 ansible-doc -l | grep auth //查看安全模块
ansible all -m authorized_key -a "user=root exclusive=true manage_dir=true key='$(< /root/.ssh/id_rsa.pub)'" -k -v
//把生成的公钥推送到所有的主机, exclusive=true文件强制覆盖掉
三、常用的模块:
1、ping模块:测试主机是否是通的,用法很简单,不涉及参数:
ansible web -m ping
2、command 模块 远程执行命令 管道的命令不能执行
ansible all -m command -a "ifconfig"
3、shell模块:由于commnad只能执行裸命令(即系统环境中有支持的命令),至于管道之类的功能不支持,
shell模块可以做到
ansible all -m shell -a 'cat /etc/passwd | wc -l' -v
4、script 模块:把本地的脚本传到远端执行;前提是到远端可以执行。
ansible all -m script -a '/root/a.sh'
5、 copy模块:不适合大的文件
ansible web -m copy -a 'src=/etc/passwd dest=/root'
6、 lineinfile | replace 模块:line配置整行,replace匹配选中的,直接修改文件
ansible s87 -m lineinfile -a 'path="/etc/sysconfig/network-scripts/ifcfg-eth0" regexp="^BOOTPROTO=" line="BOOTPROTO=static"'
ansible s87 -m replace -a 'path="/etc/sysconfig/network-scripts/ifcfg-eth0" regexp="^(BOOTPROTO=).*" replace="\1none"'
7、 yum 模块:state(present/安装 absent/卸载 latest/更新)
ansible web -m yum -a 'name=httpd state=present' -v
8、service 模块:用于管理服务
state( started,stopped,restarted,reloaded),name=服务名称,enabled=yes|no
ansible web -m service -a 'name="httpd" enabled=yes state=started'
9、file模块:对远程文件管理的模块
state:
touch:创建一个新的空文件
directory:创建一个新的目录,当目录存在时不会进行修改
link:创建软连接,结和src一起使用此选项才生效
hard:创建硬连接
absent:删除文件,目录,软连接
ansible web -m file -a 'path=/tmp/test.txt state=touch'
四、playbook的基本使用
playbook 是 ansible 用于配置,部署,和管理托管主机剧本。通过 playbook 的详细描述,执行其中的一系
列 tasks,可以让进端主机达到预期的状态。执行一些简单的任务,使用ad-hoc命令可以方便的解决
问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的 ad-hoc 命令是不适合的,这时最好使用
playbook,就像执行 shell 命令不写 shell 脚本一样,也可以理解为批处理任务
play 中 hosts,variables,roles,tasks 等对象的表示方法都是键值中间以 ": " 分隔表示
playbook 构成:
Target: 定义将要执行 playbook 的进程主机组
Variable: 定义 playbook 运行时需要使用的变量
Tasks: 定义将要在进程主机上执行的任务列表
Handler: 定义 task 执行完成以后需要调用的任务
1、第一个playbook,vim myping.yml
--- # 第一行,表示开始
- hosts: all
remote_user: root
tasks:
- ping:
ansible-playbook myping.yml -f 5
-f 并发进程数量,默认是 5
hosts 行的内容是一个或多个组或主机的 patterns,以逗号为分隔符
remote_user 就是账户名
2、playbook 执行命令给所有主机添加用户 plj,设置默认密码 123456
– 要求第一次登录修改密码
---
- hosts: all
remote_user: root
tasks:
- name: create user plj
user: group=wheel uid=1000 name=plj
- shell: echo 123456 | passwd --stdin plj
- shell: chage -d 0 plj
3、编写 playbook 实现以下效果
– 安装 apache – 修改 apache 监听的端口为 8080
– 为 apache 增加 NameServer 配置 – 设置默认主页 hello world
– 启动服务 – 设置开机自启动
- hosts: web
remote_user: root
tasks:
- yum: name=httpd
- name: config
copy:
src: /root/httpd.conf
dest: /etc/httpd/conf/httpd.conf
notify: //notify模块:触发器
- restart httpd
handlers: // task 执行完成以后需要调用的任务
- name: restart httpd
service: name=httpd state=restarted
4、变量
给所有主机添加用户 plj,设置默认密码 123456
要求第一次登录修改密码(使用变量)
---
- hosts: web
remote_user: root
vars:
username: haha
tasks:
- user: name={{username}} group=users password={{'123456' | password_hash('sha512')}}
- shell: chage -d 0 {{username}}
//变量过滤器 password_hash
5、ansible-playbook 对错误的处理
默认情况判断 $?,如果 值 不为 0 就停止执行
但某些情况我们需要忽略错误继续执行
如:
我们要关闭 selinux,如果 selinux 已经是关闭的,返
回 1 ,但我们的目的就是关闭,已经关闭不算错误,
这个情况我们就需要忽略错误继续运行,忽略错误有
两种方法:
shell: /usr/bin/somecommand || /bin/true
- name: run some command
shell: /usr/bin/somecommand
ignore_errors: True
完整的例子如下:
---
- hosts: web
remote_user: root
vars:
username: plj
tasks:
- name: create user "{{username}}"
user: group=wheel uid=1010 name={{username}} password={{'123456'|password_hash('sha512')}}
- shell: setenforce 0
ignore_errors: true
- shell: chage -d 0 {{username}}
6、when:某些时候我们可能需要在满足特定的条件后在触发某
一项操作,戒在特定的条件下织止某个行为,这个时候我们就需要迚行条件判断,
when 正是解决这个问题的最佳选择,进程中的系统变量 facts 变量作为
when 的条件,这些 facts 我们可以通过 setup 模块查看
---
- name: Install VIM
hosts: all
tasks:
- name: Install VIM via yum
yum: name=vim-enhanced state=installed
when: ansible_os_family == "RedHat"
- name: Install VIM via apt
apt: name=vim state=installed
when: ansible_os_family == "Debian"
7、register:保存shell命令的执行结果
有时候我们可能还需要更复杂的例子,比如判断前一
个命令的执行结果,根据结果处理后面的操作,这时候我们就需要 register
模块来保存前一个命令的返回状态,在后面进行调用
---
- hosts: web
remote_user: root
vars:
username: plj
tasks:
- shell: id {{username}}
register: result
- name: change "{{username}}" password
user: name={{username}} password={{'12345678'|password_hash('sha512')}}
when: result
---
- hosts: db
remote_user: root
tasks:
- shell: uptime | awk '{printf $(9)}' | cut -b '1-4'
register: result
- service: name=httpd state=stopped
when: result.stdout | float > 0.5
8、with_items 是 playbook 标准循环
为不同用户定义不同组
---
- hosts: db
remote_user: root
tasks:
- user:
name: "{{item.name}}"
groups: "{{item.group}}"
with_items:
- {name: 'nb', group: 'root'}
- {name: 'dd', group: 'root'}
- {name: 'jj', group: 'usetr'}
- {name: 'hh', group: 'usetr'}
9、tags:给指定的任务定义一个调用标识
---
- hosts: web
remote_user: root
vars:
soft: httpd
tasks:
- name: install {{soft}}
yum: name={{soft}}
- name: config httpd.conf
copy: src=/root/playbook/httpd.conf dest=/etc/httpd/conf/httpd.conf
- name: config services
service: enabled=yes state=restarted name={{soft}}
tags: restartweb
10、debug:
ansible-playbook --syntax-check playbook.yaml //语法检测
ansible-playbook -C playbook.yaml //测试运行