ansible

安装ansible

yum install epel-release -y
yum install ansible -y
如果被控主机密码不同,则需要做ssh-keygen和ssh-copy-id到被控主机

ansible配置文件

主配置文件说明:

主配置文件ansible.cfg(主配置文件的内容可以参考/etc/ansible/ansible.cfg)

ansible配置文件查找顺序

首先检测ANSIBLE_CONFIG变量定义的配置文件(默认没有这个变量)

其次检查当前目录下的./ansible.cfg文件

再次检查当前用户家目录下~/ansible.cfg文件

最后检查/etc/ansible/ansible.cfg文件

推荐使用默认的/etc/ansible/ansible.cfg文件

默认配置
这里的配置项有很多,这里主要介绍一些常用的
[defaults]
#inventory      = /etc/ansible/hosts                        #被控端的主机列表文件
#library        = /usr/share/my_modules/                    #库文件存放目录
#remote_tmp     = ~/.ansible/tmp                            #临时文件远程主机存放目录
#local_tmp      = ~/.ansible/tmp                            #临时文件本地存放目录
#forks          = 5                                         #默认开启的并发数
#poll_interval  = 15                                        #默认轮询时间间隔(单位秒)
#sudo_user      = root                                      #默认sudo用户
#ask_sudo_pass = True                                       #是否需要sudo密码
#ask_pass      = True                                       #是否需要密码
#transport      = smart                                     #传输方式
#remote_port    = 22                                        #默认远程主机的端口号

建议开启修改以下配置参数(取消掉注释即可)
#host_key_checking = False                                  #检查对应服务器的host_key
#log_path=/var/log/ansible.log                              #开启ansible日志
#inventory      = /etc/ansible/hosts
#remote_tmp     = ~/.ansible/tmp
#local_tmp      = ~/.ansible/tmp
#forks          = 300
#ask_sudo_pass = True
#remote_port    = 22

取消启用警告
deprecation_warnings = False

提权
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

ansible的hosts文件配置

/etc/ansible/hosts

常用参数配置:
    ansible_ssh_host                    # 目标主机地址
    ansible_ssh_port                    # 目标主机端口,默认22
    ansible_ssh_user                    # 目标主机用户
    ansible_ssh_pass                    # 目标主机ssh密码
    ansible_sudo_pass                 	# sudo密码
    ansible_sudo_exe                    
    ansible_connection               	# 与主机的连接类型,比如:local,ssh或者paramiko
    ansible_ssh_private_key_file  		# 私钥地址
    ansible_shell_type                 	# 目标系统的shell类型
    ansible_python_interpreter   		# python版本

例1:

[test]
192.168.0.111							#也可以这样写192.168.0.[111:112]
192.168.0.112

[test:vars]
ansible_become=true
ansible_ssh_port=22
ansible_ssh_user="zzy"
ansible_ssh_pass="1qaz@WSX"				#需要所有主机的密码是一样的
ansible_sudo_pass="1qaz@WSX"

例2:

[test1]
192.168.0.111

[test2]
192.168.0.112

[group:children]						#嵌套组
test1
test2

[group:vars]
ansible_become=true
ansible_ssh_port=22
ansible_ssh_user="zzy"
ansible_ssh_pass="zzyaiziji520"
ansible_sudo_pass="zzyaiziji520"

测试连通性

ansible all -m ping
ansible 192.168.0.111 -m ping					#可以指定hosts文件中的其中一台主机

常用命令

ansible all --list-hosts
ansible all -m ping

模块

ansible-doc获取帮助

ansible-doc -l							#列出所有模块
ansible-doc -l | grep yum            	#在所有模块中过滤关键词
ansible-doc yum                      	#查看模块帮助

command模块(默认模块)

ansible all -m command -a 'uptime'
等同于
ansible all -a 'uptime'

shell模块

command和shell模块的区别,command不支持bash的特性,如管道、重定向和&等功能,但是shell模块可以支持。

不可以使用shell模块执行交互命令,如vim、top等。

ansible all -m shell -a  "ps aux | wc -l"       #进程数量
ansible all -m shell -a  "who"                  #登陆信息
ansible all -m shell -a  "touch /tmp/txt.txt"  	#使用shell模块创建文件会有Warning警告提示,正常!!!

script模块

script模块会把-a后面的脚本拷贝到被管理端主机,然后执行这个脚本,不需要x权限。

ansible  all  -m script  -a  "./test.sh"    
#-a后面的./test.sh是上面创建脚本的相对路径和文件名
#./是当前目录的意思,在当前目录下有个脚本叫test.sh

幂等性

幂等性:任意次执行所产生的影响均与一次执行的影响相同。

command、shell、script模块缺点:不支持幂等性。

file模块

file模块可以创建文件、目录、链接;修改权限与属性等(ansible-doc file)

ansible  all  -m  file  -a  "path=/tmp/file.txt state=touch"         
#远程所有主机,新建文件,path后面指定要创建的文件或目录的名称
#state=touch是创建文件,state=directory是创建目录
ansible  all  -m  file  -a  "path=/tmp/mydir state=directory"
#创建目录
ansible  all  -m  file 	-a  "path=/tmp/file.txt owner=sshd group=adm mode=0777" 
#修改文件或目录权限(0777中第一个0代表的是无特殊权限,如SUID、SGID等)
ansible all -m file -a "path=/tmp/mydir state=absent"
#state=absent代表删除(删除目录)
ansible all -m file -a "path=/tmp/file.txt state=absent"
# state=absent代表删除(删除文件)
ansible all -m file -a "src=/etc/hosts  path=/tmp/host.txt state=link"
#给/etc/hosts文件创建一个链接文件/tmp/host.txt(src指定源文件,path是软链接文件名)
#相当于执行命令 ln -s  /etc/hosts  /tmp/host.txt

copy模块

copy模块可以将文件拷贝到远程主机 (ansible-doc copy)。

ansible all -m copy -a "src=~/1.txt dest=/root/"
#把管理端本机的a3.txt文件,拷贝到test组中所有主机的/root/目录
#src代表源文件,dest代表目标文件

fetch模块

fetch模块与copy类似,但是作用相反,可以将其他主机的文件拷贝到本地(ansible-doc fetch)。

ansible all -m copy -a "src=~/1.txt dest=/root/"
#把管理端本机的a3.txt文件,拷贝到test组中所有主机的/root/目录
#src代表源文件,dest代表目标文件

lineinfile|replace模块

在修改单个文件的单行内容时可以使用lineinfile模块(ansible-doc lineinfile)。

ansible all -m lineinfile -a "path=/etc/issue line='hello world'"
#在/etc/issue文件中添加一行内容hello world,默认添加到最后,line后面跟的是需要添加的文件内容

ansible all -m lineinfile -a 'path=/etc/selinux/config regexp="^SELINUX=" line="SELINUX=disabled"'
#将/etc/selinux/config文件中的以SELINUX开头的行替换(regexp是启用正则表达式)

lineinfile会替换一整行,replace可以替换关键词(ansible-doc replace)。

ansible all -m replace -a "path=/etc/issue.net regexp=Kernel replace=Ocean"
#将/etc/issue.net文件全文所有的Kernel替换为Ocean
#regexp后面是需要替换的旧内容;replace后面是需要替换的新内容

ansible all -m replace -a 'path=/root/test.txt regexp="^(.+)$" replace="# \1"'
#将/root/test.txt文件中所有行加注释

user模块

user模块可以实现Linux系统账户管理(ansible-doc user)。

ansible all -m user -a "name=tom"
#远程所有主机并创建系统账户tom,默认state的值为present,代表创建用户

ansible all -m user -a "name=jerry uid=1010 group=adm groups=daemon,root home=/home/jerry"
#创建账户并设置对应的账户属性,uid指定用户ID号,group指定用户属于哪个基本组
#groups指定用户属于哪些附加组,home指定用户的家目录

ansible all -m user -a "name=tom password={{'abc'| password_hash('sha512')}}"
#修改账户密码,用户名是tom,密码是abc,密码经过sha512加密

ansible all -m user -a "name=tom state=absent"
#删除账户tom,state=absent代表删除账户的意思,name指定要删除的用户名是什么
#账户的家目录不会被删除,相当于执行userdel tom

ansible all -m user -a "name=jerry state=absent remove=true"
#删除jerry账户同时删除家目录、邮箱,相当于执行userdel  -r  jerry

yum_repository模块

使用yum_repository可以创建或修改yum源配置文件(ansible-doc yum_repository)。

ansible test -m yum_repository -a "file=myyum name=myyum description=hello baseurl=ftp://192.168.4.254/centos gpgcheck=no"
#新建一个yum源配置文件/etc/yum.repos.d/myyum.repo
#yum源文件名为myyum,该文件的内容如下:
[myyum]
baseurl = ftp://192.168.4.254/centos
gpgcheck = 0
name = hello

ansible test -m yum_repository -a "file=myyum name=myyum description=test baseurl=ftp://192.168.4.254/centos gpgcheck=yes gpgkey=…"
#修改yum源文件内容

ansible test -m yum_repository -a "file=myyum name=myyum state=absent"
#删除yum源文件myyum

yum模块

使用yum模块可以安装、卸载、升级软件包(ansible-doc yum),state: present(安装)|absent(卸载)|latest(升级)。

ansible test -m yum -a "name=unzip state=present"
#安装unzip软件包,state默认为present,也可以不写
## 验证:到被控主机执行命令rpm -q unzip查看是否有该软件

ansible test -m yum -a "name=unzip,httpd state=present"
#可以同时装多个软件

ansible test -m yum -a "name=unzip state=latest"
#升级unzip软件包,软件名称可以是*,代表升级所有软件包

ansible test -m yum -a "name=unzip state=absent"
#调用yum模块,卸载unzip软件包,state=absent代表卸载软件

service模块

service为服务管理模块(启动、关闭、重启服务等),

state:started|stopped|restarted,

enabled:yes设置开机启动。

ansible test -m yum -a "name=httpd"
#调用yum模块,安装httpd软件包

ansible test -m service -a "name=httpd state=started"
#调用service模块,启动httpd服务

ansible test -m service -a "name=httpd state=stopped"
#调用service模块,关闭httpd服务

ansible test -m service -a "name=httpd state=restarted"
#调用service模块,重启httpd服务

ansible test -m service -a "name=httpd enabled=yes"
#调用service模块,设置httpd服务开机自启

parted模块

用于磁盘分区

ansible test -m parted -a "device=/dev/sdb number=1 state=present part_start=1MiB part_end=3GiB"
#为/dev/sdb创建编号为1的分区(第一个分区),part_start为分区开始的位置,part_end为结束的位置

ansible test -m parted -a "device=/dev/sdb number=1 state=absent"
#删除分区

逻辑卷相关模块(lvg、lvol)

提示:做实验之前需要给对应的虚拟机添加额外磁盘,并创建磁盘2个分区

提示:可以使用前面学习过的parted或fdisk命令给磁盘创建分区

提示:这里的磁盘名称仅供参考,不要照抄!!!

lvg模块:创建、删除卷组(VG),修改卷组大小,

state:present(创建)|absent(删除)。

ansible test -m yum -a "name=lvm2"
#安装lvm2软件包,安装了lvm2软件后,才有pvcreate、vgcreate、lvcreate等命令

ansible test -m lvg -a "vg=myvg pvs=/dev/vdb1"
#创建名称为myvg的卷组,该卷组由/dev/vdb1组成
#注意:这里的磁盘名称要根据实际情况填写

ansible test -m lvg -a "vg=myvg pvs=/dev/vdb1,/dev/vdb2"
#修改卷组大小,往卷组中添加一个设备/dev/vdb2

lvol模块:创建、删除逻辑卷(LV),修改逻辑卷大小,

state:present(创建)|absent(删除)。

ansible test -m lvol -a "lv=mylv vg=myvg size=2G"
#使用myvg这个卷组创建一个名称为mylv的逻辑卷,大小为2G
## 验证:到被控主机执行命令lvs查看是否有对应的LV逻辑卷

ansible test -m lvol -a "lv=mylv vg=myvg size=4G"
#修改LV逻辑卷大小

ansible test -m lvol -a "lv=mylv vg=myvg state=absent force=yes"
#删除逻辑卷,force=yes是强制删除

ansible test -m lvg -a "vg=myvg state=absent"
#删除卷组myvg

filesystem

格式化逻辑卷

ansible test -m filesystem -a "fstype=xfs dev=/dev/myvg/mylv"

mount模块

挂载和卸载,并写进fstab文件中,完成开机自动挂载(present|mounted|unmounted|absent)

ansible test -m mount -a "src=/dev/mapper/myvg-mylv path=/mnt fstype=xfs state=mounted"
#挂载并写进fstab文件中

ansible test -m mount -a "src=/dev/mapper/myvg-mylv path=/mnt fstype=xfs state=present"
#将mount写进fstab文件中,不挂载

ansible test -m mount -a "src=/dev/mapper/myvg-mylv path=/mnt fstype=xfs state=unmounted"
#卸载,不删除fstab文件中的mount信息

ansible test -m mount -a "src=/dev/mapper/myvg-mylv path=/mnt fstype=xfs state=absent"
#卸载并删除fstab文件中的mount信息,如果mount点非空会报错,但实际上已经卸载

Playbook

Ansible ad-hoc可以通过命令行形式远程管理其他主机,适合执行一些临时性简单任务。另外还有一种远程管理的方式叫Playbook,Ansible Playbook中文名称叫剧本,它将经常需要执行的任务写入一个文件,这个文件就叫剧本。

编写yaml文件之前的设置(可选)

默认一个tab键是8个空格,不方便,可以修改

  • 按tab键跳2个空格
  • 自动缩进
  • 将tab转换为空格
cat > ~/.vimrc <<EOF
set ai
set ts=2
set et
EOF

编写第一个Playbook(剧本)

hosts、tasks、name是关键词(不可修改),ping是模块,调用不同模块完成不同任务。

vim /etc/ansible/test.yaml 
---
- hosts: all                                #hosts定义要远程谁?
  tasks:                                    #tasks定义远程后要执行的任务有哪些?
    - name: This is my first playbook     #name后面的具体内容可以任意
      ping:

运行playbook:
ansible-playbook /etc/ansible/test.yml

例2:

在test组中创建/tmp/demo目录,权限755,将本机的/etc/hosts拷贝到目标主机的/tmp/demo中

- name: create dir and copy file
  hosts: test
  tasks:
    - name: create
      file: path=/tmp/demo state=directory mode=0755
      
    - name: copy
      copy: src=/etc/hosts dest=/tmp/demo/

例3:

在test组中安装lamp,并启动服务

- name: deploy lamp
  hosts: test
  tasks:
    - name: install lamp
      yum: name=httpd,mariadb,mariadb-server,mariadb-devel,php,php-mysql

    - name: start httpd
      service: name=httpd state=started enabled=yes

    - name: start mariadb
      service: name=mariadb state=started enabled=yes

例4:

创建用户tom

- name: add user
  hosts: test
  tasks:
    - name: add user tom
      user: name=tom password={{ '123' | password_hash('sha512') }}

例5:

给/dev/sdb磁盘分一个2G的分区sdb1,做成卷组,创建逻辑卷,格式化并挂载到/mnt下

- name: create lvm
  hosts: test
  tasks:
    - name: parted
      parted: device=/dev/sdb number=1 state=present part_start=1MiB part_end=2GiB

    - name: create vg
      lvg: vg=myvg pvs=/dev/sdb1

    - name: create lvm
      lvol: vg=myvg lv=mylv size=1.99G

    - name: filesystem
      filesystem: fstype=xfs dev=/dev/myvg/mylv

    - name: mount
      mount: src=/dev/mapper/myvg-mylv path=/mnt fstype=xfs state=mounted
上一篇:AD域PowerShell常用命令——Get-ADuser


下一篇:锂电池升压芯片,IC电路图资料