Ansible 安装与使用
目录
一.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
更多推荐
所有评论(0)