ansible命令执行过程
1 . 加载自己的配置文件 默认/etc/ansible/ansible.cfg
2 . 加载自己对应的模块文件,如command
3 . 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4 . 给文件+x执行
5 . 执行并返回结果
6 . 删除临时py文件,sleep 0退出
执行状态
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
ansible基本参数
ansible
-a //后面跟参数
—version //显示版本
—m module //指定模块,默认使用command模块
-v //显示详细过程 -vv -vvv 显示更详细
—list-hosts //显示主机列表,可简写-list
-k,—ask-pass //提示连接密码,默认key验证
-K,—ask-become-pass //提示输入sudo
-C,—check //检查命令,并不执行
-T,—timeout=TIMEOUT //执行命令的超时时间,默认10s
-u,—user=REMOTE_USER //执行远程操作的 执行的用户
-b,—become//代替旧版的sudo切换
示例:
ansible all -m command -u yunwei —become-user=root -a ‘ls /root’ -b -k -K
//以yunwei用户 sudo 到root用户 执行 ls /root
常用模块
File 文件模块
Copy 从主控端复制文件到远程主机
src : 源文件 指定拷贝文件的本地路径 (如果有/ 则拷贝目录内容,比拷贝目录本身)<br /> dest: 指定目标路径<br /> mode: 设置权限<br /> backup: 备份源文件<br /> content: 代替src 指定本机文件内容,生成目标主机文件<br />owner: 设置拥有者
- name: copy file
hosts: all
gather_facts: no
become: yes #设置是否以root用户执行操作
- name: copy files from local to remote
copy: #粘贴文件
src: /root/test.txt #当前机器文件路径
dest: /opt/test/test.txt #服务器文件路径
backup: yes #如果文件同名或者更改内容再粘贴时,创建一个备份
mode: 600 #设置权限位600
File 设置/创建文件
path: 要管理的文件路径 (强制添加)<br /> recurse: 递归,文件夹要用递归<br /> src: 创建硬链接,软链接时,指定源目标,配合'state=link' 'state=hard' 设置软链接,硬链接<br /> state: 状态<br /> absent: 缺席,删除<br /> owner: 设置拥有者<br /> mode: 设置权限
- name: create file
hosts: all
gather_facts: no
become: yes #设置是否以root用户执行操作
tasks:
- name: create a directory if it does not exits
file: #创建文件
path: /opt/test #设置路径
state: directory #文件类型为文件夹 touch 是文件
ansible all -m file -a 'path=/app/test.txt state=touch' #创建文件
ansible all -m file -a 'src=/data/testfile dest=/data/testfile-link state=link' #创建软链接
- name: file module
hosts: all
gather_facts: no
become: yes #设置是否以root用户执行操作
tasks:
- name: create a directory if it does not exits
file: #创建文件
path: /opt/test #设置路径
state: directory #文件类型为文件夹 touch 是文件
- name: copy files from local to remote
copy: #粘贴文件
src: /root/test.txt #当前机器文件路径
dest: /opt/test/test.txt #服务器文件路径
backup: yes #如果文件同名或者更改内容再粘贴时,创建一个备份
mode: 600 #设置权限位600
template 创建模板
基础模板
使用的jinja语法
vim site.yml
- name: file module
hosts: all
gather_facts: no
become: yes
tasks:
- name: test template
template: #使用模板模块
src: ../templates/test.j2
dest: /opt/test/test.cfg
mkdir templates #创建模板文件夹
vim test.j2 #创建cfg模板
[default]
http_port = {{http_port}} #取出host文件中的变量
ansible-playbook site.yml #运行
vim test.j2 #创建cfg模板
[default]
http_port = {{http_port}}
[demo]
{% for id in range(201,211) %}
{{ host_prefix }}{{ "%02d" | format(id-200) }} = {{ ip_prefix }}{{ id }}
{% endfor %}
Unarchive 文件解压
1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes.<br /> 2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no<br />**copy=yes 当前主机压缩包到远程,copy=no 远程主机解压到远程**
copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,<br /> 如果设置为copy=no,会在远程主机上寻找src源文件<br /> src: 源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,<br /> 如果是远程主机上的路径,则需要设置copy=no<br /> dest:远程主机上的目标路径<br /> mode:设置解压缩后的文件权限
- name:
unarchive: #根据后缀进行解压
src: /root/Python-3.10.4.tgz #文件路径
dest: /usr/local/ #解压位置
remote_src: yes #是否使用的是服务器目录,默认是no,no就是使用本地路径文件,用本地就无须下载。
Fetch 远程拉取文件
- name: fetch
hosts: all
become: yes
tasks:
- name: fetch a file
fetch: #调用远程拉取模块
src: /etc/passwd #服务器的路径
dest: ./tmp/ #当前路径
flat: yes #是否创建文件夹
Archive 打包压缩
将远程主机目录打包 <br /> path: 指定路径<br /> dest: 指定目标文件<br /> format: 指定打包格式<br /> owner: 指定所属者<br /> mode: 设置权限
- name: archive
hosts: all
gather_facts: no
tasks:
- name: archive
archive: #设置打包压缩
path: /etc/passwd #设置文件/设置文件夹
dest: /opt/test.tar.bz2 #压缩包位置
format: bz2 #设置压缩格式
System 系统模块
ping和get_facts
ping 上面演示过,这里就不错演示
ansible all -m gather_facts #获取机器中的全部参数,API。其中包含的参数非常多
ansible all -m gather_facts --tree ./facts #创建一个文件夹,会将打印的参数,添加到文件中。文件名就是设置的hosts名称
#其中的变量,也是无需我们创建,能够直接访问的变量,此时我们来调用一下
vim site.yml
- name: file module
hosts: all
#gather_facts no #一定不要写这个,否则这些参数就无法使用了。
become: yes
tasks:
- name: print facts
debug:
msg: "{{ ansible_date_time }}"
- name: print ipv4
debug:
msg: "{{ ansible_default_ipv4 }}"
User的添加与删除
home 指定家目录路径<br /> system 指定系统账号<br /> group 指定组<br /> remove 清除账户<br /> shell 指定shell类型
ansible all -m user -a 'name=liao comment="创建liao" uid=2048 home=/home/liao1 group=root'
#创建用户为liao 设置注释 uid设置为2048 home目录为/home/liao1 组为root
tasks:
- name: create system user
user:
name: sysuser1
state: yes #指定是否为系统账号
home: /app/sysuser1
- name: create users
user:
name: app
uid: 88
system: yes #是否为系统用户
home: /home/app
groups: root
shell: /sbin/nologin #设置为nologin
passwd: "{{ 'appuser1' | password_hash('sha512') }}" #设置密码
- name: remove user
user:
name: liao
state: absent
remove: yes
安装mkpasswd <br /> yum insatll expect <br /> mkpasswd 生成口令<br /> openssl passwd -1 生成加密口令
Group的创建与删除
- name: group manager
hosts: all
become: yes
tasks:
- name: create group
group: #调用组模块
name: liao118235 #组名称
state: present #状态为创建
- name: delete group
group: #调用组模块
name: liao118235 #组名称
state: absent #状态为删除
ansible-playbook site.yml #执行
ansible all -m shell -a "tail /etc/passwd" #查看用户
ansible all -m shell -a "tail /etc/group" #查看组
Service 服务的启动与关闭
- name: install nginx and start nginx
hosts: all
become: yes
tasks:
- name: install package
yum:
name:
- epel* #安装epel工具包
state: present
- name: install nginx
yum:
name:
- nginx #安装nginx
state: present
- name: start nginx
service: #使用service模块
name: nginx
enabled: yes #是否设置开机自启
state: started #启动nginx
- name:
service:
name: nginx
state: stopped
- 重载 reloaded
- 重新启动 restarted
- 启动 started
- 停止 stopped
Hostname 管理主机名
ansible appsrvs -m hostname -a "name=app.adong.com" #更改一组的主机名
ansible 192.168.38.103 -m hostname -a "name=app2.adong.com" #更改单个主机名
Cron 计划任务
支持时间:minute,hour,day,month,weekday
name: 任务计划名称
cron_file: 替换客户端该用户的任务计划的文件
minute: 分(0-59, ,/2)
hour: 时(0-23, ,/2)
day: 日(1-31, ,/2)
month: 月(1-12, , /2)
weekday: 周(0-6或1-7, *)
job: 任何计划执行的命令,state要等于present
backup: 是否备份之前的任务计划
user: 新建任务计划的用户
state: 指定任务计划present、absent
ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime" #创建任务
ansible all -m cron -a 'state=absent name=Synctime' #删除任务
ansible all -m cron -a 'minute=*/10 job='/usr/sbin/ntpdate 172.30.0.100" name=synctime disabled=yes"
#注释任务,不在生效
Package 包模块
Yum安装工具
- name: yum Install
hosts: all
become: yes
tasks:
- name: yum install
yum: #调用yum模块
name: git #安装单个包git
state: present #状态为创建
- name: yum unstall
yum:
name: git
state: absent #状态为删除
- name: yum install more
yum:
name: {{packages}}
vars: #安装多个包
packages: #配置一个变量,方便管理
- httpd
- http-tools
- name: rpm install url
yum:
name: https://artifacts.elastic.co/downloads/kibana/kibana-6.0.0-x86_64.rpm #以网站的形式下载并安装rpm包
stats: present
- name: rpm install path
yum:
name: /root/kibana-6.0.0-x86_64.rpm #从路径查询包并安装
stats: present
- name: upgrade all packages
yum:
name: '*' #更新所有的包
state: latest
apt安装工具
用法其实和yum差不多,我们只看当服务器有centos和ubuntu时,需要分开使用命令的情况
- name: yum Install
hosts: all
become: yes
tasks:
- name: yum install
yum: #调用yum模块
name: git #安装单个包git
state: present #状态为创建
when: ansible_faces["distribution"] == 'CentOS' #判定是否为Centos
- name: apt get
apt:
name: git
state: present #状态为创建
when: ansible_faces["distribution"] == 'Ubuntu' #判定是否为Ubuntu
package 自动选择合适的安装命令
模块会自动识别服务器的发行版版本,进行不同的命令安装。
但是,部分包名称并不是一样的,所以还是需要进行上面的单独写。
- name: package module
hosts: all
become: yes
tasks:
- name: yum install
package:
name: git
state: present
force_apt_get: yes #强制使用apt get
pip安装
- name: install python3
hosts: all
become: yes
tasks:
- name: yum install python
package:
name: #安装python3和一些工具包
- python3
- python3-devel
- python3-pip
- python-setuptools
state: present
- name: yum install python
pip:
name: flask #需要安装的包
#requirements: ~/flask-ansible-demo/requirements.txt #设置以文件-r 拉取pip包
virtualenv: /root/vir/ #虚拟环境路径
virtualenv_command: /usr/bin/python3 -m venv #进入虚拟路径的命令
git
拉取
- name: get git
git:
repo: 'https://github.com/xiaopeng163/flask-ansible-demo' #填写git仓库的网址
dest: ~/flask-ansible-demo #拉取到后 存放位置
Net tools 模块
get_url 通过url下载文件
- name: download tar.gz
hosts: all
become: yes
tasks:
- name: download python
get_url:
url: https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tgz #填写下载地址
dest: /root/ #下载路径
checksum: md5:7011fa5e61dc467ac9a98c3d62cfe2be #检查md5
- name:
unarchive: #根据后缀进行解压
src: /root/Python-3.10.4.tgz #文件路径
dest: /usr/local/ #解压位置
remote_src: yes #是否使用的是服务器目录,默认是no,no就是使用本地路径文件,用本地就无须下载。
uri 查看访问网页参数
- name: curl web
hosts: all
become: yes
tasks:
- name: check
uri: #调用uri
url: http://www.example.com #设置访问网页
return_content: yes #设置是否返回网页内容
register: result #注册返回值
- debug:
var: result #输出返回值
Command 命令模块
Command 命令模块
前面演示了shell命令的使用,shell模块与command模块的区别是,shell模块可以引用变量和使用一些比较符号。command模块建议使用一些单行命令
- name: use command
hosts: all
become: yes
tasks:
- name:
command: cat /etc/passwd #执行的命令
register: passwd_list #注册返回值,将命令的输入赋值到该变量中,此时变量就可以被引用了。
- debug:
msg: "{{passwd_list}}" #打印出返回值
Shell 命令模块
ansible all -m shell -a 'getenforce' #查看SELINUX状态
ansible all -m shell -a "sed -i 's/SELINUX=.*/SELINUX=disabled' /etc/selinux/config" #修改SELINUX
vim /etc/ansible/ansible.cfg
module_name = shell #修改配置文件,使shell作为默认模块
ansible all -a 'cat /etc/passwd'
调用bash执行命令,可能依然出现错误,所以建议写到脚本时,copy到远程执行,再把需要的结果拉回执行命令的机器
vim /etc/ansible/ansible.cfg
module_name = shell #修改配置文件,使shell作为默认模块
Script 脚本模块
在远程主机上运行ansible服务器上的脚本
ansible all -m script -a /tmp/data.sh #将当前服务器data.sh脚本咋在其他服务器上运行
Ansible Vault 加密
对文件进行加密解密
- encrypt 加密
- decrypt 解密
- view 查看
- edit 编辑
ansible-vault encrypt /root/inventory/group_vars/all.yml #加密文件,设置密码
ansible-vault decrypt /root/inventory/group_vars/all.yml #解密文件,输入密码解密
ansible-vault view /root/inventory/group_vars/all.yml #输入密码,查看加密文件
ansible-vault edit /root/inventory/group_vars/all.yml #输入密码,修改加密文件
ansible-playbook site.yml --ask-vault-pass #执行加密的playbook
对变量进行加密
ansible-vault encrypt_string "mly118235" --name "ansible_password"
ansible_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
35626230313763323934623130636436666661396338616664303962383733663861656432316662
3631633730303232326138643162316364306239303238620a336637313737353732323138633866
33323665393036316138353633336234636132616238646137633263376462393965393538336462
6632373263333938360a313564666539346437363634373239363966383639306632353538383530
3962
#只需将这段代码覆盖掉 ansible_password: mly118235 即可!
#加密了执行时,需要输入密码
set_fact 模块
自定义
自定义变量,或者将获取的参数设置为变量。
- name: file module
hosts: all
become: yes
tasks:
- name: set facts
set_fact: #创建fact
LiAo_Name: 'LiAo' #创建key
- debug:
var: LiAo_Name #打印输出key
设置系统变量
- name: file module
hosts: all
become: yes
tasks:
- name: command get hosts
command: cat /etc/hosts #执行命令
register: host_results #注册返回值
- name: set facts
set_fact: #创建fact
Ip_Host: "{{host_results['stdout_lines']}}" #创建key,设置值
- debug:
var: Ip_Host #打印值