目录

一.Ansible 的安装

二.Ansible 的使用

Ansible命令行

三. PlayBook 的使用


一.Ansible 的安装

1. #使用yum源安装

yum -y install ansible

ansible --version

二.Ansible 的使用

Ansible命令行

1. # ansible只能管理被管理过的文件

ansilbe all -i /etc/ansible/hosts -m 模块 -a '参数' -e '传参'

2. # command和shell模块  都是执行命令的模块,默认使用command,shell可以使用特殊符号(| > $)

ansible all -i /etc/ansible/hosts -m command -a "echo hello"                # 使用command模块
ansible all -i /etc/ansible/hosts -m shell -a "echo hello | grep -o 'e'"    # 使用shell模块

3. # copy模块 将管理节点的文件拷贝到被管理节点主机上

ansible all -i /etc/ansible/hosts -m copy -a "src=/etc/nginx/conf/nginx.conf dest=/etc/nginx/conf/nginx.conf"
src   # 管理节点主机上的路径
dest  # 被管理节点主机上的路径

4. # script模块 将管理节点上的脚本在被管理节点上执行

ansible all -i /etc/ansible/hosts -m script -a "/opt/a.sh"  # 本地/opt下脚本在被管理节点上执行

5. # yum_repository模块    在被管理节点上创建yum源仓库

ansibel all -i /etc/ansible/hosts -m yum_repository -a "name=epel baseurl='https://download.fedoraproject.org/pub/epel/#releserver/$basearch/' description='epel yum repo'"
name         # 仓库名         必须的参数
baseurl      # yum仓库的URL   必须的参数
description  # 仓库的描述     必须的参数
file         # 保存仓库的名字 不含repo后缀
state        # present 确认添加   absent 确认删除
gpgcheck     # 是否检查gpg

6. # yum模块   在被管理节点上安装rpm包

ansibel all -i /etc/ansible/hosts -m yum -a "name=nginx state=present"
name           # 要操作的rpm包名
state: 
  presnet    # 安装但不升级
  installed  # 安装
  latest     # 安装最新
  absent     # 删除
  removed    # 删除

7. # systemd模块     管理远程节点的systemd服务

ansibel all -i /etc/ansible/hosts -m systemd -a "name=nginx enabled=yes state=restarted"
name           # 被操作的服务名
enabled        # 开机自启  yes|no
deamon_reload  # 重载systemd
state: 
  started      # 启动
  stopped      # 停止
  restarted    # 重启
  reloaded     # 重载

8. # group模块  创建组

name   # 组名
system # 是否为系统组  yes|no
state  # present 创建    absent 删除

9. # user模块   创建用户

name   # 用户名
group  # 加入的组
home   # 家目录
shell  # 使用的shell

10. # file模块  在被管理节点上创建文件

ansibel all -i /etc/ansible/hosts -m  file -a "path='/opt/test/test1.txt' owner=appuser group=appuser mode=0755 state=touch"
owner         # 定义文件的所有者
group         # 定义文件的所属组
mode          # 定义文件的权限
path          # 定义文件的路径
state: 
  directory   # 目录不存在则创建
  file        # 检查文件是否存在
  touch       # 创建文件
  absent      # 删除文件

11. # cron模块   管理远程节点的计划任务

注意:使用ansible创建的cron任务 不能使用cron -e编辑 否则ansible将无法再次操作
ansibel all -i /etc/ansible/hosts -m cron -a "name='cat memory' minute='59' hour='8' day='*' month='*' weekday='*' job='free -mh | echo ' state=present"
name      # 定时任务的名字
minute    # 分
hour      # 时
day       # 天
month     # 月
weekday   # 星期
job       # 定时任务执行的内容
state     # present 新增   absent 删除

12. # debug模块  用于调试,将变量的值打印出来

ansibel all -i /etc/ansible/hosts -m debug -a "var=t1" -e "t1=test1"
ansibel all -i /etc/ansible/hosts -m debug -a "msg=this is a {{t1}}"  -e "t1=test1"
var  # 打印单个 指定变量的 值
msg  # 打印一段 可以格式化的 字符串

13. # template模块   将传递给ansible的变量替换到模板文件中,然后将模板文件拷贝给被管理服务器

cat hello_world.j2
hello  {{var}} !
ansible all -i /etc/ansible/hosts -m template -a "src=hello_world.j2 dest=/tmp/hello_world.text" -e "var=world"
src       # 源文件路径
dest      # 目标文件路径

14. # lineinfile模块   在被管理节点上,用正则匹配对目标文件的一行内容进行修改删除等操作

ansibel all -i /etc/ansible/hosts -m lineinfile -a "path=/etc/passwd state=absent regexp='^appuser'"   # 删除
ansibel all -i /etc/ansible/hosts -m lineinfile -a "path=/etc/selinux/config  regexp='^SELINUX=' state=present line='SELINUX=disabled' " # 替换 
path    # 被管理节点文件路径
state   # present 替换    absent删除
regexp  # 正则表达式
line    # 在文件中要插入/替换的内容,需要state=present
create  # 文件不存在时是否创建 yes/no

三. PlayBook 的使用

1. # playbook中可以使用的格式,playbook.yml 属于yml文件

格式一:
service: name=nginx enabled=true state=statrted
格式二:
service: name=nginx
         enabled=true
		 state=started
格式三:
service: name: nginx
         enabled: true
		 state: started

2. # 使用ansible安装nginx  单个play

---                                               # 开始符
- name: install nginx playbook                    # 单个play的名字
  hosts: all                                      # 被管理主机
  remote_user: appuser                            # 被管理主机上使用的用户
  tasks:                                          # 任务合集
    - name: install nginx                         # 第一个子任务的名字
	  yum: name: nginx                            # 第一个子任务使用的模块: 模块参数
	       state: present                         # 第一个子任务使用的参数
	- name: copy nginx.conf                       # 第二个子任务的名字
	  copy: src: "/etc/nginx/conf/nginx.conf"     # 第二个子任务使用的模块: 模块参数
	        dest: "/etc/nginx/conf/nginx.conf"    # 第二个子任务使用的参数
	- name: start nginx                           # 第三个子任务的名字
	  service: name: nginx                        # 第三个子任务使用的模块: 模块参数
	           enabled: true                      # 第三个子任务使用的参数
			   state: started                     # 第三个子任务使用的参数
...                                               # 结束符

3. # 常用的属性

name          # play的名字
hosts         # 被管理的主机
remote_user   # 被管理主机上执行操作的用户
tasks         # 任务合集
become        # 提权=sudo
become_user   # 提权到哪个用户
vars          # 定义变量
vars_files    # 使用文件内的变量

4. # 运行playbook

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

 # playbook的yml文件语法结构校验

ansible-playbook  -i /etc/ansible/hosts playbook.yml --syntax-check

# 单步调试playbook

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

 # 运行测试   -C

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

5. # Ansible变量   {{变量名}}

使用 -e 参数进行传参。使用变量文件:-e @变量文件名

echo {"test1": "测试1","test2": "测试2"} > a.json
ansible all -i /etc/ansible/hosts -m debug -a "msg='t1 is {{test1}}','t2 is {{test2}}'"  -e @a.json

6. # 剧本变量

在playbook中使用变量,使用vars  vars_files

# 在playbook中使用 vars 定义变量并使用变量

vars:                       # 使用vars属性
  user: appuser             # 定义user变量
  home: /userhome/appuser   # 定义home变量
tasks: 
  - name: create user
    user:                   # 使用user模块
	  name: '{{user}}'      # name参数使用了user变量
	  home: '{{home}}'      # home参数使用了home变量

# 在playbook中使用vars_files变量

echo {"test1": "测试1","test2": "测试2"} > /opt/a.json

vars_files:                 # 使用vars_files属性
  - /opt/a.json             # 使用变量文件
tasks: 
  - name: this is a test1 
    user:                   # 使用user模块
	  name: '{{test1}}'     # name参数使用了变量文件里的变量
      home: '{{test2}}'     # home参数使用了变量文件里的变量

7. # 资产变量 

针对主机的变量

cat /etc/ansible/hosts
[db]
192.168.10.10 age=18 name=lili port=3309   # 针对单台主机添加变量
192.168.10.11
[db:vars]
home="/userhome/lili"                      # 针对db组里所有主机添加变量
单台主机变量优先与vars变量

内置变量
ansible_ssh_host  # 要连接的主机名
ansible_ssh_port  # ssh的端口
ansible_ssh_user  # ssh的用户

8. # Facts变量

setup模块收集的被管理服务器的操作系统版本、IP、主机、C盘、内存、cpu等情况。执行playbook前会执行facts变量

ansible all -i /etc/ansible/hosts -m steup -a "fileer=*memory*"

9. # 注册变量

register 将上一个结果作为条件

tasks:                      
  - name: install nginx      # 定义任务名 
    yum: name: nginx         # 使用yum模块安装nginx
	     state: present      
	register: install_nginx  # 将安装结果赋予install_nginx变量
  - name: print register     # 定义任务名
    debug: install_nginx     # 打印install_nginx变量的值

10. # 变量优先级

-e参数(全局变量) > 剧本变量(playbook.yml) > 资产变量(主机变量)

四. Ansible 的任务

类似与编程语言中的if...for...等逻辑控制语句

1. # 条件判断 和 循环

判断:使用when关键字 支持运算符(== != > < >= <= true fales and or)

循环:关键字只能时item 使用loop/with_items执行循环的列表

cat playbook.ytml
- name: item test              
  hosts: all                    
  gather_facts: no              
  vars:                        # 变量合集
    some_list:                 # 定义some_list变量列表
	  - "a"                    # 变量a
	  - "b"                    # 变量b
	  - "c"                    # 变量c
	num_list:                  # 定义num_list变量列表
	  - 1                      # 变量1
	  - 2                      # 变量2
	  - 3                      # 变量3
	  - 4                      # 变量4
	  - 5                      # 变量5
  tasks:                       # 任务合集
    - name: some_list          
	  debug:                   
	    var: "{{item}}"        # 打印some_listde变量
	  loop: "{{some_list}}"    # 执行循环变量列表
	- name: num_list           
	  debug:                    
	    var: "{{item}}"        # 打印num_list变量
	  loop: "{{num_list}}"     # 执行循环变量列表
	  when item > 3            # 当变量大于3的才打印num_list变量

2. # tags 添加标签

ansible-playbook  -i /etc/ansible/hosts playbook.yml -t install  # -t指定只执行含install标签的

tasks:                      
  - name: install nginx     
    yum: name: nginx        
	     state: present     
	register: install_nginx 
	tags: install                  # 添加install标签
  - name: print register    
    debug: install_nginx   

3. # jinjia2  相当与函数合集

三种定界符

注释:    {{# 注释内容 #}}

变量引用:{{ var }}

逻辑表达:{{%   %}}

4. # Roles 角色 也就是目录

将playbook分解成一个个小的逻辑单元 便于维护

https://galaxy.ansible.com   # roles的网站

anisble-galaxy install  xxx  # 下载别人的roles

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐