Linux下ansible使用(自动化运维)示例


//系统、版本
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster
$ uname -r
4.19.97-v7l+
$ ansible --version
ansible 2.7.7
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/pi/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.7.3 (default, Dec 20 2019, 18:57:59) [GCC 8.3.0]
//前提
//ansible使用基于ssh,所以服务器间互免密登陆非常重要,可参考我的另一篇博文
//[Linux下ssh单向免密登陆/互免密登陆](https://blog.csdn.net/qq_35590198/article/details/87360081)
//另,需要安装python (一般使用自带的默认版本即可)

//安装ansible
# apt-get -y install ansible
# whereis ansible
ansible: /usr/bin/ansible /etc/ansible /usr/share/ansible /usr/share/man/man1/ansible.1.gz
# ansible --help	//获取帮助

//配置文件
# vim /etc/ansible/ansible.cfg	//(可选)编辑180行的deprecation_warnings为False,用于减少ansible提示
180 deprecation_warnings = False

# vim /etc/ansible/hosts	//在文件的最后追加模块以及hosts (这是一个示例,当有多个时,按照实际修改)
[localhost-vm]
192.168.56.20 ansible_ssh_user=root ansible_ssh_port=22
//ansible_ssh_user 为指定使用的用户,ansible_ssh_port 为指定ssh端口,这2个参数如果都为默认,否则都可以省略
//配置完毕(要注意的是ansible的配置文件修改后不需要重新载入之类的操作,保存后即可使用)
//命令示例 通过shell模块安装包
# ansible -i /etc/ansible/hosts localhost-vm -m shell -a 'yum -y install tree' -vvvv
//-i 指定使用的hosts
//localhost-vm 要执行的命令的主机组或ip地址(根据实际会不同)
//-m 指定使用什么模块(根据使用的模块不同,命令各不相同)
//-a 指定执行什么命令(即命令的内容)
//-vvvv 显示执行命令的详细程度,v越多越详细,反之该选项可以忽略
//命令示例 判断 localhost-vm 主机组下的主机是否存活
# ansible localhost-vm -m ping
//命令示例 批量创建用户(用户名以及密码明文)
# pwd
/etc/ansible
# vim userlist.yml	//创建文件添加以下内容
#################分割线#################
---
- hosts: localhost-vm
  tasks:
    - name: create user
      user:
        name: "{
     { item.user }}"
        password: "{
     { 'item.pass' | password_hash('sha512') }}"
        state: present
      loop:
        - {
      user: user-name1, pass: user-passwd}
        - {
      user: user-name2, pass: user-passwd}
#################分割线#################
localhost-vm	//hosts中的群组名称或ip
loop	//所需创建的用户名以及密码
# ansible-playbook createuser.yml	//执行命令
//命令示例 从ansible推送文件到群组
# ansible localhost-vm -m copy -a 'src=/etc/ansible/shell/hostname.sh dest=/root/hostname.txt backup=yes mode=777 owner=www'

localhost-vm	//群组名或ip
copy	//copy是模块名
src	//后接源目标路径
dest	//后接目的目标(根据示例这里可以为目录,可以为不同名称文件(若为文件则传输并改名))(可省略)
mode	//指定文件权限(可省略)
owner	//指定文件所有者(可省略)
//通过 # ansible-doc copy 可以查看详细的关于copy模块描述
//命令示例,下载文件(目标文件必须是具体文件)
# ansible localhost-vm -m fetch -a 'src=/home/128.log dest=/root/128/'
//fetch 文件下载模块
//src 下载源文件路径
//dest 下载目的目录
//命令示例 删除文件
# ansible localhost-vm -m shell -a 'rm -f /root/hostname.sh'
//检查
# ansible localhost-vm -m shell -a 'ls /root'
//命令示例 使用file模块
# ansible localhost-vm -m file -a 'name=/root/test state=touch'
name	//后接目标的绝对路径
state	//决定创建的是目录还是文件
touch	//表示创建
absent	//反之 absent 表示删除(包含文件和目录)
directory	//表示目录

//创建软链接
# ansible localhost-vm -m file -a 'src=/root/name.txt dest=/name.link state=link'
link	//表示软链接
src	//源
dest	//目标

//删除软链接
# ansible localhost-vm -m file -a 'dest=/name.link state=absent'
//命令示例 hostname模块修改主机名
# ansible localhost-vm -m hostname -a 'name=Test-client.com'
name	//后接主机名

# ansible localhost-vm -m shell -a 'cat /etc/hostname'	//检查
//命令示例 cron模块
# ansible localhost-vm -m cron -a 'minute=* job="/usr/bin/wall FBI warning" name=warning'
cron	//模块名
minute	//定时什么时候执行(注意,crontab中 分 时 日 月 周 5个时间如没有指定则为 * )
job	//"具体的任务内容"
name	//作业名称

//禁用crontab任务
# ansible localhost-vm -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warning'

//启用crontab任务
# ansible localhost-vm -m cron -a 'disabled=false job="/usr/bin/wall FBI warning" name=warning'

//删除crontab任务
# ansible localhost-vm -m cron -a 'job="/usr/bin/wall FBI warning" name=warning state=absent'

//检查
# ansible localhost-vm -m shell -a 'crontab -l'
//命令示例 yum模块
# ansible localhost-vm -m yum -a 'name=httpd,memcached state=installed update_cache=yes'
yum	//模块名
name	//后接需要安装的包名,多个时用 , 隔开。也可接本地rpm路径,安装本地包(如name=/root/src/popt-static-1.13-7.el6.x86_64.rpm)
state	//state有多种状态('present' or 'installed', 'latest''absent' or 'removed')
update_cache	//更新缓存(可忽略)

//卸载包
# ansible localhost-vm -m yum -a 'name=httpd,memcached state=absent'
//命令示例 service模块
# ansible localhost-vm -m service -a 'name=rpcbind state=started enabled=yes'
service	//模块名称
name	//后接服务名称
state	//后接操作(包含 {
     started | stopped | restarted | reloaded})
enable	//是否开机启用(可忽略)(yes or no 或 true or false)

# ansible localhost-vm -m shell -a 'ps aux|grep rpcbind'	//检查
//命令示例 user模块
# ansible localhost-vm -m user -a 'name=nginx shell=/sbin/nologin system=yes groups=root group=nginx home=/home/nginx comment="nginx service"'
user	//模块名
name	//指定用户名
shell	//指定使用的shell
system	//是否是系统用户(可忽略)
groups	//指定附属组
group	//指定主组
home	//指定家目录(可忽略)
comment	//注释(可忽略)
//需要注意:主组、附属组、家目录等如果不存在需要先创建
//更多参数,详见 # ansible-doc user

//删除用户
# ansible localhost-vm -m user -a 'name=nginx shell=/sbin/nologin system=yes groups=root comment="nginx service" state=absent'

//检查
# ansible localhost-vm -m shell -a 'id nginx'
//命令示例 group模块
# ansible localhost-vm -m group -a 'name=nginx system=yes'
group	//模块名
name	//指定组名称
system	//是否是系统组(可忽略)
//更多参数,详见 # ansible-doc group

//删除组
# ansible localhost-vm -m group -a 'name=nginx system=yes state=absent'

//检查
# ansible localhost-vm -m shell -a 'getent group nginx'
//命令示例 ansible-galaxy [官网地址](https://galaxy.ansible.com)
//galaxy表示一种可扩充语言,通过ansible-galaxy命令,可以从网络上把已经各种写好的galaxy下载下来使用。
# ansible-galaxy install geerlingguy.nginx	//安装nginx roles(默认下载到 ~/.ansible/roles/geerlingguy.nginx)
# ansible-galaxy list	//列出所有已安装的roles
# ansible-galaxy remove geerlingguy.nginx	//删除nginx roles
//ansible编译安装jdk
$ pwd
../roles/jdk-ansible-role
$ tree -N ./	##目录结构
./
├── files
│   └── jdk-8u241-linux-x64.tar.gz
└── jdk.yaml

1 directory, 2 files

//playbook内容
$ cat jdk.yaml 
====分割线====
- hosts: localhost-vm
  remote_user: root
  roles:
      - ..ansible/roles/jdk-ansible-role	##根据实际路径修改
  tasks:
      - name: create dir
        file: name=/usr/java state=directory
      - name: copy and unzip
        unarchive: src=jdk-8u241-linux-x64.tar.gz dest=/usr/java/
      - name: set env
        lineinfile: path=/etc/profile insertafter={
     {
      item.position }} line={
     {
      item.value }} state=present
        with_items:
            - {
      position: EOF, value: "JAVA_HOME=/usr/java/jdk1.8.0_241"}
            - {
      position: EOF, value: "PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin"}
            - {
      position: EOF, value: "CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME%/lib/dt.jar:$JAVA_HOME/lib:$JAVA_HOME/jre/lib"}
            - {
      position: EOF, value: "export JAVA_HOME PATH CLASSPATH"}
      - name:
        file: dest=/usr/java/jdk1.8.0_241 mode=0755 recurse=yes
      - name: source profile    ##貌似没有作用,所以运行该yaml后执行 sudo ansible localhost-vm -m shell -a 'source /etc/profile && java -version'
        shell: source /etc/profile
====分割线====
//执行playbook
$ sudo ansible-playbook jdk.yaml
//
//验证
$ sudo ansible localhost-vm -m shell -a 'source /etc/profile && java -version

你可能感兴趣的:(CentOS_6,CentOS_7,shell,script)