主要作用
安装
配置的修改
启动
执行操作
-
AD-Hoc 单条执行(python的一个模块)
在shell中执行的命令 在AD-hoc中叫做模块,如:yum,copy -
playbook 多条AD-Hoc的集合yaml文件
执行优先级(重要)
ansible 的执行需要一个ansible.cfg的配置文件,
优先读取当前目录的ansible.cfg, 最后读取/etc/ansible/ansible.cfg(定义调用的其他文件),/etc/ansible/hosts(定义要控制的主机组和主机)。
如何关闭ssh远程连接的确认选择
ansible AD-Hoc的使用
ansible 主机组名称(或单个主机的ip或域名) -m 模块 -a '命令'
all 指所有组
" * " 是指通配符,代表任意字符
:& 并且 A:&B 在A并且在B的主机
: 或 A:B 在A或者在B的主机
:! 取反 A:!B 在A不在B的主机
ansible-doc -l 查看所有的模块
ansible-doc copy 查看模块的详细文档(使用方法)
ansible-doc -s copy 查看模块的所有方法
命令执行的颜色代表
黄色代表 改变
绿色代表 未改变
红色代表 异常
模块
1. shell
‘chdir =/tmp’ 切换到 指定主机的/tmp目录。
creates 如果文件存在则跳过
removes 如果文件存在则执行
2. yum
name=httpd state=present (安装)
name=httpd state=absent(卸载)
name=httpd state=latest (更新)
name=*(所有) state=latest exclude(排除)= kernel
升级所有软件,排除kernel
name=httpd state=present enablerepo=epel(仓库名称)
指定从哪个仓库安装
3. copy和template
copy不支持解析变量,template支持解析变量
ansible webservers -m copy -a "src=.httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644 backup=yes"
ansible操控webservers组下面的主机,执行拷贝命令,将当前目录的文件拷贝至组中所有主机的指定目录,并设置属主和属组,权限是644
src = 源地址
dest = 目标地址
backup=备份,只有在文件内容发生变动时,才会产生备份。
content 向文件内添加内容
4. file
ansible webservers -m file -a ‘path=/etc/test state=directory mode=777’
在该组中的所有主机的etc下创建一个test,且权限是777的目录。
state=directory 创建目录
state=touch 创建文件
state=link 创建连接
recurse=yes 递归授权
同时可以指定属主和属组
5. lineinfire
修改或删除文件内容
修改
ansible 主机组(或单个主机的ip或域名)-m 模块 -a “path(执行的文件路径) regexp(正则匹配,匹配的字符尽量写多)=’^abc’ line=123”
^ 是指以什么什么开头
$ 是指以什么什么结尾
删除
先匹配 再执行删除 state=absent
插入
InsertAfter=‘匹配内容’
InsertAfter 将匹配到内容修改后插入到 匹配的行 后面
inserbefore 插入到匹配行前面
6. systemd
管理服务的启动和停止
ansible web -m systemd -a ‘name=httpd state=started(用过去式写法)’
enabled=yes (设置开机自启,)
7. group
管理 组的创建,设定组id
group -a ‘name=www gid=666’ 创建组
group -a ‘name=www state=absent’ 删除组
8.user
管理用户的创建,设定 uid
user -a ‘name=www uid=666 group=www’
创建用户,设定uid,用户所在组
user -a ‘name=www remove=yes state=absent’
移除用户
用户管理神器,openldap
9. cron
注意。job=‘命令’ 执行的命令要用单引号引起来
设置定时任务
cron -a 'name=(任务描述) minute=1 hour=1 day=1 month=1 weekday=1 job='ls(执行的命令) > /dev/null' '
删除定时任务
cron -a ’name=123 state=absent‘
使定时任务失效(不删除)
cron -a 'name=(任务描述) minute=1 hour=1 day=1 month=1 weekday=1 job='ls(执行的命令) > /dev/null' disable=yes '
10. mount
ansible webservers -m mount -a "src=172.16.1.61:/ops path=/opt fstype=nfs opts=defaults state=mounted"
将172.16.1.61主机根目录下的ops挂载到本机的opt,类型是nfs,挂载的参数是默认,mounted永久挂载
state=unmount 临时取消挂载
state=absent 永久取消挂载
11. hostname
修改主机名称,一般用不到
hostname -a ‘name=abcdefg’
12. archive
打包与压缩
archive -a 'path=/root/123 dest=/opt/123.tar.gz(命名) format=gz ’
将root下面的123目录以gz的方式打包并存储在opt下面
13. unarchive
解压
unarchive -a ‘path=/root/123.zip dest=/opt/’
remote_src=yes 需要解压的包在被控端,
通过ansible解压被控端的压缩包
remote_src=no(默认) 需要解压的包在控制端
解压本机的压缩包
14. selinux
控制防火墙
selinux -a “state=enforcing” 开启
selinux -a “state=disabled” 关闭
ansible 操作步骤
检查语法
ansible-playbook 123.yml --syntax-check
模拟运行
ansible-playbook 123.yml -C
项目运行必须包含ansible.cfg,和主机清单(主机清单的文件可以在ansible中自定义)
添加需要控制的主机 定义主机组和主机
/etc/ansible/hosts
[web] 主机名
172.16.1.7
172.16.1.8
# ip 或者 域名 都可以
w01.oldxu.com
w02.oldxu.com
创建一个yml的文件
==copy模块中要拷贝的文件一定要和目标文件属性一致,执行权限和属主属组 ==
- hosts: (主机组名)
tasks:(任务)
- name:(任务的描述信息)
yum:(模块)
name:(通过模块管理的程序名称)
state:(设定通过模块进行的操作)
notify:当文件发生变动时先执行剩下的命令,最后执行 notify指定的任务名称下的任务。
notify 和 handlers 是相辅相成的。
handlers:
yml文件编写总结1(固定写死,比较死板)
- 安装 yum
- 修改配置文件并增加notify copy
- 启动并设置开机自启 systemd
- 设置handlers和notify衔接
- 执行ansible-playbook + yml 文件
- hosts: web
tasks:
- name: install nginx
yum:
name : nginx
state: present
- name: 配置文件修改覆盖
copy:
copy不支持解析变量,template支持解析变量
src:
dest:/etc/nginx/nginx.conf
owner:'root'
group:'root'
mode:'0644'
backup:yes
notify: 系统控制 重启
- name:系统控制
systemd:
name: nginx
state: started
enabled: yes
handlers:
- name:系统控制 重启
systemd:
name: nginx
state: restarted
facts
用来自动采集被控端的状态信息
查看本机的状态信息
ansible localhost -m setup
关闭facts采集,在yml的主机组下面 写入gather_facts: no 关闭采集。
测试yml编写:
- hosts: all
#gather_facts: no
tasks:
- name: sleep 10
command: sleep 10
开启采集会变得很卡,导致运行缓慢,但是有时又不得不开启,所以可以设置redis缓存facts加速执行
如何设置redis缓存fact
- 下载安装
yum install python2-redis
pip install --upgrade pip
pip install redis
- 在 ansible.cfg的文件中写入
gathering = smart #在使用 facts 缓存时设置为smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 172.16.1.51:6379(redis的ip和端口)
3.测试
yml文件编写总结2(灵活,已变量的方式编写)
变量设定
变量设定 获取被控端的ip地址
{{ ansible_eth1.ipv4.address }} eth1 是网卡名称
when和loop
-
when: (ansible_distribution == “CentOS”)
通过facts变量获取被控端信息,当系统为CentOS的时候才执行when: (ansible_hostname is match(“web*”)
只有主机名为web开头的才执行
也可以用and 和 or ,来进行匹配changed_when: 检测任务执行的结果
register(把执行的结果注册到一个变量中),
- name: check web configure
shell:
cmd: /usr/sbin/nginx -t
register: check_nginx 将结果打入一个变量中
changed_when: 检查变量
- check_nginx.stdout.find('successful')
- 如果结果中存在successful则继续,不存在则终止
- false
- loop:
name: {{ “item” }}
loop
tags和include
一个playbook 中有多个任务,如果执行就需要一次性全部执行,可以给任务 贴个标签,通过 --t 指定标签,单独运行单个任务 通常用来排错,
–skip-tags 运行除指定的tags以外的所有tags
打单个标签,运行单个任务
打多个相同标签,同时运行相同标签的 任务
include
将任务特意写一个yml文件
然后通过 include调用
给这个 include打一个标签。 通过调用命令,单独执行。
playbook异常处理 ignore_errors
ignore_errors: yes 是否忽略异常,写在单个任务的最后
任务执行失败强制调用handlers
force_handlers: yes #强制调用handlers 写在 hosts下面。
Jinja2
for 循环
proxy设置自动加载主机
{% for i in groups['web'] %}
server {{i}};80
{% endfor %}
if判断
global_defs {
router_id {{ ansible_fqdn }}
}
vrrp_instance VI_1 {
{% if ansible_fqdn == 'web_1' %}
state MASTER
priority 150
{% elif ansible_fqdn == 'web_2' %}
state Backup
priority 100
{% endif %}