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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值