ansible
关于
Ansible 是一个 IT 自动化工具。它可以配置系统、部署软件并协调更高级的 IT 任务,例如持续部署或零停机时间滚动更新
配置ansible管理环境:
创建ansible工作目录,并进入,目录名自己定义,不是固定的。
创建配置文件。默认的配置文件是/etc/ansible/ansible.cfg,但是一般不使用它,而是在工作目录下创建自己的配置文件
1
2
3
4
5
6
7
8
9vim ansible.cfg
[defaults]
inventory = hosts # 管理的主机,配置在当前目录的hosts文件中,hosts名是自定义的。=号两边空格可有可无。
forks = 100 #并发数
host_key_checking = False #是否检查host_key
log_path = /var/log/ansible.log #log路径创建主机清单文件。写在[]里的是组名,[]下面的是组内的主机名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[test]
node1
[proxy]
node2
[webservers]
node[3:4] # node3和node4的简化写法,表示从3到4
[database]
node5
# cluster是组名,自定义的;:children是固定写法,表示下面的组名是cluster的子组。
[cluster:children]
webservers
databaseansible all –list-hosts # 查看主机。注意,一定在工作目录下执行命令。
ansible webservers –list-hosts # 查看webservers组中所有的主机
临时命令语法:#ansible 主机或组列表 -m 模块 -a “参数” # -a是可选的
分发脚本:
ansible all -m copy -a “src=/tmp/test.sh dest=/tmp/test.sh mode=0755”
执行脚本
ansible all -m shell -a “ sh /root/test.sh”
切换root执行命令:
ansible all -a “ command “ -S -R root
ping:
ansible all -m ping
grep UNREACHABLE -n /var/log/ansible.log
修改关掉dhcp
ansible all -m shell -a “ sed -i ‘s/dhcp/none/g’ /etc/sysconfig/network-scripts/ifcfg-e* “
ansible常用模块
1 | ansible-doc -l | grep yum # 查看与yum相关的模块 |
command 执行命令的模块
shell 执行命令的模块
script 远程执行脚本的模块
file 改文件目录链接权限属性等的模块
copy 上传模块
fetch 下载模块
lineinfile 替换某一行的模块
replace 替换关键词模块
user 用户管理模块
group 组管理模块
yum_repository 配置yum模块
yum 用于rpm软件包管理,如安装、升级、卸载的模块
service 用于控制服务模块
lvg 创建、删除卷组,修改卷组大小的模块
lvol 创建、删除逻辑卷,修改逻辑卷大小的模块
filesystem 用于格式化,也就是创建文件系统的模块
mount 用于挂载文件系统的模块
firewalld 配置防火墙模块
template 可以上传具有特定格式的文件(包含变量可自动转换)的模块
Playbook剧本
1 | # 文件位置和名字是固定的,用于设置vim的格式 |
执行剧本:# ansible-playbook *.yml
剧本例子
1
2
3
4
5
6
7
8
9
10
11---
- name: install pkgs
hosts: test
tasks:
- name: install web pkgs
yum:
name:
- httpd
- php
- php-mysqlnd
state: present1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18---
- name: block tasks
hosts: test
tasks:
- name: define a group of tasks
block: # 任务块可多个任务组合在一起
- name: install httpd # 通过yum安装httpd
yum:
name: httpd
state: present
- name: start httpd # 通过service启动httpd服务
service:
name: httpd
state: started
enabled: yes
when: ansible_distribution=="RedHat" # 条件为真才会执行上面的任务1
2
3
4
5
6
7
8
9
10
11---
- name: create users
hosts: test
tasks:
- name: create multiple users
user:
name: "{{item.uname}}"
password: "{{item.upass|password_hash('sha512')}}"
loop:
- {"uname": "zhangsan", "upass": "123"}
- {"uname": "lisi", "upass": "456"}
任务失败继续执行: ignore_errors: yes
when条件: 只有满足某一条件时,才执行当前模块任务
handlers触发任务: 通过notify通知,如果任务执行成功并changed状态,则执行触发任务,否则不执行
rescue和always:
- block和rescue、always联合使用:
- block中的任务都成功,rescue中的任务不执行
- block中的任务出现失败(failed),rescue中的任务执行
- block中的任务不管怎么样,always中的任务总是执行
loop循环: loop: [aaa,bbb,ccc,ddd,eee]
ansible变量
facts事实变量:# ansible test -m setup # 通过setup查看所有facts变量
- 常用facts事实变量
- ansible_all_ipv4_addresses:所有的IPV4地址
- ansible_bios_version:BIOS版本信息
- ansible_memtotal_mb:总内存大小
- ansible_hostname:主机名
1
2
3
4
5
6
7
8
9# 显示远程主机的主机名和内存大小。在ansible中,变量使用{{}}表示
# debug模块用于输出信息,常用的参数是msg,用于输出指定内容
---
- name: display host info
hosts: test
tasks:
- name: display hostname and memory
debug: # debug是模块,它的选项msg可以输出指定信息
msg: "hostname: {{ansible_hostname}}; mem: {{ansible_memtotal_mb}} MB"- 常用facts事实变量
自定义变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 在playbook中定义变量
# 在test组中的主机上创建用户jack,他的密码是123456
---
- name: create user
hosts: test
vars: # 固定格式,用于声明变量
username: "jack" # 此处引号可有可无
mima: "123456" # 此处引号是需要的,表示数字字符
tasks:
- name: create some users
user:
name: "{{username}}" # {}出现在开头,必须有引号
state: present
password: "{{mima|password_hash('sha512')}}"
# 也可将变量定义在文件中,vars_files用于声明变量文件后使用变量
role角色
1 | # 使用常规playbook,修改/etc/motd的内容 |
返回结果颜色
绿色:执行成功
黄色:执行成功并且对目标主机做过修改
红色:执行失败
紫色:提示警告
附录
官方手册:
https://docs.ansible.com/ansible/2.9/installation_guide/intro_configuration.html