ansible 安装部署

it2025-03-31  11

ansible 安装部署

一.ansible的介绍1.1 ansible说明1.2 常用模块1.3 Ansible命令使用1.4 ansible 配置文件常用参数 二.安装ansible过程1.1 关闭各个机器的selinux,iptables,修改hosts1.2 做免密码登录1.3 安装ansible1.4 定义主机,将所有的被管理主机加入到/etc/ansible/hosts1.5 执行ping存活检测1.6 列出执行主机列表1.7 command模块1.8 shell模块1.9 setup模块(查看客户机的详细情况)1.10 copy模块(类似scp向客户端传输文件)1.11 yum模块1.12 service模块1.13 cron模块1.14 fetch模块1.15 file模块1.16 user模块1.17 group模块 三.playbook3.1 playbook初识3.2 playbook的优势3.3 playbook的配置语法是由yaml语法描述的,扩展名是yaml3.4 Playbook 变量使用3.4.1 playbook的yaml文件中定义变量赋值3.4.2 --extra-vars执行参数赋给变量3.4.3 在文件中定义变量: 可以在/etc/ansible/hosts主机组中定义,然后使用palybook进行调度该变量 3.5 Playbook 条件语句3.6 playbook循环语句3.7 playbook 异常处理3.8 playbook tags标签3.9 playbook Handlers3.10 Playbook Include3.11 playbook role3.11.1 role介绍3.11.2 roles目录结构3.11.3 Roles各目录作用3.11.4 创建 role3.11.5 实现 httpd 角色3.11.6 调用角色方法

一.ansible的介绍

1.1 ansible说明

新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括: (1).连接插件connection plugins:负责和被监控端实现通信; (2).host inventory:指定操作的主机,是一个配置文件里面定义监控的主机; (3).各种模块核心模块、command模块、自定义模块; (4).借助于插件完成记录日志邮件等功能; (5).playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

1.2 常用模块

1.ping模块 2.raw模块 3.yum模块 4.apt模块 5.pip模块 6.synchronize模块 7.template模块 8.copy模块 9.user 模块与group模块 10.service 模块 11.get_url 模块 12.fetch模块 13.file模块 14.unarchive模块 15.command 模块和shell

1.3 Ansible命令使用

Ansible语法使用ansible <pattern_goes_here> -m <module_name> -a -m NAME,–module-name=NAME:指定执行使用的模块 -u USERNAME,–user=USERNAME:指定远程主机以USERNAME运行命令 -s,–sudo:相当于Linux系统下的sudo命令 -USUDO_USERNAME,–sudo-user=SUDO_USERNAME:使用sudo,相当于Linux下的sudo命令 -C -check只检查不实际执行 -e EXTRA_VARS,引用外部参数 -i INVENTORY,指定仓库列表,默认/etc/ansible/hosts –list-hosts,列出执行主机列

1.4 ansible 配置文件常用参数

[root@lanmp ansible]# cat 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都要开启这个选项

二.安装ansible过程

环境:centos6.5 mini 机器名 ip地址 作用 ab01 192.168.1.11 Ansible服务端 ab02 192.168.1.22 被管理 ab03 192.168.1.33 被管理

1.1 关闭各个机器的selinux,iptables,修改hosts

1.2 做免密码登录

[root@ab01 yum.repos.d]ssh-keygen [root@ab01 yum.repos.d]ssh-copy-id ab02 [root@ab01 yum.repos.d]ssh-copy-id ab03 [root@ab02 .ssh]# ssh-keygen [root@ab02 .ssh]# ssh-copy-id ab01 [root@ab02 .ssh]# ssh-copy-id ab03 [root@ab03 ~]# ssh-keygen [root@ab03 ~]# ssh-copy-id ab01 [root@ab03 ~]# ssh-copy-id ab02

1.3 安装ansible

[root@ab01 ~]# yum install -y epel-release [root@ab01 ~]# yum install -y ansible

1.4 定义主机,将所有的被管理主机加入到/etc/ansible/hosts

[root@ab01 ansible]# pwd /etc/ansible [root@ab01 ansible]# mv hosts hosts.bak [root@ab01 ansible]# vi hosts [web] 192.168.1.22 192.168.1.33

第二模块的使用(ansible 操作目标 -m 模块名 -a 模块参数)

1.5 执行ping存活检测

[root@ab01 ansible]# ansible web -m ping

1.6 列出执行主机列表

[root@ab01 ansible]# ansible web --list-hosts

1.7 command模块

[root@ab01 ansible]# ansible web -m command -a ‘ls’ #chdir [root@pxc01 ~]# ansible db -m command -a ‘chdir=/tmp/ ls -l’ #creates [root@pxc01 ~]# ansible db -m command -a ‘touch /home/1.txt creates=/home/1.txt’

1.8 shell模块

[root@ab01 ansible]# ansible web -m shell -a ‘df -hT >1.txt’ [root@ab01 ansible]# ansible web -m command -a ‘cat 1.txt’

1.9 setup模块(查看客户机的详细情况)

[root@ansible ansible]# ansible mysql -m setup [root@lanmp ~]# ansible lb -m setup -a “filter=ansible_nodename” [root@lanmp ~]# ansible lb -m setup -a “filter=ansible_hostname” [root@lanmp ~]# ansible lb -m setup -a “filter=ansible_memtotal_mb” [root@lanmp ~]# ansible lb -m setup -a “filter=ansible_memfree_mb” [root@lanmp ~]# ansible lb -m setup -a “filter=ansible_os_family” [root@lanmp ~]# ansible lb -m setup -a “filter=ansible_all_ipv4_addresses” [root@lanmp ~]# ansible lb -m setup -a “filter=ansible_processor_vcpus”

1.10 copy模块(类似scp向客户端传输文件)

主要用于将管理主机上的数据信息传送给多台主机 [root@pxc01 soft]# ansible db -m copy -a ‘src=/root/soft/ dest=/root/ owner=root group=root mode=0775 force=yes’ [root@ansible ~]# ansible mysql -m copy -a “src=/root/1.sh dest=/tmp/ owner=root group=root mode=0775 force=yes” [root@mysql02 tmp]# ll 1.sh -rwxrwxr-x 1 root root 0 9月 15 05:56 1.sh

1.11 yum模块

使用yum软件包管理器安装,升级,降级,删除和列出软件包和组。 [root@pxc01 soft]# ansible db -m yum -a ‘name=telnet state=installed’

1.12 service模块

用于管理服务运行状态 [root@pxc01 soft]# ansible db -m service -a ‘name=iptables state=restarted enabled=no’

1.13 cron模块

定时任务模块 [root@pxc01 soft]# ansible db -m cron -a “name=‘ntpdate time’ minute=*/10 job=’/usr/sbin/ntpdate 0.cn.pool.ntp.org &>/dev/null’”

1.14 fetch模块

功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录 [root@lanmp haproxy]# ansible lb -m fetch -a ‘src=/etc/haproxy/haproxy.cfg dest=/tmp/’ [root@lanmp haproxy]# pwd /tmp/192.168.1.186/etc/haproxy [root@lanmp haproxy]# ls haproxy.cfg #会将目录结构,文件也复制到服务端

1.15 file模块

file模块主要用于远程主机上的文件操作,file模块包含如下选项: – force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no – group:定义文件/目录的属组 – mode:定义文件/目录的权限 – owner:定义文件/目录的属主 – path:必选项,定义文件/目录的路径 – recurse:递归的设置文件的属性,只对目录有效 – src:要被链接的源文件的路径,只应用于state=link的情况 – dest:被链接到的路径,只应用于state=link的情况 – state:    directory:如果目录不存在,创建目录    file:即使文件不存在,也不会被创建    link:创建软链接    hard:创建硬链接    touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间    absent:删除目录、文件或者取消链接文件 #创建文件 [root@lanmp ~]# ansible lb -m file -a ‘path=/tmp/file.txt state=touch’ [root@lanmp ~]# ansible lb -m file -a ‘path=/tmp/file.txt state=absent’ [root@lanmp ~]# ansible lb -m file -a ‘path=/tmp/1.txt owner=zabbix group=zabbix mode=600’

#创建目录 [root@lanmp ~]# ansible lb -m file -a ‘path=/tmp/test state=directory owner=zabbix group=zabbix’

#创建软链接 [root@lanmp ~]# ansible lb -m file -a ‘src=/tmp/1.txt dest=/var/lib/net/1.txt state=link’

1.16 user模块

功能:管理用户 #添加用户 [root@lanmp ~]# ansible lb -m user -a ‘name=user01 comment=“test user” uid=2048 home=/home/user01 group=user01’ [root@lanmp ~]# ansible lb -m user -a ‘name=user03 comment=“test user03” group=root shell=/sbin/nologin’

#删除用户及其家目录的数据 [root@lanmp ~]# ansible lb -m user -a ‘name=user03 state=absent remove=yes’

1.17 group模块

#添加组 [root@lanmp ~]# ansible lb -m group -a ‘name=user01 gid=88 system=yes’ #删除组 [root@lanmp ~]# ansible lb -m group -a ‘name=user02 gid=197 state=absent’

三.playbook

3.1 playbook初识

1.什么是playbook,playbook翻译过来就是“剧本”,那playbook组成如下 play: 定义的是主机的角色 task: 定义的是具体执行的任务 playbook: 由一个或多个play组成,一个play可以包含多个task任务 简单理解为: 使用不同的模块完成一件事情

3.2 playbook的优势

1.功能比ad-hoc更全 2.能很好的控制先后执行顺序, 以及依赖关系 3.语法展现更加的直观 4.ad-hoc无法持久使用,playbook可以持久使用

3.3 playbook的配置语法是由yaml语法描述的,扩展名是yaml

缩进 YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用tabs 冒号 以冒号结尾的除外,其他所有冒号后面所有必须有空格。 短横线 表示列表项,使用一个短横杠加一个空格。 多个项使用同样的缩进级别作为同一列表。

3.4 Playbook 变量使用

Playbook定义变量有三种方式

playbook的yaml文件中定义变量赋值–extra-vars执行参数赋给变量在文件中定义变量

3.4.1 playbook的yaml文件中定义变量赋值

[root@pxc01 yarml]#cat f1.yml --- - hosts: all remote_user: root vars: #定义变量 file_name: xuliangwei tasks: - name: Create New File # {{ file_name }}引用上面定义的变量 file: name=/tmp/{{ file_name }} state=touch [root@pxc01 yarml]# ansible-playbook f2.yml

Playbook执行结果返回颜色状态 红色: 表示有task执行失败或者提醒的信息 黄色:表示执行了且改变了远程主机状态 绿色:表示执行成功

3.4.2 --extra-vars执行参数赋给变量

[root@pxc01 yarml]# cat f2.yml --- - hosts: all remote_user: root tasks: - name: create new file file: name=/tmp/{{file_name}} state=touch [root@pxc01 yarml]# ansible-playbook f2.yml --extra-vars "file_name=huilong02.txt"

3.4.3 在文件中定义变量: 可以在/etc/ansible/hosts主机组中定义,然后使用palybook进行调度该变量

[root@pxc01 yarml]# vim /etc/ansible/hosts [root@pxc01 yarml]# ansible-playbook f2.yml 如果定义的变量出现重复,且造成冲突,优先级如下:

1.extra-vars外置传参的优先级最高 [所有执行的主机都生效] 2.定义在yml文件中的优先级其次 [所有执行的主机都生效] 3.hosts文件中定义的变量优先级最低 [当前主机组定义会生效]

3.5 Playbook 条件语句

[root@lanmp yml]# cat when.yml --- - hosts: lb remote_user: root tasks: #系统为centos 的主机才会执行 - name: Centes yum: name=httpd state=present when: (ansible_distribution == "CentOS")

[root@lanmp yml]# ansible-playbook -C when.yml

3.6 playbook循环语句

1.标准循环使用场景-批量安装软件

[root@lanmp yml]# cat for.yml --- - hosts: lb remote_user: root tasks: - name: yum installed Pkg yum: name={{ item }} state=present with_items: - wget - tree - telnet [root@lanmp yml]# ansible-playbook for.yml

2.标准循环使用场景-批量创建用户

[root@lanmp yml]# cat for2.yml --- - hosts: lb remote_user: root tasks: - name: add users user: name={{ item.name }} groups={{ item.groups }} state=present with_items: - { name: 'test01',groups: 'user01' } - { name: 'test02',groups: 'root' } [root@lanmp yml]# ansible-playbook for2.yml

3.7 playbook 异常处理

默认Playbook会检查命令和模块的返回状态,如遇到错误就中断playbook的执行 加入参数: ignore_errors: yes 忽略错误

[root@lanmp yml]# cat error.yml --- - hosts: lb remote_user: root tasks: - name: ignore error command: /bin/test ignore_errors: yes

3.8 playbook tags标签

1.打标签 对一个对象打一个标签 对一个对象打多个标签 对多个对象打一个标签

2.标签使用,通过tags和任务对象进行捆绑,控制部分或者指定的task执行

-t: 执行指定的tag标签任务 –skip-tags: 执行–skip-tags之外的标签任务

#正常执行

[root@lanmp yml]# cat tags.yml --- - hosts: lb remote_user: root tasks: - name: start_iptables service: name=iptables state=started tags: - start_iptables - start_firewall - name: start_keepalived service: name=keepalived state=started tags: start_keepalived [root@lanmp yml]# ansible-playbook tags.yml

#使用-t指定tags执行, 多个tags使用逗号隔开即可 [root@lanmp yml]# ansible-playbook -t start_iptables tags.yml #使用–skip-tags排除不执行的tags [root@lanmp yml]# ansible-playbook --skip-tags start_firewall tags.yml

3.9 playbook Handlers

#批量安装zabbix_agent [root@lanmp jiaoben]# cat /root/jiaoben/zabbix_agent.sh

#!/bin/bash groupadd zabbix useradd -g zabbix -m zabbix cd /usr/local/src/ tar -zxvf zabbix-3.4.8.tar.gz yum install -y gcc pcre* cd zabbix-3.4.8 ./configure --prefix=/usr/local/zabbix --enable-agent make && make install sed -i 's/Server=127.0.0.1/Server=192.168.1.170/g' /usr/local/zabbix/etc/zabbix_agentd.conf sed -i 's/ServerActive=127.0.0.1/ServerActive=192.168.1.170/g' /usr/local/zabbix/etc/zabbix_agentd.conf sed -i ‘s/Hostname=Zabbix server/’Hostname=$HOSTNAME’/g’ /usr/local/zabbix/etc/zabbix_agentd.conf cp misc/init.d/tru64/zabbix_agentd /etc/init.d/ chmod +x /etc/init.d/zabbix_agentd ln -s /usr/local/zabbix/sbin/* /usr/local/sbin/ ln -s /usr/local/zabbix/bin/* /usr/local/bin/ service zabbix_agentd start echo "service zabbix_agentd start">>/etc/rc.d/rc.local

[root@lanmp jiaoben]# cat /etc/ansible/yml/zabbix_agent.yml

- hosts: base remote_user: root tasks: - name: copy sh copy: src=/root/jiaoben/zabbix_agent.sh dest=/usr/local/src/zabbix_agent.sh mode=0700 - name: sent tar copy: src=/root/soft/zabbix-3.4.8.tar.gz dest=/usr/local/src/zabbix-3.4.8.tar.gz notify: install shell handlers: - name: install shell shell: /usr/local/src/zabbix_agent.sh [root@lanmp yml]# ansible-playbook zabbix_agent.yml

3.10 Playbook Include

include用来动态的包含tasks任务列表 [root@lanmp yml]# cat f{1…2}.yml

- name: create file01 command: touch file01 - name: create file02 command: touch file02 [root@lanmp yml]# cat main.yml --- - hosts: lb remote_user: root tasks: - include: f1.yml - include: f2.yml [root@lanmp yml]# ansible-playbook main.yml

3.11 playbook role

3.11.1 role介绍

角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中

运维复杂的场景:建议使用roles,代码复用度高

3.11.2 roles目录结构

playbook.yml roles/ project/ tasks/ files/ vars/ templates/ handlers/ default/ meta/

3.11.3 Roles各目录作用

roles/project/ :项目名称,有以下子目录

files/ :存放由copy或script模块等调用的文件 templates/:template模块查找所需要模板文件的目录 tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含 handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含 vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含 meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含 default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低

3.11.4 创建 role

创建role的步骤 (1) 创建以roles命名的目录 (2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等 (3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建 (4) 在playbook文件中,调用各角色

3.11.5 实现 httpd 角色

#创建角色相关目录 [root@lanmp roles]# pwd /etc/ansible/roles [root@lanmp roles]# mkdir -pv httpd/{tasks,handlers,files} #创建角色相关文件 [root@lanmp tasks]# pwd /etc/ansible/roles/httpd/tasks [root@lanmp httpd]# cd tasks/ [root@lanmp tasks]# ls config.yml group.yml index.yml install.yml main.yml service.yml user.yml [root@lanmp tasks]# vim main.yml [root@lanmp tasks]# cat main.yml - include: group.yml - include: user.yml - include: install.yml - include: config.yml - include: index.html - include: service.yml [root@lanmp tasks]# cat user.yml - name: create apache user user: name=apache system=yes shell=/sbin/nologin home=/var/www/ uid=80 group=apache [root@lanmp tasks]# cat group.yml - name: create apache group group: name=apache system=yes gid=80 [root@lanmp tasks]# cat install.yml - name: install httpd package yum: name=httpd [root@lanmp tasks]# cat config.yml - name: config file copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/ backup=yes notify: restart [root@lanmp tasks]# cat index.yml - name: index.html copy: src=/etc/ansible/roles/httpd/files/index.html dest=/var/www/html [root@lanmp tasks]# cat service.yml - name: start service service: name=httpd state=started enabled=yes [root@lanmp tasks]# cat ../handlers/main.yml - name: restart service: name=httpd state=restarted

#准备一下文件 [root@lanmp httpd]# cd files/ [root@lanmp files]# ls [root@lanmp files]# touch httpd.conf index.html

[root@lanmp files]# tree /etc/ansible/roles/httpd/ #在playbook中调用角色

[root@lanmp ansible]# pwd /etc/ansible [root@lanmp ansible]# cat role_httpd.yml --- - hosts: lb remote_user: root roles: - httpd [root@lanmp ansible]# ansible-playbook role_httpd.yml

3.11.6 调用角色方法

调用角色方法1 调用角色方法2: 键role用于指定角色名称,后续的k/v用于传递变量给角色 调用角色方法3:

还可基于条件测试实现角色调用 roles中tags 使用 #http://www.yunweipai.com/34669.html

最新回复(0)