Ansible--详解

目录

一、Ansible核心组件

 二、Ansible配置

1.配置案例

(1)管理安装ansible

(2)管理机分发公匙

(3)配置管理

(4)测试连接

2.命令说明

三、playbook剧本编写

1.playbook模板

2.playbook剧本话管理

3.常用模块

4.文件管理

 5.文件分发

6.处理程序(Handlers)

7.角色管理

8.事实

9.加密


一、Ansible核心组件

  • Host Inventory模块:

               定义ansible管理的主机,可以进行分组管理。

  • Core Modules Ansible核心模块

                ansible中模块就是用来指定对远程主机具体的操作,比如执行命令模块command、创建文件模块file等(ansible自带的模块)。

  • Custom Modules自定义模块

                如果黑犀牛模块不足以完成魔种功能呢就可以使用任何语言自定义模块。

  • Connection Plugins连接插件

                Ansible用来连接被管理端的一种方式,比如客户端运行了SSH服务,Ansible利用SSH服务跟客户端进行通信,Ansible是通过python编写的,而python有一个模块paramiko支持并行连接SSH,Ansible事实上就是使用paramiko进行连接被管理端。但是它还支持其他的连接方式需要插件(如zeroMQ就是C/S模式工作)。

  • Plugins第三方插件支持

                如email、logging模块,只要有Python编写能力就可以自行编写插件。

二、Ansible配置

1.配置案例

实验环境准备:

  • 192.168.10.10 管理机       192.168.10.11 被管理机
  • 目前只要机器上安装了python2.6或python2.7(windows系统不可以做控制主机),都可以运行Ansible。
  • 主机的系统可以是Red Hat,Debian,CentOS,OS X,BSD的各种版本等等。

(1)管理安装ansible

yum -y install epel-release
    #ansible在epel扩展源中

yum -y install ansible
    #安装ansible

(2)管理机分发公匙

ssh-keygen -t rsa -b 4096
    #生成密钥对

ssh-copy-id root@192.168.10.11
    #将公钥传给被管理机

#编写批量化传公钥的脚本

yum -y install expect
    #安装expect,让脚本支持expect的命令,可以出发远程登录。

vim send_isa_pub.sh
    #编写批量化传公钥的脚本

#!/bin/bash
ip1=100
pwd=123456
while [ $ip1 -le 200 ];
do
	ip=192.168.10.$ip1
expect << EOF
spawn ssh-copy-id root@$ip
expect {
"yes/no" {send "yes\n";exp_continue}
"password" {send "$pwd\n"}
}
export eof
EOF
	let ip1=$ip1+1
done

(3)配置管理

cd /aetc/ansible
vim hosts
    #编辑主机管理文件
[web]	#定义模块
# 设置管理的主机(被管理主机的IP地址)
192.168.10.11
[local]
127.0.0.1
[remote]
192.168.10.11

(4)测试连接

ansible -i /etc/ansible/hosts --connection=local local -m ping
    # 测试本地连接,-i 指定主机文件;-m指定调用的命令模块;
    # --connection=local告诉ansible本机通信不需要通过SSH运行命令

ansible -i /etc/ansible/hosts remote -m ping
    # 测试远程连接,-m后面跟调用的命令模块
    # 测试到 remote 模块的主机是否网络通畅

2.命令说明

命令:
    ansible
参数:
    -i /etc/ansible/hosts
        # --inventory=PATH
        # 指定库存文件,命名为hosts
    remote,local,all
        # 使用这个标签的下定义的服务器hosts清单文件
        # “all”是针对文件中定义的每个服务器运行的特殊关键字的。
    --private-key=PRIVATE_KEY_FILE_PATH
        # #使用指定路径的密匙建立认证连接
    -m shell
        # --module-path=DIRECTORY
        # 使用shell模块,它只是运行ping命令并返回结果。
    -a 'yum -y install httpd'
        # 用于将任何参数传递给 -m 指定的模块
    -c local或--connecion=local
        #在本地服务器上运行命令,而不是SSH。
    -b --become-user=root
        # 以用户“root”身份运行命令
    -u USERNAME --user=USERNAME
        # 指定移动端的执行用户
    -U SUDO_USERNAME --sudo-user=USERNAME
    -s --sudo
        # -u指定用户的时候,使用sudo获得root权限
    -k --ask-pass
        # 提示输入ssh的密码,而不是使用基于ssh的密钥认证
    -K --ask-sudo-pass
        # 提示输入sudo密码,与--sudo一起使用


示例:
    ansible -i /etc/ansible/hosts web -b --become-user=root -m shell -a 'yum -y install httpd'
    # -i指定hosts文件(内有管理主机的IP)中的web组里的主机
    # -b指定以root用户执行后面的命令
    # -m指定shell模块(运行命令)
    # -a指定yum -y install httpd运行这个命令,并将这个参数传给shell

    ansible -i ./hosts local --connection=local -b --become-user=root -m shell -a 'yum -y install nginx'
    # --connection=local对本机执行

    ansible -i ./hosts local remote -b --become-user=root -m shell -a 'yum -y install httpd'
    # 同时指定多个模块

三、playbook剧本编写

  • 功能:剧本文件中可以写入多个执行项,并排列好执行顺序,一次性给客户执行

  • 特点:剧本文件,必须按照yml语言编写,后缀必须是.yml

               剧本中调用对应的模块(即程序段),实现对应的功能

1.playbook模板

mkdir /etc/ansible/playbook && cd /etc/ansible/playbook

vim default.yml
- hosts: web        #指定hosts文件里的web模块的主机
  become: yes		#允许使用指定的用户身份去执行
  become_user: root
  tasks:			#针对web主机组执行的操作 
    - name: install httpd	#定义一个任务名
      shell:		#调用shell模块执行命令
        'yum -y install httpd'
      #command: 'yum -y install httpd'    #等于shell模块
    - name: create web page file	#创建网页文件
      shell:
        'echo "www.daboluo.com" > /var/www/html/index.html' 
    - name: start httpd		#定义一个任务名
      service:				#服务
        name: httpd			#服务名为httpd
        state: restarted		#指定服务状态重启

ansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/default.yml
    # 指定主机文件/etc/ansible/hosts,剧本文件为/etc/ansible/playbook/default.yml

2.playbook剧本话管理

  • 功能:制定被管主机服务,业务的部署方案,实现复杂配置
  • 配置思路:

                首先定义.yml文件,文件内容按ad-hoc格式编写

                再用ansible-playbook -i ./hosts XXX.yml的方式调用运行剧本

  • 模块化管理:

                .yml文件中使用不同模块完成不同的配置功能

3.常用模块

tasks		    # 定义各种任务,.yml启动时执行,常用任务类型如下:
	command		# 运行指定命令
	shell		# 调用指定脚本
	file		# 文件创建
	copy		# 文件复制
	service		# 服务管理
	yum			# 软件安装
	handlers	# 设定处理程序
	user		# 用户模块
	group		# 组模块
# command和shell的区别:
# command只能调用一条指令,不支持保留字;shell可以使用管道。
# 不支持别名命令

4.文件管理

# task任务中可设定file模块,创建文件或目录
file:
    path: '/mnt/d1'
    mode: '0775'
    state: directory		
# 指定文件类型:touch文件,directory目录,link软连接,hard硬链接,absent删除文件
    owner: www-data
    group: www-data
    #src=/mnt/f1	# 若state=link/hard的时候,src来指定原文件
    #force=yes		# 若创建软链接时,需要强制创建,则增加force=yes
    #recurse=yes	# 若state=directory时,并且更改权限或所属的时候,需递归继承,增加此选项。
# 若文件/目录不存在,则创建;若文件/目录存在,则更改权限,所属。

参数详解:

  • state参数:文件需要将state的值设置为touch。软链接需要将state设置为link,硬链接需要将state设置为hard。删除文件时(删除时不用区分目标是文件、目录还是链接),需要将state的值设置为absent,“absent”为缺席之意,当我们想让操作的目标“缺席”时,就表示我们想要删除目标。

  • src参数:当state设置为link或hard时,表示我们想要创建一个软连接或硬链接,所以,我们必须知知名软连接或硬链接的那个文件,通过src参数即可指定链接源。

  • force参数:当state=link的时候,可以配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件。

  • recurse参数:当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。

示例:

vim test1.yml
    #编写剧本文件
- hosts: web
  become: yes
  become_user: root
  tasks:
    - name: chuang jian wen jian
      file:             #创建一个文件
        path: /mnt/f1   #文件的路径
        state: touch    #状态为创建
        mode: '0644'    #权限为644
        owner: root     #所有者为root
        group: root     #所属组为root

ansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/test1.yml
vim link-test.yml
- hosts: web
  become: yes
  become_user: root
  tasks:
    - name: an zhuang httpd
      file:		        #创建一个文件
        src: /mnt/f1	#源文件的路径
        dest: /root/f1	#软连接文件为f1
        state: link		#创建软链接
        force: yes		#如果已经存在,那就强制创建

ansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/link-test.yml	

 5.文件分发

功能:从ansible服务器端分发文件给客户机

copy:

    src=/mnt/f1        # 指定本机要分发出去的文件路径

    dst=/mnt/           # 指定客户机上分发后存放的路径

# 复制文件

- hosts: web
  become: yes
  become_user: root
  tasks:
    - name: test
      copy:
        src: /mnt/f1
# 本机要分发出去的文件,src=/mnt表示把整个目录分发下去,src=/mnt/表示分发目录下所有内容
        dest: /mnt/		# 客户机上存放的路径
        mode: '0644'	# 权限为644
        owner: root		# 所有者为root
        group: root		# 所属组为root

ansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/XXX.yml

# 复制多个文件
# 多个文件复制传到相同位置

- hosts: test
  vars:
    filename: /mnt/f*
  become: yes
  become_user: root
  tasks:
    - name: copy file
      copy:
        src: "{{item}}"			#占位符
        dest: /mnt/
        mode: '0755'
        owner: root
        group: root
      with_fileglob: "{{filename}}"	#调用变量的值,将变量的值传给占位符

ansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/XXX.yml

  

# 多个文件传到不同位置

- hosts: test
  remote_user: root
  gather_facts: false
  become: yes
  tasks:
    - name: "copy from target cpu"
      copy:
        src: "{{item.src}}"			#占位符,src调用src项
        dest: "{{item.dest}}"		#占位符:dest调用dest项
        mode: '0755'
        owner: root
        group: root 
      loop:
        - {src: "/mnt/f1", dest: "/mnt" }	#被调用变量
        - {src: "/mnt/f2", dest: "/var" }	#被调用变量,给占位符传值

ansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/XXX.yml

# 使用变量支持保留字时,只针对批量文件分发有效,对批量目录的分发无效
# 添加用户或组

- hosts: web
  remote_user: root
  become: yes
  tasks:
    - name: test
      user:
        name: wang			#创建名为wang的用户
        state: present

ansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/XXX.yml

6.处理程序(Handlers)

       处理程序与任务完全相同(它可以做task可以做的任何事),相当于一个函数,只是在剧本启动时不被执行,只有当另一个任务调用它时才会运行,您可以将其视为时间系统的一部分,处理程序将通过其侦听的时间调用进行操作。

       这对于运行任务后可能需要的“辅助”操作非常有用,例如在配置更改后安装或重新加载服务后启动新服务。

功能:使用handlers模块,创建任务,但并不会被直接执行,实在任务中调用执行,类似于软件开发中欧给的函数功能。

注:使用notify关键字调用handlers程序,而且notify不可以独立完成任务,需要跟在其他任务后。

示例:

- hosts: web
  become: yes
  become_user: root
  tasks:
    - name: an zhuang
      yum:
        name: httpd
        state: installed
      notify:
        jian wang ye			#调用下方的handlers的执行的操作
    - name: qi fu wu
      service:
        name: httpd
        state: restarted
  handlers:					#被上面notify调用
    - name: jian wang ye
      shell:
        'echo "www.daboluo.com" > /var/www/html/index.html'

ansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/XXX.yml

7.角色管理

  • 角色的功能:

           将剧本中需要定义的各个模块,如:handlers、files、变量等分别存放于不同的目录中,然后在task中组织任务部署的流程,方案。

  • 角色的优点:

            模块化、离散化编写复杂任务

            可支持的功能比单个task文件较为丰富,如:可创建文件模板,便于某服务的配置文件的统一化配置

  • 角色的创建:

            ansible-galaxy init NFS-test                 #创建角色,角色名为NFS-test

cd /etc/ansible/roles

ansible-galaxy init test		#创建角色,命名为test

cd files && mkdir d1

echo aaaa > d1/f1

cd ../tasks

vim main.yml
-name: copy d1
  copy:
    src: d1		#不用指定路径,他会自动到角色的目录下的files目录下找d1文件
    dest: /mnt/
    mode=644
    owner: root
    group: root

vim test.yml
- hosts: web
  roles:			#调用web_admin用户的所有任务
    - web_admin

ansible-playbook -i /etc/ansible/hosts tt.yml

8.事实

       在运行任何任务之前,Ansible将手机有关其配置的系统的信息,这些被成为事实,并且包括广泛的系统信息,如:CPU核心数量,可用的ipv4和ipv6网络,挂载的磁盘,Linux发行版等等。

       事实在“任务”或“模板”配置中通常很有用,例如在nginx的配置文件模块文件中设定与CPU核数一样的进程数。

user www-data:

worker_processes {{ ansible _processor_cores }};
    # 定义进程数

pid /var/run/nginx.pid;
    # 所有的ansible facts全局变量都是以“ansible_"为前缀,并且可以在其他任何地方使用。

ansible -m setup --connection=local localhost
    # 查看本机事实

ansible -i ./hosts remote -m setup
    # 查看远端事实(获取客户端信息)

示例:

ansible -i /etc/ansible/hosts web -m setup
    # 查看客户端信息

9.加密

       我们经常需要将敏感数据存储在我们的模板,文件或变量文件中,这样安全性由一定要求的情况时不可避免的。

        Ansible有一个j奥做Ansible Valult的解决方案

       Vault允许加密任何Yaml文件,通常用于将其作用与遍历啊ing文件,Vault不会加密文件和模板,只能加密Yaml文件。

       在创建加密文件时,系统会询问您必须使用的密码,以便稍后在调用角色或playbook时进行编辑。

参数:       
    create      #创建一个新文件并进行加密

    decrypt     #从加密文件创建明文文件

    edit        #编辑已经存在的加密文件

    encrypt     #加密现有的纯文本文件

    rekey       #在加密文件中设置新密码

示例:
ansible-vault create vars/main.yml
    # 创建一个新的变量文件,并加密。
    # 输入加密密码后,该文件将在默认编辑器(通常是vim或nano)中打开。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值