Ansible配置文件
1. 使用默认的配置文件/etc/ansible/ansible.cfg
2. 将ansible.cfg复制到当前运行ansible的目录使用
Ansible的Invertory 主机清单
第一种方法: IP+端口+用户+密码
10.0.0.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
第二种方法: 单机定义方式 掌握
10.0.0.7
10.0.0.8
第三种方法: 组定义方式 掌握
[webservers]
10.0.0.7
10.0.0.8
第四种方法: 定义多个组为一个组
[lnmp:children]
webservers
dbservers
查看主机清单所有的客户端: 常用方式
[root@m01 ~]# ansible all --list-host
hosts (1):
10.0.0.7
指定客户端主机方法:
ansible all # 表示管理所有客户端
ansible 10.0.0.7 # 表示管理WEB01
ansible webservers # 表示管理这个组内所有的客户端
跳过指纹验证:
[root@m01 ~]# grep check /etc/ansible/ansible.cfg
# uncomment this to disable SSH key host checking
host_key_checking = False
# host key checking setting above.
对单台进行操作:
[root@m01 ~]# ansible 10.0.0.7 -m ping
对组进行操作:
[root@m01 ~]# ansible webservers -m ping
第一步: 定义主机清单
1)做底层的ssh免密钥
2)将客户端写入/etc/ansible/hosts
[root@m01 ~]# cat /etc/ansible/hosts
10.0.0.7
10.0.0.8
[webservers]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
3)测试与客户端的连接性
ansible 10.0.0.7 -m ping
ansible servers -m ping
ansible all -m ping
ssh密钥一键分发,可以使用
ansible all -m authorized_key -a "user=root exclusive=true manage_dir=true key='$(< /root/.ssh/id_rsa.pub)'" -k
通过-i参数指定invertory主机清单(默认读取的/etc/ansible/hosts) 名称可以随意
[root@m01 ~]# ansible all -m ping -i test.txt
10.0.0.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Ansible的第一个模块:
command模块 不支持管道
语法结构: 用来执行shell命令 但是不建议使用命令模块
ansible 主机/组 -m command -a '具体执行的命令'
查看WEB02磁盘使用情况
[root@m01 ~]# ansible web01 -m command -a 'df -h'
web01 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
devtmpfs 513M 0 513M 0% /dev
tmpfs 524M 0 524M 0% /dev/shm
tmpfs 524M 8.1M 516M 2% /run
tmpfs 524M 0 524M 0% /sys/fs/cgroup
/dev/sda3 18G 1.9G 16G 11% /
/dev/sda1 197M 110M 88M 56% /boot
tmpfs 105M 0 105M 0% /run/user/0
Ansible的第二个模块:
shell模块 具体执行shell脚本
[root@m01 ~]# ansible web01 -m shell -a 'ip add|grep eth0'
web01 | CHANGED | rc=0 >>
2: eth0:
inet 10.0.0.7/24 brd 10.0.0.255 scope global eth0
第三个模块:
scripts # 执行shell脚本 脚本需要在Ansible主机端
第四个模块:
yum_repository # 配置yum仓库
[root@m01 ~]# ansible web01 -m yum_repository -a 'name=CentOS-Base description=base baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/ enabled=yes'
name: 指定仓库的名称
description: 描述仓库的信息 随意
baseurl: 仓库的url地址
enabled: yes为开启这个仓库 no为关闭这个仓库
执行成功后: 显示如下
[root@web01 ~]# cat /etc/yum.repos.d/CentOS-Base.repo
[CentOS-Base]
baseurl = http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
enabled = 1 # 1为开启仓库 0为关闭仓库
name = base
第五个模块:
yum 安装服务或者软件
[root@m01 ~]# ansible web01 -m yum -a 'name=lrzsz state=present'
name: 软件的名称或者服务的名称
state: 状态
present 表示安装软件 安装默认的版本
absent 表示卸载软件
latest 表示安装最新的版本
第六个模块:
copy
- name: Copy file with owner and permissions
copy: # 模块名称
src: /srv/myfiles/foo.conf # 源文件
dest: /etc/foo.conf # 放在客户端的哪个位置
owner: foo # 属主
group: foo # 属组
mode: '0644' # 权限
backup: yes # 如果客户端存在该文件是否先备份 然后在拷贝(文件中必须存在内容)
案例: 复制当前的test.txt 到目标主机的/root目录下
[root@m01 ~]#
[root@m01 ~]# ansible lnmp -m copy -a 'src=test.txt dest=/root/test.txt owner=root group=root mode=0600'
案例1: 将content中的字符串写入到目标主机的test.txt文件中
copy:
content: '# This file was moved to /etc/other.conf'
dest: /etc/mine.conf
[root@m01 ~]# ansible lnmp -m copy -a 'content="web01..." dest=/root/test.txt'
案例2: 拷贝目录需要有内容
mkdir oldboy
touch oldboy/test.txt
[root@m01 ~]# ansible lnmp -m copy -a 'src=./oldboy dest=/opt/'
copy模块:
src: 源文件/目录(目录下有文件)
dest: 目标的路径
mode: 权限
owner: 属主
group: 属组
backup: 复制过去 如果目标已存在是否备份
不使用src使用content将内容直接写入到目标主机文件
copy:
content: 'web01...........'
dest: /root/test.txt
第七个模块:
file # 建立目录或文件
- name: Change file ownership, group and permissions
file:
path: /etc/foo.conf # 文件路径
owner: foo # 属主
group: foo # 属组
mode: '0644' # 权限
state: touch # 创建普通文件
state: directory # 创建目录
案例: 创建普通文件oldboy.txt 属主apache 属组Apache
[root@m01 ~]# ansible web01 -m file -a 'path=/root/oldboy.txt state=touch owner=apache group=apache'
案例2: 创建目录 test1 属主root 属组apache权限 777
[root@m01 ~]# ansible web01 -m file -a 'path=/root/test1 state=directory owner=root group=apache mode=777'
案例3: 递归创建目录
[root@m01 ~]# ansible web01 -m file -a 'path=/root/test1/test2/test3 state=directory owner=root group=apache mode=777'
案例4: 复制test目录到目标主机的oldboy目录下 如果oldboy目录不存在 则自动创建
[root@m01 ~]# ansible web01 -m copy -a 'src=./test dest=/root/oldboy'
web01 | CHANGED => {
"changed": true,
"dest": "/root/oldboy/",
"src": "/root/./test"
}
删除文件和目录
absent: 删除文件或目录
案例1: 递归删除目录
[root@m01 ~]# ansible web01 -m file -a 'path=/root/oldboy state=absent'
案例2: 删除文件
[root@m01 ~]# ansible web01 -m file -a 'path=/root/test.txt state=absent'
第八个模块:
systemd # 启动与停止服务
systemd:
state: started
stopped
restarted
reloaded
name: httpd
enabled: yes
案例1: 启动服务 加入开机自动运行
[root@m01 ~]# ansible web01 -m systemd -a 'name=httpd state=started enabled=yes'
案例2: 关闭服务禁止开机自动运行
[root@m01 ~]# ansible web01 -m systemd -a 'name=httpd state=stopped enabled=no'
第九个模块:
group
user
mount # 挂载设备
cron # 定时任务
get_url # 下载软件
firewalld # 防火墙
selinux # selinux
小结:
1.Ansible /etc/ansible/ansible.cfg # 默认的配置文件
2.跳过指纹验证
host_key_checking = False
3.定义主机清单
[root@m01 ~]# cat /etc/ansible/hosts
10.0.0.7 # 单个主机
10.0.0.8
[webservers] # 定义组
web01 ansible_ssh_host=10.0.0.7 # 以别名的方式定义
[dbservers]
web02 ansible_ssh_host=10.0.0.8
[lnmp:children] # 定义多个组都属于lnmp组
webservers
dbservers
4.调用主机
ansible 10.0.0.7 -m ping 单个主机
ansible webservers -m ping 调用组
ansible all 调用所有的主机
查看主机清单所有的主机
ansible all --list-host
5.Ad-hoc
模块: command shell script yum_repository
yum_repository
yum
安装服务:
ansible web01 -m yum -a 'name=lrzsz state=present'
卸载服务:
ansible web01 -m yum -a 'name=lrzsz state=absent'
copy
复制文件
ansible web01 -m copy -a 'src=test.txt dest=/root/test.txt owner=www group=www mode=0600'
复制目录 目录下必须有内容 复制oldboy目录到目标主机的/root目录下
ansible web01 -m copy -a 'src=./oldboy dest=/root/'
将内容直接写入到目标文件中
ansible web01 -m copy -a 'content="web....." dest=/root/oldboy.txt'
file
创建文件
ansible web01 -m file -a 'path=/root/test.txt state=touch owner=www group=www mode=0644'
创建目录
ansible web01 -m file -a 'path=/root/oldboy state=diretory owner=www group=www mode=0755'
删除文件/目录
ansible web01 -m file -a 'path=/root/oldboy state=absent owner=www group=www mode=0755'
systemd
启动
ansible web01 -m systemd -a 'name=nginx state=started eanbled=yes'
停止
ansible web01 -m systemd -a 'name=nginx state=stopped'
重启
ansible web01 -m systemd -a 'name=nginx state=restarted'
加载
ansible web01 -m systemd -a 'name=nginx state=reloaded'
开机自启
ansible web01 -m systemd -a 'name=nginx state=started enbled=yes'