安装ansible
yum install epel-release -y
yum install ansible -y
如果被控主机密码不同,则需要做ssh-keygen和ssh-copy-id到被控主机
ansible配置文件
主配置文件说明:
主配置文件ansible.cfg(主配置文件的内容可以参考/etc/ansible/ansible.cfg)
ansible配置文件查找顺序
首先检测ANSIBLE_CONFIG变量定义的配置文件(默认没有这个变量)
其次检查当前目录下的./ansible.cfg文件
再次检查当前用户家目录下~/ansible.cfg文件
最后检查/etc/ansible/ansible.cfg文件
推荐使用默认的/etc/ansible/ansible.cfg文件
默认配置
这里的配置项有很多,这里主要介绍一些常用的
[defaults]
#inventory = /etc/ansible/hosts #被控端的主机列表文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时文件远程主机存放目录
#local_tmp = ~/.ansible/tmp #临时文件本地存放目录
#forks = 5 #默认开启的并发数
#poll_interval = 15 #默认轮询时间间隔(单位秒)
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #是否需要sudo密码
#ask_pass = True #是否需要密码
#transport = smart #传输方式
#remote_port = 22 #默认远程主机的端口号
建议开启修改以下配置参数(取消掉注释即可)
#host_key_checking = False #检查对应服务器的host_key
#log_path=/var/log/ansible.log #开启ansible日志
#inventory = /etc/ansible/hosts
#remote_tmp = ~/.ansible/tmp
#local_tmp = ~/.ansible/tmp
#forks = 300
#ask_sudo_pass = True
#remote_port = 22
取消启用警告
deprecation_warnings = False
提权
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
ansible的hosts文件配置
/etc/ansible/hosts
常用参数配置:
ansible_ssh_host # 目标主机地址
ansible_ssh_port # 目标主机端口,默认22
ansible_ssh_user # 目标主机用户
ansible_ssh_pass # 目标主机ssh密码
ansible_sudo_pass # sudo密码
ansible_sudo_exe
ansible_connection # 与主机的连接类型,比如:local,ssh或者paramiko
ansible_ssh_private_key_file # 私钥地址
ansible_shell_type # 目标系统的shell类型
ansible_python_interpreter # python版本
例1:
[test]
192.168.0.111 #也可以这样写192.168.0.[111:112]
192.168.0.112
[test:vars]
ansible_become=true
ansible_ssh_port=22
ansible_ssh_user="zzy"
ansible_ssh_pass="1qaz@WSX" #需要所有主机的密码是一样的
ansible_sudo_pass="1qaz@WSX"
例2:
[test1]
192.168.0.111
[test2]
192.168.0.112
[group:children] #嵌套组
test1
test2
[group:vars]
ansible_become=true
ansible_ssh_port=22
ansible_ssh_user="zzy"
ansible_ssh_pass="zzyaiziji520"
ansible_sudo_pass="zzyaiziji520"
测试连通性
ansible all -m ping
ansible 192.168.0.111 -m ping #可以指定hosts文件中的其中一台主机
常用命令
ansible all --list-hosts
ansible all -m ping
模块
ansible-doc获取帮助
ansible-doc -l #列出所有模块
ansible-doc -l | grep yum #在所有模块中过滤关键词
ansible-doc yum #查看模块帮助
command模块(默认模块)
ansible all -m command -a 'uptime'
等同于
ansible all -a 'uptime'
shell模块
command和shell模块的区别,command不支持bash的特性,如管道、重定向和&等功能,但是shell模块可以支持。
不可以使用shell模块执行交互命令,如vim、top等。
ansible all -m shell -a "ps aux | wc -l" #进程数量
ansible all -m shell -a "who" #登陆信息
ansible all -m shell -a "touch /tmp/txt.txt" #使用shell模块创建文件会有Warning警告提示,正常!!!
script模块
script模块会把-a后面的脚本拷贝到被管理端主机,然后执行这个脚本,不需要x权限。
ansible all -m script -a "./test.sh"
#-a后面的./test.sh是上面创建脚本的相对路径和文件名
#./是当前目录的意思,在当前目录下有个脚本叫test.sh
幂等性
幂等性:任意次执行所产生的影响均与一次执行的影响相同。
command、shell、script模块缺点:不支持幂等性。
file模块
file模块可以创建文件、目录、链接;修改权限与属性等(ansible-doc file)
ansible all -m file -a "path=/tmp/file.txt state=touch"
#远程所有主机,新建文件,path后面指定要创建的文件或目录的名称
#state=touch是创建文件,state=directory是创建目录
ansible all -m file -a "path=/tmp/mydir state=directory"
#创建目录
ansible all -m file -a "path=/tmp/file.txt owner=sshd group=adm mode=0777"
#修改文件或目录权限(0777中第一个0代表的是无特殊权限,如SUID、SGID等)
ansible all -m file -a "path=/tmp/mydir state=absent"
#state=absent代表删除(删除目录)
ansible all -m file -a "path=/tmp/file.txt state=absent"
# state=absent代表删除(删除文件)
ansible all -m file -a "src=/etc/hosts path=/tmp/host.txt state=link"
#给/etc/hosts文件创建一个链接文件/tmp/host.txt(src指定源文件,path是软链接文件名)
#相当于执行命令 ln -s /etc/hosts /tmp/host.txt
copy模块
copy模块可以将文件拷贝到远程主机 (ansible-doc copy)。
ansible all -m copy -a "src=~/1.txt dest=/root/"
#把管理端本机的a3.txt文件,拷贝到test组中所有主机的/root/目录
#src代表源文件,dest代表目标文件
fetch模块
fetch模块与copy类似,但是作用相反,可以将其他主机的文件拷贝到本地(ansible-doc fetch)。
ansible all -m copy -a "src=~/1.txt dest=/root/"
#把管理端本机的a3.txt文件,拷贝到test组中所有主机的/root/目录
#src代表源文件,dest代表目标文件
lineinfile|replace模块
在修改单个文件的单行内容时可以使用lineinfile模块(ansible-doc lineinfile)。
ansible all -m lineinfile -a "path=/etc/issue line='hello world'"
#在/etc/issue文件中添加一行内容hello world,默认添加到最后,line后面跟的是需要添加的文件内容
ansible all -m lineinfile -a 'path=/etc/selinux/config regexp="^SELINUX=" line="SELINUX=disabled"'
#将/etc/selinux/config文件中的以SELINUX开头的行替换(regexp是启用正则表达式)
lineinfile会替换一整行,replace可以替换关键词(ansible-doc replace)。
ansible all -m replace -a "path=/etc/issue.net regexp=Kernel replace=Ocean"
#将/etc/issue.net文件全文所有的Kernel替换为Ocean
#regexp后面是需要替换的旧内容;replace后面是需要替换的新内容
ansible all -m replace -a 'path=/root/test.txt regexp="^(.+)$" replace="# \1"'
#将/root/test.txt文件中所有行加注释
user模块
user模块可以实现Linux系统账户管理(ansible-doc user)。
ansible all -m user -a "name=tom"
#远程所有主机并创建系统账户tom,默认state的值为present,代表创建用户
ansible all -m user -a "name=jerry uid=1010 group=adm groups=daemon,root home=/home/jerry"
#创建账户并设置对应的账户属性,uid指定用户ID号,group指定用户属于哪个基本组
#groups指定用户属于哪些附加组,home指定用户的家目录
ansible all -m user -a "name=tom password={{'abc'| password_hash('sha512')}}"
#修改账户密码,用户名是tom,密码是abc,密码经过sha512加密
ansible all -m user -a "name=tom state=absent"
#删除账户tom,state=absent代表删除账户的意思,name指定要删除的用户名是什么
#账户的家目录不会被删除,相当于执行userdel tom
ansible all -m user -a "name=jerry state=absent remove=true"
#删除jerry账户同时删除家目录、邮箱,相当于执行userdel -r jerry
yum_repository模块
使用yum_repository可以创建或修改yum源配置文件(ansible-doc yum_repository)。
ansible test -m yum_repository -a "file=myyum name=myyum description=hello baseurl=ftp://192.168.4.254/centos gpgcheck=no"
#新建一个yum源配置文件/etc/yum.repos.d/myyum.repo
#yum源文件名为myyum,该文件的内容如下:
[myyum]
baseurl = ftp://192.168.4.254/centos
gpgcheck = 0
name = hello
ansible test -m yum_repository -a "file=myyum name=myyum description=test baseurl=ftp://192.168.4.254/centos gpgcheck=yes gpgkey=…"
#修改yum源文件内容
ansible test -m yum_repository -a "file=myyum name=myyum state=absent"
#删除yum源文件myyum
yum模块
使用yum模块可以安装、卸载、升级软件包(ansible-doc yum),state: present(安装)|absent(卸载)|latest(升级)。
ansible test -m yum -a "name=unzip state=present"
#安装unzip软件包,state默认为present,也可以不写
## 验证:到被控主机执行命令rpm -q unzip查看是否有该软件
ansible test -m yum -a "name=unzip,httpd state=present"
#可以同时装多个软件
ansible test -m yum -a "name=unzip state=latest"
#升级unzip软件包,软件名称可以是*,代表升级所有软件包
ansible test -m yum -a "name=unzip state=absent"
#调用yum模块,卸载unzip软件包,state=absent代表卸载软件
service模块
service为服务管理模块(启动、关闭、重启服务等),
state:started|stopped|restarted,
enabled:yes设置开机启动。
ansible test -m yum -a "name=httpd"
#调用yum模块,安装httpd软件包
ansible test -m service -a "name=httpd state=started"
#调用service模块,启动httpd服务
ansible test -m service -a "name=httpd state=stopped"
#调用service模块,关闭httpd服务
ansible test -m service -a "name=httpd state=restarted"
#调用service模块,重启httpd服务
ansible test -m service -a "name=httpd enabled=yes"
#调用service模块,设置httpd服务开机自启
parted模块
用于磁盘分区
ansible test -m parted -a "device=/dev/sdb number=1 state=present part_start=1MiB part_end=3GiB"
#为/dev/sdb创建编号为1的分区(第一个分区),part_start为分区开始的位置,part_end为结束的位置
ansible test -m parted -a "device=/dev/sdb number=1 state=absent"
#删除分区
逻辑卷相关模块(lvg、lvol)
提示:做实验之前需要给对应的虚拟机添加额外磁盘,并创建磁盘2个分区
提示:可以使用前面学习过的parted或fdisk命令给磁盘创建分区
提示:这里的磁盘名称仅供参考,不要照抄!!!
lvg模块:创建、删除卷组(VG),修改卷组大小,
state:present(创建)|absent(删除)。
ansible test -m yum -a "name=lvm2"
#安装lvm2软件包,安装了lvm2软件后,才有pvcreate、vgcreate、lvcreate等命令
ansible test -m lvg -a "vg=myvg pvs=/dev/vdb1"
#创建名称为myvg的卷组,该卷组由/dev/vdb1组成
#注意:这里的磁盘名称要根据实际情况填写
ansible test -m lvg -a "vg=myvg pvs=/dev/vdb1,/dev/vdb2"
#修改卷组大小,往卷组中添加一个设备/dev/vdb2
lvol模块:创建、删除逻辑卷(LV),修改逻辑卷大小,
state:present(创建)|absent(删除)。
ansible test -m lvol -a "lv=mylv vg=myvg size=2G"
#使用myvg这个卷组创建一个名称为mylv的逻辑卷,大小为2G
## 验证:到被控主机执行命令lvs查看是否有对应的LV逻辑卷
ansible test -m lvol -a "lv=mylv vg=myvg size=4G"
#修改LV逻辑卷大小
ansible test -m lvol -a "lv=mylv vg=myvg state=absent force=yes"
#删除逻辑卷,force=yes是强制删除
ansible test -m lvg -a "vg=myvg state=absent"
#删除卷组myvg
filesystem
格式化逻辑卷
ansible test -m filesystem -a "fstype=xfs dev=/dev/myvg/mylv"
mount模块
挂载和卸载,并写进fstab文件中,完成开机自动挂载(present|mounted|unmounted|absent)
ansible test -m mount -a "src=/dev/mapper/myvg-mylv path=/mnt fstype=xfs state=mounted"
#挂载并写进fstab文件中
ansible test -m mount -a "src=/dev/mapper/myvg-mylv path=/mnt fstype=xfs state=present"
#将mount写进fstab文件中,不挂载
ansible test -m mount -a "src=/dev/mapper/myvg-mylv path=/mnt fstype=xfs state=unmounted"
#卸载,不删除fstab文件中的mount信息
ansible test -m mount -a "src=/dev/mapper/myvg-mylv path=/mnt fstype=xfs state=absent"
#卸载并删除fstab文件中的mount信息,如果mount点非空会报错,但实际上已经卸载
Playbook
Ansible ad-hoc可以通过命令行形式远程管理其他主机,适合执行一些临时性简单任务。另外还有一种远程管理的方式叫Playbook,Ansible Playbook中文名称叫剧本,它将经常需要执行的任务写入一个文件,这个文件就叫剧本。
编写yaml文件之前的设置(可选)
默认一个tab键是8个空格,不方便,可以修改
- 按tab键跳2个空格
- 自动缩进
- 将tab转换为空格
cat > ~/.vimrc <<EOF
set ai
set ts=2
set et
EOF
编写第一个Playbook(剧本)
hosts、tasks、name是关键词(不可修改),ping是模块,调用不同模块完成不同任务。
vim /etc/ansible/test.yaml
---
- hosts: all #hosts定义要远程谁?
tasks: #tasks定义远程后要执行的任务有哪些?
- name: This is my first playbook #name后面的具体内容可以任意
ping:
运行playbook:
ansible-playbook /etc/ansible/test.yml
例2:
在test组中创建/tmp/demo目录,权限755,将本机的/etc/hosts拷贝到目标主机的/tmp/demo中
- name: create dir and copy file
hosts: test
tasks:
- name: create
file: path=/tmp/demo state=directory mode=0755
- name: copy
copy: src=/etc/hosts dest=/tmp/demo/
例3:
在test组中安装lamp,并启动服务
- name: deploy lamp
hosts: test
tasks:
- name: install lamp
yum: name=httpd,mariadb,mariadb-server,mariadb-devel,php,php-mysql
- name: start httpd
service: name=httpd state=started enabled=yes
- name: start mariadb
service: name=mariadb state=started enabled=yes
例4:
创建用户tom
- name: add user
hosts: test
tasks:
- name: add user tom
user: name=tom password={{ '123' | password_hash('sha512') }}
例5:
给/dev/sdb磁盘分一个2G的分区sdb1,做成卷组,创建逻辑卷,格式化并挂载到/mnt下
- name: create lvm
hosts: test
tasks:
- name: parted
parted: device=/dev/sdb number=1 state=present part_start=1MiB part_end=2GiB
- name: create vg
lvg: vg=myvg pvs=/dev/sdb1
- name: create lvm
lvol: vg=myvg lv=mylv size=1.99G
- name: filesystem
filesystem: fstype=xfs dev=/dev/myvg/mylv
- name: mount
mount: src=/dev/mapper/myvg-mylv path=/mnt fstype=xfs state=mounted