ansible 使用详解

2 篇文章 0 订阅
1 篇文章 0 订阅

ansible 使用详解

准备工作及试验环境介绍

假设有三台主机为:n1,n2,n3

n1作为mater主机,其他三台作为受控主机

172.16.253.30主机为centos6系统,其他主机均为centos7系统

ssh-keygen -t rsa 
#跳过生成私钥和公钥中间的填写内容

ssh-copy-id 172.16.253.184
ssh-copy-id 172.16.254.89
ssh-copy-id 172.16.253.47
ssh-copy-id 172.16.253.30

vim /etc/ansible/ansible.cfg
#替换下面指令为:
host_key_checking = False   #本指令的含义为:每次在执行命令前都要检查该主机是否已经基于key做过认证

ansible srvs -m ping

#在每台主机上创建组group和user,并设置密码
ansible srvs -m group -a 'name="tomcat" state="present"'
ansible srvs -m user -a 'name="tomcat" group="tomcat" password="abcd" state="present"'

#以achudk用户的身份执行以root用户的权限执行ping指令
su - achudk
ansible srvs -m ping --become-user=root

基本使用

  • 测试执行 ” -C ” 选项
ansible HOSTS -m MODULES -a 'DIRECTIVE' -C
#或者
ansible-playbook PLAYBOOK_NAME -C
  • 查询所有模块的命令
ansible-doc -l

command模块与shell模块的区别

shell功能全面但执行效率低

command不支持:逻辑运算符、条件判断符号、重定向命令或管道

ansible srvs -m command -a 'echo "$HOSTNAME"'
ansible srvs -m shell -a 'echo "$HOSTNAME"'

使用command模块会报错

ansible srvs -m command -a 'cat /etc/issue > /tmp/issue.tmp'

使用shell模块则不会

ansible srvs -m shell -a 'cat /etc/issue > /tmp/issue.tmp'
ansible srvs -m command -a 'cat /tmp/issue.tmp'

文件传输模块:copy、fetch、template

  • copy模块:复制本机文件,传输至远程主机,并修改属主、属组和权限

  • ==注意:可以在参数中增加 backup=yes ,可以实现备份的功能==

实现copy功能

ansible srvs -m copy -a 'src=/etc/yum.repos.d/CentOS-Base.repo dest=/etc/yum.repos.d/CentOS-Base.repo owner=root group=root mode=0644'
ansible srvs -m command -a 'yum clean all'
ansible srvs -m command -a 'yum repolist'

实现备份功能

ansible srvs -m copy -a 'src=/root/test.txt dest=/root/ backup=yes'
  • fetch模块:复制远程文件,传输至本机(仅支持传输文件,如果传输目录可以先归档或压缩为一个文件后传输)

在n2主机的/root目录下创建文件f1,在n3主机的/root目录下创建文件f2,假设n2主机的/root目录下没有f2这个文件,假设n3主机的/root目录下没有f1这个文件,如果我们想从n2中传输f1这个文件至n1的/root目录下

  • ==注意:使用fetch模块传输至本地主机的文件,全部会保存在目录,文件实际保存路径为:==
  • /”dest参数指定的目录”/”源文件所在主机的IP地址”/”执行命令的用户名”/”传输的文件”
#在n1主机执行命令
ansible srvs -m fetch -a 'src=/root/f1 dest=/root/ backup=yes'
#f1文件的路径
ls 172.16.254.89/root/f1 

cron模块

  • 增加计划任务

设置每天的3:15,执行磁盘空间查看命令,并将命令结果保存至指定位置

ansible srvs -m cron -a 'name="disk check loger" minute=15 hour=3 job="df -hT >> /tpm/df.log"'
#验证结果
ansible srvs -m command -a 'crontab -l'
ansible srvs -m command -a 'cat /tmp/df.log'
  • 移除指定计划任务
ansible srvs -m cron -a 'name="disk check loger" state=absent'
#验证
ansible srvs -m command -a 'crontab -l'

yum模块

安装epel源

ansible srvs -m yum -a 'name=epel-release state=latest'

安装应用

ansible srvs -m yum -a 'name=nginx state=latest'
ansible srvs -m yum -a 'name=ntpdate state=latest'
ansible srvs -m command -a 'ntpdate 172.16.0.1'

管理各种服务:service模块

ansible srvs -m service -a 'name=nginx state=started'  

service模块中的state支持的选择有:started, stopped, restarted, reloaded

ansible srvs -m service -a 'name=nginx state=restarted'

setup 模块

自动从远程主机上获取可用与playbook中的变量

  • 获取所有可用变量
ansible srvs -m setup
  • 对变量进行过滤,仅获取符合匹配要求的变量

查询与系统版本相关的变量

“ansible_distribution”: “CentOS”

“ansible_distribution_major_version”: “7”

#方法1
ansible srvs -m setup -a 'filter=*distribut*'
#方法2
ansible srvs -m setup | grep -i distribut

debug 模块

可以通过debug模块调用变量显示想要的信息

  tasks:
  - name: show hosts information
    tags: info
    debug: msg="{{ ansible_distribution }}-{{ ansible_distribution_major_vers
ion }}-{{ ansible_distribution_release }}"

验证结果

ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=info
#结果为
ok: [172.16.254.89] => {
    "msg": "CentOS-7-Core"
}

script 模块

准备测试脚本

vim /root/test.sh
#!/bin/bash
#
touch /tmp/test.log
echo `date` >> /tmp/test.log
ls -l /tmp/test.log
cat /tmp/test.log

在所有主机执行脚本

ansible srvs -m script -a '/root/test.sh'

ansible-vault 命令

  • 加密 .yml 文件
#准备一个.yml文件
ansible-vault encrypt test.yml
#输入密码并确认

此时无法使用普通方法查看test.yml文件

  • 查看加密的.yml文件
ansible-vault view test.yml
#输入密码
  • 解密.yml文件
ansible-vault decrypt test.yml
#输入密码

此时可以使用普通方法查看.yml文件内容

ansible-galaxy 命令

  • 文件下载至/etc/ansible/roles目录下
  • ==注意:下载其他人共享的roles,在执行前应审核一遍文件内容,防止危险操作==

  • 安装并使用其他人共享的roles文件

ansible-galaxy install devops.nginx
ls /etc/ansible/roles/devops.nginx
  • 想删除下载的roles文件,将install替换为delete即可

ansible-console 命令

ansible的交互式命令工具

ansible-console 的命令提示符

root@all (4)[f:5]$ cd srvs
root@srvs (4)[f:5]$ forks 4
root@srvs (4)[f:4]$ list
172.16.253.184
172.16.254.89
172.16.253.47
172.16.253.30

其中:

root :当前执行用户

@ :分隔符

all :分组的组名

(4) :当前分组内的主机数量

[f:4] :并发线程数

ansible-console 的使用

ansible-console工具可自动补全选项,使用格式为:

模块名 选项1=value 选项2=value

service name=nginx state=started
yum name=tree state=latest
command tree -L 1 /

ansible-playbook命令及YAML语法

YAML语法

YAML :YAML ain’t a Markup Language ,以数据为中心、而不是以标记语言为重点的一种语言

  • 首行以 “—” 开始,且需顶格书写
  • 次行开始写playbook的正文,建议写明playbook的功能等描述信息
  • 注释符为 ” # “
  • 格式非常严格,严格控制缩进统一,不能和空格或Tab混用
  • 缩进级别必须一致,缩进级别相同代表同级别,级别的判断是通过缩进结合换行实现的
  • YAML文件内容和Linux系统大小写的判断方式保持一致,是区分大小写的,k/v的值均对大小写敏感
  • k/v的值可同行写,也可换行写,同行书写使用分隔符 ” : ” ,换行写分隔符 ” - “
  • 一个完整的代码块所必需包含的元素:name、task
  • 一个name只能包括一个task

test.yml 示例

vim /root/test.yml
#文件内容
---

- hosts: srvs
  remote_user: root
  tasks:
  - name: adduser test
    user: name=test shell=/bin/bash home=/home/test

playbook 核心元素

  • hosts :指定运行任务的目标主机
  • tasks :任务列表
  • variables :变量
  • templates :模板
  • handlers :动作执行探测器,探测到指定条件,触发执行动作
  • roles :按照固定目录结构组成的playbook

playbook中tags、notify、handlers的使用

  • ==playbook实例 :httpd-manager.yml==
---

- hosts: srvs
  remote_user: root
  tasks:
  - name: install httpd
    tags: install
    yum: name=httpd state=latest

  - name: start httpd.service
    tags: start
    service: name=httpd state=started

  - name: start httpd.service
    tags: restart
    service: name=httpd state=restarted

  - name: stop httpd.service
    tags: stop
    service: name=httpd state=stopped

  - name: config httpd
    tags: config
    copy: src=/root/ansible/httpd.conf dest=/etc/httpd/conf/ backup=yes
    when: ansible_distribution_major_version == "7"
    notify: restart httpd

  handlers:
  - name: restart httpd
    service: name=httpd state=restarted
  • 实现功能:

  • 单独调用其中一个功能

ansible-playbook httpd-server-deploy.yml --tags=start
  • 同时调用多个功能
ansible-playbook httpd-server-deploy.yml --tags="stop,config"
  • 针对某一单个成员执行某一功能
ansible-playbook httpd-server-deploy.yml --tags="start,stop" -l 172.16.253.30

playbook中变量的使用

定义变量

在/etc/ansible/hosts文件中定义变量,可针对某台主机定义变量,也可以对整个分组定义变量

组变量和主机变量的生效优先级为:如果针对主机定义了变量(无论是否定义了组变量),主机变量生效;如果未定义主机变量,仅定义了组变量,组变量生效。

vim /etc/ansible/hosts

#组变量
[srvs:vars]
webport=80

#主机变量
[srvs]
172.16.253.184 webport=10080 hostname=node1
172.16.254.89  webport=10180 hostname=node2
172.16.253.47  webport=10280 hostname=node3
172.16.253.30  webport=10380 hostname=node4
调用变量

调用变量的两种方式的生效优先级:在命令行下直接定义的变量优先级高于在hosts文件中定义的变量(主机变量或分组变量)
1. 可以在命令行模式直接使用”ansible-playbook test.yml -e “webport=2000”
2. 调用在hosts文件中定义好的变量

引用变量注意:使用双大括号 “{{ VAR-NAME }}” ,且括号前后要有空格

  • 修改主机名
ansible srvs -m hostname -a 'name=“name-{{ hostname }}-port-{{ webport }}"'
ansible srvs -m command -a 'hostname'
#执行结果
172.16.253.30 | SUCCESS | rc=0 >>
name-node4-port-10380

172.16.253.184 | SUCCESS | rc=0 >>
name-node1-port-10080

172.16.253.47 | SUCCESS | rc=0 >>
name-node3-port-10280

172.16.254.89 | SUCCESS | rc=0 >>
name-node2-port-10180

ansible-playbook 之强大的 template

  • jianja2语法格式:

支持算术运算:+ , - , * , / , **

支持比较操作符:== , >= , != , <= , > , <

支持逻辑运算符: and , or , not

支持流表达式:for , if , while

使用template在配置文件中调用变量

  • 设置template配置文件
#设置jianja2文件
cp /root/ansible/httpd.conf /root/ansible/httpd.conf.j2
vim /root/ansible/httpd.conf.j2
#修改Listen一项的值为 "{{ webport }}"
Liten {{ webport }}

#重新设置yml文件
cp /root/ansible/httpd-manager.yml /root/ansible/httpd-manager-j2.yml
vim /root/ansible/httpd-manager-j2.yml
#修改config配置块中的copy指令为template指令,其他部分不变,示例如下:

  - name: config httpd
    tags: config
    template: src=/root/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    when: ansible_distribution_major_version == "7"
    notify: restart httpd
  • 执行playbook
ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=config
#执行结果:对分组中不同的主机采用不同的端口
ansible srvs -m shell -a 'ss -tnlp | grep httpd'
  • template还支持算术运算

将所有端口加1

vim /root/ansible/httpd.conf.j2
#修改以下内容
Listen {{ webport+1 }}

通过template在配置文件中使用for循环和if语句

  • 定义基于不同域名的多个虚拟主机
#查找主机名变量
ansible srvs -m setup | grep hostname

#修改httpd.conf.j2文件
Listen {{ webport }}

<VirtualHost *.{{ webport }}>
        ServerName {{ ansible_hostname }}.achudk.com
        DocumentRoot /var/www/html
        <Directory "/var/www">
                Require all granted
        </Directory>
</VirtualHost>

#验证结果
ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=config
curl curl 172.16.254.89:10180
  • 使用for循环生成多个基于不同域名且不同端口的虚拟主机,并使用if判断条件
#修改httpd.conf.j2文件
vim httpd.conf.j2
{% for vport in vports %}
        <VirtualHost *.{{ vport }}>
                ServerName {{ ansible_hostname }}.achudk.com
                DocumentRoot /var/www/html
                <Directory "/var/www">
                        Require all granted
                </Directory>
                {% if errorlog is not defined %}
                ErrorLog "{{ errorlog | default('/web/httpd/log/vh1/error_log') }}"
                {% endif %}
        </VirtualHost>
{% endfor %}


#修改httpd-manager-j2.yml文件,在起始处增加vars指令,余下内容不变,如下:
vim httpd-manager-j2.yml
#正文如下
---

- hosts: srvs
  remote_user: root
  vars:
  - vport:
    - 80
    - 443
    - 8080
  - errorlog:
    - "/web/httpd/log/vh1/error_log"

#验证结果
ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=config
  • when条件判断
#当系统为CentOS7时,才启用该配置片段
  - name: config httpd
    tags: config
    template: src=/root/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    when: ansible_distribution == "CentOS"
    when: ansible_distribution_major_version == "7"
    notify: restart httpd
  • ==when指令的多条件联合判断==

多个条件之间使用 “and” 连接

  tasks:
  - name: show hosts information
    tags: info
    debug: msg={{ ansible_distribution }},msg={{ ansible_distribution_major_v
ersion }}
    when: ansible_distribution == "CentOS" and ansible_distribution_major_ver
sion == "6"

==最终实例==

将所学内容综合起来使用,形成具有管理功能的yml文件

---

- hosts: srvs
  remote_user: root
  vars:
  - vports:
    - 80
    - 443
    - 8080
  - errorlog:
    - "/web/httpd/log/vh1/error_log"

  tasks: 
  - name: show hosts information
    tags: info
    debug: msg="{{ ansible_distribution }}-{{ ansible_distribution_major_version }}-{{ ansible_distribution_release }}"


  - name: install httpd
    tags: install
    yum: name=httpd state=latest


  - name: start httpd.service
    tags: start
    service: name=httpd state=started

  - name: start httpd.service
    tags: restart
    service: name=httpd state=restarted

  - name: stop httpd.service
    tags: stop
    service: name=httpd state=stopped

  - name: config httpd
    tags: config
    template: src=/root/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    when: ansible_distribution == "CentOS" and ansible_distribution_major_ver
sion == "7"  
    notify: restart httpd

  handlers:
  - name: restart httpd
    service: name=httpd state=restarted
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值