Ansible基础操作

CentOS安装ansible

示例:

yum instsll -y epel-release
yum install -y ansible

其它系统安装请参考Ansible安装

Ansible配置文件

/etc/ansible/ansible.cfg	# 主配置文件
/etc/ansible/hosts			# Inventory

定义Inventory

vi /etc/ansible/hosts
 
[dbserver]
192.168.1.2 ansible_sudo_pass='123456'	# ansibble_sudo_pass是当连接的用户不是root时,要使用sudo命令的密码
 
[webserver]
192.168.1.3 ansible_ssh_user=admin ansible_ssh_pass='12345' # 默认remote_user=root,在ansible.cfg中可以修改
192.168.1.4

使用秘钥方式连接服务器

ssh-keygen
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.2

Ansible命令基础

ansible <host-pattern> [-f forks] [-m module_name] [-a args]
<host-pattern>  这次命令对哪些主机生效的
   inventory group name
   ip
   all
-f forks        一次处理多少个主机
-m module_name  要使用的模块
-a args         模块特有的参数

常见模块

command Ansible的默认模块,可以运行远程权限范围所有的shell命令,不支持变量和管理符。

ansible all -a 'date'

cron 计划任务

  • month # 月
  • minute # 分
  • day # 天
  • hour # 小时
  • weekday # 周几
  • job # 指定任务
  • state # 表示添加还是删除
    • present # 添加(默认)
    • absent # 删除

添加、删除定时任务示例

ansible test -m cron -a 'minute="*/2" job="echo abc >> /tmp/log" name="test cron job"'
ansible test -a 'crontab -l'
ansible test -m cron -a 'minute="*/2" job="echo abc >> /tmp/log" name="test cron job" state=absent'
 

user 用户账号管理

  • name
  • uid
  • state
    • present # 添加(默认)
    • absent # 删除
  • group # 所属组
  • groups # 附加组
  • home
  • createhome # 是否创建家目录
  • comment # 注释信息
  • system # 是否为系统用户

示例

ansible all -m user -a 'name="username"'
ansible all -m user -a 'name="username" state=absent'

group 用户组管理

  • gid

  • name # 组外

  • state

  • - present	# 添加(默认)
    
    • absent # 删除
  • system # 是否为系统用户

示例

ansible test -m gruop -a 'name=mysql gid=306 system=yes'
ansible test -m user -a 'name=mysql uid=306 system=yes group=mysql'

copy 复制文件

  • src
  • dest
  • owner # 所有者
  • group # 所有组
  • mode # 权限
  • content # 取代src=,直接秀此处的信息生成文件内容

示例

ansible test -m copy -a 'src=./filename dest=/root/ owner=root mode=640'
ansible test -m copy -a 'content="Hello world" dest=/tmp/txtfile'

file 设置文件属性

  • path|dest|name # 要操作的文件具体路径

示例

# 修改文件权限
ansible dbserver -m file -a 'owner=mysql group=mysql mode=644 path=/tmp/txtfile'
 
# 链接文件
ansible dbserver -m file -a 'path=/newpath/txtfile src=/tmp/txtfile state=link'
 

ping 测试指定主机是否能连接

ansible test -m ping

service 管理服务运行状态

  • enabled # 是否开机启动
  • name # 服务名
  • state # 指定服务状态
    • started # 启动
    • stoped # 停止
    • restarted # 重启
  • arguments # 服务参数

示例

ansible dbserver -m service -a 'enabled=true name=mysqld state=started'

shell 在远程主机上运行命令,可以使用管道符或变量等复杂命令

示例

ansible all -m shell -a 'cat /etc/passwd | grep root'

在Ansible中,-a 选项和 shell 模块都可以用于在目标主机上执行命令,但它们有一些区别。

  1. -a 选项

    -a 选项用于在命令行中指定Ad-hoc命令,允许直接执行简单的命令。例如:

    ansible all -i inventory_file -a 'command_to_execute'

    这种方式适用于简单的任务,但对于复杂的任务,尤其是需要使用管道、重定向或其他高级Shell功能的任务,可能会变得笨拙和不方便。

  2. shell 模块

    shell 模块是一个Ansible模块,允许你在目标主机上运行复杂的Shell命令。使用这个模块,你可以在Playbook中以更结构化的方式定义命令。示例:

    ---
    - name: Example Playbook with shell module
      hosts: all
      tasks:
        - name: Run complex command with shell module
          shell: |
            echo "Hello, world!"
            mkdir /tmp/example
            touch /tmp/example/file.txt

    在这个示例中,shell 模块允许你通过 | 符号定义多行Shell命令。

总体而言,推荐使用 shell 模块,尤其是在编写更复杂的Playbooks时。它提供了更好的可读性和维护性,而 -a 选项更适合在命令行上执行简单的任务。

script 将本地服务复制到运程主机上运行

示例

ansible test -m script -a 'sh/test.sh'

yum 安装程序

  • name # 包名
  • state
    • present|latest # 安装
    • absent # 卸载

示例

ansible all -m yum -a 'name=ntpd'
 
# 卸载
ansible all -m yum -a 'name=ntpd state=absent'

setup 收集远程主机的信息,如操作系统版本,IP地址等

示例

ansible all -m setup

远程用户非root,使用sudo/su执行

ansible 1.9之前的操作

先调整一下/etc/ansible/hosts的配置

[node2]
192.168.1.2 ansible_sudo_pass='123456'	# ansibble_sudo_pass是当连接的用户不是root时,要使用sudo命令的密码
 
[webserver]
192.168.1.3 ansible_ssh_user=admin ansible_ssh_pass='12345' # 默认remote_user=root,在ansible.cfg中可以修改
192.168.1.4

在管理机上执行

ansible node2 -a "touch /data/file" --sudo	# --sudo,以sudo到root的方式执行
 
ansible node2 -a "touch /data/file2" -u admin --sudo # -u 指定用户
 

ansilbe 1.9之后的版本使用become替代了sudo/su

修改配置文件/etc/ansible/ansible.cfg

...
[privilege_escalation]
become=True	# 开启
#become_method=sudo	# 方式 sudo su
#become_user=root	# 切换到的用户,
#become_ask_pass=False	# 是否询问密码,如果在hosts文件中配置了,可以配置为False
...

修改/etc/ansible/hosts内容

[node1]
192.168.1.2 ansible_become_pass='12345'	# sudo换成become
 

Ansible playbook

结构:

  • inventory # 应对要操作的主机
  • modules # 调用哪些模块做操作
  • ad hoc commadns # 在这些主机上执行哪些命令
  • playbooks
    • tasks # 任务,即调用模块完成的操作
    • variable # 变量
    • templates # 模板
    • handlers # 触发器,由某件事件触发执行的操作
    • roles # 角色

playbook示例

- hosts: 172.23.210.27,172.23.210.28		# 要执行的目标主机或主机组
  remote_user: root							# 远程用户
  vars:										# 定义变量
    http_port: 8080							# 具体变量
  tasks:									# 定义一个任务
    - name: create new file					# 任务名称
	  file: name=/tmp/playtestfile.txt state=touch	# 调用`file`模块,和创建文件操作
    - name: install package					# 任务名
	  yum: name=mysqld						# 调用`yum`模块,并安装msyqld
	- name: config mysqld
	  template: src=./my.cnf dest=/etc/my.cnf
	  notify:								# 触发器,当条件触发后要做的操作,配合handlers使用
	    - restart mysqld					# 引用的handlers的名字
    - name: start mysqld
	  service: name=mysqld state=started
  handlers:									# notify定义的触发后要执行的操作
    - name: restart mysqld					# handlers的名称,跟notify引用的一样
	  service: name=mysqld state=restarted	# 触发要执行的操作

运行Ansible playbook ansible-playbook playbook.yaml

playbook变量的赋值与调用

- hosts: all
  remote_user: root
  vars:
    dir_name: testname
  tasks:
    - name: create new dir
	  command: mkdir /tmp{{ dir_name }}	# 调用变量需要用两个大括号{{}}将其括起来

通过playbook 使用yum删除和安装软件

在 Ansible 中,你可以通过 playbook 使用 yum 模块来删除和安装软件。这对于在基于 Red Hat 的系统(如 CentOS, Fedora, RHEL 等)上管理软件包非常有用。下面是如何编写这样的 playbook 的示例。

安装软件包

要安装软件包,你可以使用 yum 模块并设置 state 参数为 present。这会确保指定的软件包已安装。

- name: Install a software package
  hosts: all
  become: yes # 使用超级用户权限
  tasks:
    - name: Install Apache
      yum:
        name: httpd # 软件包名
        state: present

删除软件包

要删除软件包,将 state 参数设置为 absent。这将确保指定的软件包未安装在系统上。

- name: Remove a software package
  hosts: all
  become: yes # 使用超级用户权限
  tasks:
    - name: Remove Apache
      yum:
        name: httpd # 软件包名
        state: absent
在 Ansible 中,state 是指软件包的期望状态。对于 yum 模块,state 参数指定了软件包的安装或删除行为。
 
state: present 表示 确保软件包已经安装。如果目标系统上尚未安装该软件包,Ansible 会自动安装它;如果已安装,Ansible 不会做任何改变。
另外,state 参数还可以设置为:
absent:表示确保软件包已被删除。如果软件包已安装,Ansible 会卸载它;如果已删除,它不会执行任何操作。
latest:表示确保软件包为最新版本。如果目标系统上没有安装该软件包,或者已安装的版本不是最新的,Ansible 会安装或更新到最新版本。

运行 playbook

保存你的 playbook 为一个文件(例如 manage_packages.yml),然后在包含你的远程主机的 Ansible inventory 的情况下运行它:

ansible-playbook manage_packages.yml

主机信息可以写到/etc/ansible/hosts和用-i参数单独引用的区别

在 Ansible 中,主机信息可以写到两个地方:/etc/ansible/hosts 文件和通过 -i 参数单独引用。这两种方式都可以定义 Ansible 的目标主机,但它们有一些区别。

1. /etc/ansible/hosts 文件

  • 位置:这是 Ansible 默认的主机清单文件(Inventory)。
  • 用途:当你运行 ansibleansible-playbook 命令时,Ansible 会默认查找这个文件,除非你通过 -i 参数指定了其他的清单文件。
  • 内容:通常是一个简单的文本文件,里面列出了目标主机的 IP 地址或主机名,并可以按组进行组织。
  • 管理:适合用于长期管理和存储主机信息,特别是当你有一个固定的基础设施环境时,主机清单文件可以长期保持不变。

示例:

# /etc/ansible/hosts 文件
[webservers]
web1.example.com
web2.example.com
 
[dbservers]
db1.example.com
db2.example.com

2. -i 参数单独引用

  • 用途:通过 -i 参数指定自定义的清单文件或主机信息。当你运行 ansibleansible-playbook 命令时,Ansible 会根据你指定的清单文件来查找主机信息。
  • 灵活性:这种方式允许你动态地指定主机清单,尤其适用于临时任务、特定的环境或调试场景。你可以在命令行中直接引用不同的清单文件或主机列表,而不必修改 /etc/ansible/hosts
  • 文件类型:你可以使用任何符合 Ansible 清单格式的文件,包括 .ini 文件、YAML 文件,甚至直接在命令行中列出主机。

示例:

ansible-playbook -i custom_inventory.ini my_playbook.yml

或直接在命令行中指定主机:

ansible-playbook -i "web1.example.com,web2.example.com," my_playbook.yml
注意:在此示例中,主机列表末尾的逗号(`,`)是必须的,否则 Ansible 会将其视为主机组名而不是单个主机。这是因为 Ansible 期望-i参数值是一个主机列表,且每个主机之间用逗号分隔。

区别总结:

  1. 默认位置 vs. 自定义位置

    • /etc/ansible/hosts 是默认的主机清单文件,适用于固定或长期的主机管理。
    • -i 参数用于临时或自定义的清单文件,适用于不同的清单配置或单次任务。
  2. 灵活性

    • /etc/ansible/hosts 文件适合稳定的环境,便于长期管理。
    • -i 参数提供了灵活性,支持临时指定或调试不同的主机清单。
  3. 覆盖关系

    • 如果你同时指定了 -i 参数和 /etc/ansible/hosts 文件,-i 参数指定的文件会覆盖默认的 /etc/ansible/hosts 文件。
  4. 使用场景

    • 使用 /etc/ansible/hosts 时,适合在没有特殊需求的情况下集中管理主机。
    • 使用 -i 参数时,适合临时指定不同的主机清单或在脚本、自动化流程中动态生成主机列表。