ansible完整使用
本地环境:
serverhost1:192.168.90.241
serverhost2:192.168.90.242
serverhost3:192.168.90.223
serverhost4:192.168.90.224
一、下载安装
dnf install ansible
这里下载的2.9事目前最新的版本,一些python的关联包也下载
完成后我们检查下使用正常吧
可以看出依赖的环境是python3.6
二、配置文件详解
两个核心文件:ansible.cfg和hosts文件,默认都存放在/etc/ansible目录下。
ansible.cfg:主要设置一些ansible初始化的信息,比如日志存放路径、模块、插件等配置信息
hosts:机器清单,进行分组管理
ansible.cfg配置,默认的配置文件都是注释的需要使用的去掉注释即可
[defaults] #通用默认配置
inventory = /etc/ansible/hosts #被控制端IP或者DNS列表
library = /usr/share/my_modules/ ##默认搜寻模块的位置
remote_tmp = ~/.ansible/tmp #远程执行临时文件
local_tmp = ~/.ansible/tmp
plugin_filters_cfg = /etc/ansible/plugin_filters.yml
forks = 5 ##并行线程数
poll_interval = 15 ##回频率或轮询间隔时间
sudo_user = root ##sudo远程执行用户名
ask_sudo_pass = True ##使用sudo,是否需要输入密码
ask_pass = True ##是否需要输入密码
transport = smart ##通信机制
remote_port = 22 ##远程SSH端口
module_lang = C ##模块和系统之间通信的语言
module_set_locale = False
gathering = implicit ##控制默认facts收集(远程系统变量)
gather_subset = all
gather_timeout = 10
roles_path = /etc/ansible/roles ##使用playbook搜索Ansible roles
host_key_checking = False ##是否检查远程主机密钥
sudo_exe = sudo ##sudo远程执行命令
sudo_flags = -H -S -n ##传递sudo之外的参数
timeout = 10 ##SSH超时时间
remote_user = root ##远程登录用户名
log_path = /var/log/ansible.log ##日志文件存放路径
module_name = command ##Ansible命令默认执行的模块
executable = /bin/sh ##执行的shell环境,用户shell模块
hash_behaviour = replace ##特定的优先级覆盖变量
jinja2_extensions = jinja2.ext.do,jinja2.ext.i18 ##允许开启jinja2扩展模块
private_key_file = /path/to/file ##私钥文件存储位置
display_skipped_hosts = True ##显示跳过任何任务的状态
system_warnings = True ##禁用系统运行Ansible潜在问题警告
deprecation_warnings = True ##PlayBook输出禁用“不建议使用”警告
command_warnings = False ##command模块Ansible默认发出警告
nocolor = 1 ##输出带上颜色区别,0表示开启,1表示关闭
pipelining = False ##开启pipe SSH通道优化
[accelerate] ##accelerate缓存加速
accelerate_port = 5099 ##加速连接端口5099
accelerate_timeout = 30 ##命令执行超过时间,单位为s
accelerate_connect_timeout = 5.0 ##上一个活动连接的时间,单位为min
accelerate_daemon_timeout = 30 ##允许多个私钥被加载到daemon
accelerate_multi_key = yes ##任何客户端想要连接daemon都要开启这个选项
hosts配置
baidu.com
192.168.100.1
192.168.100.1
[webservers]
baidu.com
192.168.100.1
192.168.100.2
可直接写dns解析和ip也可以分组去匹配
三、ansible常用模块命令使用
参数详解
-m:要执行的模块,默认为command
-a:模块的参数
-u:ssh连接的用户名,默认用root,ansible.cfg中可以配置
-k:提示输入ssh登录密码,当使用密码验证的时候用
-s:sudo运行
-U:sudo到哪个用户,默认为root
-K:提示输入sudo密码,当不是NOPASSWD模式时使用
-C:只是测试一下会改变什么内容,不会真正去执行
-c:连接类型(default=smart)
-f:fork多少进程并发处理,默认为5个
-i:指定hosts文件路径,默认default=/etc/ansible/hosts
-I:指定pattern,对已匹配的主机中再过滤一次
--list-host:只打印有哪些主机会执行这个命令,不会实际执行
-M:要执行的模块路径,默认为/usr/share/ansible
-o:压缩输出,摘要输出
--private-key:私钥路径
-T:ssh连接超时时间,默认是10秒
-t:日志输出到该目录,日志文件名以主机命名
-v:显示详细日志
通过ssh密码远程执行ping在所有hosts文件匹配的
以下的命令测试都是通过密码远程的如果配置sshkey认证就不需要-k输入密码了
列出hosts中的主机
ansible all -a "ls" --list-hosts
1.setup模块
查询远程主机所有信息
ansible all -m setup -k
2.ping模块
ansible '*' -m ping -k
3.command 模块
通过通配符对主机执行命令
ansible '192.168.90.*' -m command -a 'uptime' -k
4.shell 模块
查询远程主机磁盘空间
ansible all -m shell -a "df -h |grep / | awk NR==5{'print $2'}" -k
用shell执行而不用command,就是因为command不支持变量、重定向、管道符等操作
5.group user 模块
批量创建组和用户
ansible all -m group -a 'gid=2017 name=aaa' -k
ansible all -m user -a 'name=aaa groups=aaa state=present' -k
6.file 模块
远程修改文件归属和权限
ansible '*' -m file -a "dest=/tmp/test.sh mode=755 owner=aaa group=aaa" -k
远程做文件的软链接和删除软链接
ansible '*' -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link" -k
ansible '*' -m file -a "path=/tmp/resolv.conf state=absent" -k
7.copy 模块
拷贝文件到远程服务器并指定用户组和读写执行权限
ansible '*' -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644"
拷贝脚本文件并远程执行脚本
ansible '*' -m copy -a "src=/root/test.sh dest=/tmp/test.sh owner=root group=root mode=0755" -k
ansible '*' -m script -a '/bin/sh /tmp/test.sh' -k
这次执行脚本的时候报错了
发现问题是少了libtinfo.so.6这个链文件
刚好报错的这台服务器是7.7版本的(其他是8.0)
在其他服务器拷贝文件/usr/lib64/libtinfo.so.6
到报错的服务器
再次执行时正常了
8.cron 模块
远程写入和删除计划任务需定义name
ansible '*' -m cron -a 'name="custom job" minute=*/3 hour=* day=* month=* weekday=* job="/bin/bash /tmp/test.sh"'
ansible all -m cron -a " name='custom job' state=absent" -k
9.yum 模块
远程通过yum下载安装httpd
ansible all -m yum -a "state=present name=httpd" -k
远程通过yum下载安装rsync
ansible all -m yum -a "state=present name=rsync" -k
10.service 模块
在节点上启动服务,并开机自启动
ansible all -m service -a 'name=httpd state=started enabled=yes' -k
11.synchronize 模块
远程通过rsync模块同步目录数据
ansible all -m synchronize -a 'src=/root/cs dest=/tmp/ compress=yes' -k
更改推送数据为拉取数据
ansible server -m synchronize -a 'mode=pull src=/tmp/cs dest=/root/' -k
四、ansible playbook使用
Ansible-playbook可以理解为把ansible的使用的模块方法写入ansible-playbook剧本中。
Ansible-playbook文件是以“.yaml”或“.yml”结尾的文件
ansible-playbook -h
#ansible-playbook常用选项:
--check or -C #只检测可能会发生的改变,但不真正执行操作
--list-hosts #列出运行任务的主机
--list-tags #列出playbook文件中定义所有的tags
--list-tasks #列出playbook文件中定义的所以任务集
--limit #主机列表 只针对主机列表中的某个主机或者某个组执行
-f #指定并发数,默认为5个
-t #指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags)
-v #显示过程 -vv -vvv更详细
写一个拷贝文件的playbook
vim test.yml
语法检查
ansible-playbook --syntax-check test.yml
执行
ansible-playbook test.yml
解析
- hosts: node #指定被操作的主机或主机组
remote_user: root #指定远程操作时使用的用户
tasks: #操作的任务列表,可以有多个任务
- name: copy #自定义任务名称
copy: src=/root/test.txt dest=/tmp/ owner=nobody group=root #任务的操作 copy:copy模块 src:源地址 dest:目的地址 owner:所属人 group:所属组
playbook给远端服务器安装httpd服务并启动
vim httpd.yml
- hosts: server
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=installed
notify: #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用
- restart httpd #notify要执行的动作,这里必须与handlers中的name定义内容一致
- name: start httpd
service: name=httpd state=started
handlers: #处理器:更加tasks中notify定义的action触发执行相应的处理动作
- name: restart httpd #要与notify定义的内容相同
service: name=httpd state=restarted #触发要执行的动作
命令行指定变量
cat variables.yml
---
- hosts: all
remote_user: root
tasks:
- name: install pkg
yum: name={{ pkg }}
ansible-playbook -e "pkg=httpd" variables.yml
编辑配置文件定义变量
# 编辑hosts文件定义变量
vim /etc/ansible/hosts
[server]
192.168.90.242 webdir=/opt/test #定义单个主机的变量
[server:vars] #定义整个组的统一变量
webdir=/web/test
# 编辑playbook文件
cat variables.yml
---
- hosts: all
remote_user: root
tasks:
- name: create webdir
file: name={{ webdir }} state=directory #引用变量
# 执行playbook
ansible-playbook variables.yml
一个playbook文件中,如果想执行某一个任务,那么可以给每个任务集进行打标签,这样在执行的时候可以通过-t选择指定标签执行,还可以通过–skip-tags选择除了某个标签外全部执行等。
# 编辑playbook
[root@ansible PlayBook]# cat httpd.yml
---
- hosts: 192.168.1.31
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=installed
tags: inhttpd
- name: start httpd
service: name=httpd state=started
tags: sthttpd
- name: restart httpd
service: name=httpd state=restarted
tags:
- rshttpd
- rs_httpd
ansible-playbook -t rshttpd httpd.yml
ansible-playbook --skip-tags inhttpd httpd.yml
template模板提供了动态配置服务,使用jinja2语言,里面支持多种条件判断、循环、逻辑运算、比较操作等。其实说白了也就是一个文件,和之前配置文件使用copy一样,只是使用copy,不能根据服务器配置不一样进行不同动态的配置。这样就不利于管理。
说明:
1、多数情况下都将template文件放在和playbook文件同级的templates目录下(手动创建),这样playbook文件中可以直接引用,会自动去找这个文件。如果放在别的地方,也可以通过绝对路径去指定。
2、模板文件后缀名为.j2。
[root@ansible PlayBook]# cat testtmp.yml
#模板示例
---
- hosts: all
remote_user: root
vars:
- listen_port: 88 #定义变量
tasks:
- name: Install Httpd
yum: name=httpd state=installed
- name: Config Httpd
template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用模板
notify: Restart Httpd
- name: Start Httpd
service: name=httpd state=started
handlers:
- name: Restart Httpd
service: name=httpd state=restarted
条件测试:如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过when语句执行,在task中使用jinja2的语法格式、
when语句:
在task后添加when子句即可使用条件测试;when语句支持jinja2表达式语法
tasks:
- command: /bin/false
register: result
ignore_errors: True
- command: /bin/something
when: result|failed
- command: /bin/something_else
when: result|success
- command: /bin/still/something_else
when: result|skipped
tree templates/
templates/
├── httpd6.conf.j2 #6系统2.2.15版本httpd配置文件
└── httpd7.conf.j2 #7系统2.4.6版本httpd配置文件
0 directories, 2 files
通过setup模块获取系统版本去判断。setup常用模块
cat testtmp.yml
#when示例
---
- hosts: all
remote_user: root
vars:
- listen_port: 88
tasks:
- name: Install Httpd
yum: name=httpd state=installed
- name: Config System6 Httpd
template: src=httpd6.conf.j2 dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "6" #判断系统版本,为6便执行上面的template配置6的配置文件
notify: Restart Httpd
- name: Config System7 Httpd
template: src=httpd7.conf.j2 dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "7" #判断系统版本,为7便执行上面的template配置7的配置文件
notify: Restart Httpd
- name: Start Httpd
service: name=httpd state=started
handlers:
- name: Restart Httpd
service: name=httpd state=restarted
with_items迭代,当有需要重复性执行的任务时,可以使用迭代机制。
对迭代项的引用,固定变量名为“item”,要在task中使用with_items给定要迭代的元素列表。
列表格式:
字符串
字典
通过with_items安装多个不同软件
cat testwith.yml
# 示例with_items
---
- hosts: all
remote_user: root
tasks:
- name: Install Package
yum: name={{ item }} state=installed #引用item获取值
with_items: #定义with_items
- httpd
- vsftpd
- nginx
写法等同于
---
- hosts: all
remote_user: root
tasks:
- name: Install Httpd
yum: name=httpd state=installed
- name: Install Vsftpd
yum: name=vsftpd state=installed
- name: Install Nginx
yum: name=nginx state=installed
templates模板功能很多在此不一一举例了可参考
http://www.ansible.com.cn/docs/playbooks.html