[root@ansible ~]# vim /etc/ansible/hosts
[webserver]
host1
host2
host3
host4
提前设置域名解析:
[root@ansible ~]# vim /etc/hosts
10.36.189.89 ansible
10.36.189.85 host1
10.36.189.87 host2
10.36.189.86 host3
10.36.189.83 host4
ping模块执行成功后,会给你返回绿色的消息,并且有一个pong响应。all代表所有被管理的主机。
[root@ansible ~]# ansible webserver -m ping
host4 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
host2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
host1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
host3 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
因为ansible的默认模块是command,所以这里可以使用 -m 指定模块名 command,也可以直接省略。
- Chdir:执行命令前,切换到目录。
- Creates:当该文件存在时,则不执行该步骤。
- Executable:换用shell环境执行命令。
- Free_form:需要执行的脚本。
- Removes:当该文件不存在时,则不执行该步骤。
- Warn:若在ansible.cfg中存在告警,如果设定了false,不会警告此行。
[root@ansible ~]# ansible webserver -m command -a "free -m"
host4 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 1819 193 1503 9 122 1486
Swap: 2047 0 2047
host1 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 1819 236 1451 9 130 1439
Swap: 2047 0 2047
host3 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 1819 235 1452 9 131 1440
Swap: 2047 0 2047
host2 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 1819 231 1456 9 131 1444
Swap: 2047 0 2047
shell模块和command模块比较类似,但是shell被大家称为万能模块,很多操作command不支持,但是shell却支持。注意最后一种情况shell模块也是不支持的。但是可以将命令写在一个脚本,将脚本拷贝到远端执行,然后执行shell模块获取结果。
[root@ansible ~]# ansible webserver -m shell -a "touch /tmp/a.txt"
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because file is insufficient you can add
'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
host4 | CHANGED | rc=0 >>
host2 | CHANGED | rc=0 >>
host3 | CHANGED | rc=0 >>
host1 | CHANGED | rc=0 >>
注意: 上面出现了WARNING
警告。这不是报错,它只是告诉你,应该选择file
模块进行创建文件的操作会更好,而不是使用shell
模块操作。当然它还告诉你可以在ansible.cfg
配置文件中设置command_warnings=False
以关闭警告。force:覆盖远程主机不一致的内容。group:设定远程主机文件夹的组名。
从ansible管理节点拷贝文件到远程主机。
- src: Ansible端源文件或者目录,空文件夹不复制。
- content:用来替代src,用于将指定文件的内容复制到远程文件内。
- dest:客户端目标目录或者文件,需要绝对路径。
- backup:复制之前,先备份远程节点上的原始文件。
- directory_mode:用于复制文件夹,新建的文件会被复制,而老旧的不会被复制。
- follow:支持link 文件复制。
- force:覆盖远程主机不一致的内容。
- group:设定远程主机文件夹的组名。
- mode:指定远程主机文件及文件夹的权限。
- owner:设定远程主机文件夹的用户名。
[root@ansible ~]# ansible webserver -m copy -a "src=system.sh dest=/tmp/ mode=07 55 owner=root group=root"
host4 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "e144cd424d5d12fea3d3487de8f382b7df53eb38",
"dest": "/tmp/system.sh",
"gid": 0,
"group": "root",
"md5sum": "19a2e25348e58637f95072f4edcfb18b",
"mode": "0755",
"owner": "root",
"size": 7276,
"src": "/root/.ansible/tmp/ansible-tmp-1693574676.49-10625-146551214815236/s ource",
"state": "file",
"uid": 0
}
host2 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "e144cd424d5d12fea3d3487de8f382b7df53eb38",
"dest": "/tmp/system.sh",
"gid": 0,
"group": "root",
"md5sum": "19a2e25348e58637f95072f4edcfb18b",
"mode": "0755",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 7276,
"src": "/root/.ansible/tmp/ansible-tmp-1693574676.49-10621-157641249349702/s ource",
"state": "file",
"uid": 0
}
host3 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "e144cd424d5d12fea3d3487de8f382b7df53eb38",
"dest": "/tmp/system.sh",
"gid": 0,
"group": "root",
"md5sum": "19a2e25348e58637f95072f4edcfb18b",
"mode": "0755",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 7276,
"src": "/root/.ansible/tmp/ansible-tmp-1693574676.49-10623-267465691470688/s ource",
"state": "file",
"uid": 0
}
host1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "e144cd424d5d12fea3d3487de8f382b7df53eb38",
"dest": "/tmp/system.sh",
"gid": 0,
"group": "root",
"md5sum": "19a2e25348e58637f95072f4edcfb18b",
"mode": "0755",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 7276,
"src": "/root/.ansible/tmp/ansible-tmp-1693574676.48-10619-57255450517253/so urce",
"state": "file",
"uid": 0
}
- conf_file:设定远程YUM执行时所依赖的YUM配置文件。
- disable_gpg_check:安装软件包之前是否检查gpg key。
- name:需要安装的软件名称,支持软件组安装。
- update_cache:安装软件前更新缓存。
- enablerepo:指定repo源名称。
- skip_broken:跳过异常软件节点。
- state:软件包状态,包括installed , present ,latest,absent、 removed。
[root@ansible ~]# ansible host4 -m yum -a 'name=nginx state=absent'
host4 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"changes": {
"removed": [
"nginx"
]
},
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running tran saction check\n---> Package nginx.x86_64 1:1.20.1-10.el7 will be erased\n--> Fin ished Dependency Resolution\n\nDependencies Resolved\n\n======================== ========================================================\n Package Arch Version Repository Size\n===================== ===========================================================\nRemoving:\n nginx x86_64 1:1.20.1-10.el7 @epel 1.7 M\n\nTrans action Summary\n================================================================ ================\nRemove 1 Package\n\nInstalled size: 1.7 M\nDownloading packag es:\nRunning transaction check\nRunning transaction test\nTransaction test succe eded\nRunning transaction\n Erasing : 1:nginx-1.20.1-10.el7.x86_64 1/1 \nwarning: /etc/nginx/nginx.conf saved as /etc/nginx/ nginx.conf.rpmsave\n Verifying : 1:nginx-1.20.1-10.el7.x86_64 1/1 \n\nRemoved:\n nginx.x86_64 1:1.20.1-10.el7 \n\nComplete!\n"
]
}
Ansible file模块主要用于对文件的创建、删除、修改、权限、属性的维护和管理, file模块使用详解如下:
- src: Ansible端源文件或者目录。
- follow:支持link 文件复制。
- force:覆盖远程主机不一致的内容。
- group:设定远程主机文件夹的组名。
- mode:指定远程主机文件及文件夹的权限。
- owner:设定远程主机文件夹的用户名。
- path:目标路径,也可以用dest,name代替。
- state:状态包括file,link , directory,hard ,touch ,absent。
- attributes:文件或者目录特殊属性。
[root@ansible ~]# ansible host1 -m file -a "path=/tmp/abc.txt state=touch mode=755"
host1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dest": "/tmp/abc.txt",
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
Ansible user模块主要用于操作系统用户、组、权限﹑密码等操作,user模块使用详解如下:
- system:默认创建为普通用户,为yes则创建系统用户。
- append:添加一个新的组。
- comment:新增描述信息。
- createhome:给用户创建家目录。
- force:强制删除用户。
- group:创建用户主组。
- groups :将用户加入组或者附属组添加。
- home:指定用户的家目录。
- name:表示状态,是否create、remove, modify。
- password:指定用户的密码,此处为加密密码。
- remove:删除用户。
- shell:设置用户的shell 登录环境。
- uid:设置用户ID。
- update_password:修改用户密码。
- state:用户状态,默认为present,表示新建用户。
[root@ansible ~]# ansible host1 -m user -a "name=mas home=/tmp/"
host1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 1000,
"home": "/tmp/",
"name": "mas",
"shell": "/bin/bash",
"state": "present",
"stderr": "useradd: warning: the home directory already exists.\nNot copying any file from skel directory into it.\n",
"stderr_lines": [
"useradd: warning: the home directory already exists.",
"Not copying any file from skel directory into it."
],
"system": false,
"uid": 1000
}
Ansible cron模块主要用于添加﹑删除、更新操作系统crontab任务计划,cron模块使用详解如下:
- 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。
[root@ansible ~]# ansible host1 -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='Ntpdateserver for sync time' job='/usr/sbin/ntpdate ntp.aliyun.com'"
host1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"Ntpdateserver for sync time"
]
}
Ansible service模块主要用于远程客户端各种服务管理,包括启动、停止、重启、重新加载等,service模块使用详解如下:
- enabled:是否开机启动服务。
- name:服务名称。
- runlevel:服务启动级别。
- arguments:服务命令行参数传递。
- state:服务操作状态,状态包括started, stopped,restarted、reloaded。
[root@ansible ~]# ansible host3 -m service -a "name=firewalld state=stopped"
host3 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"name": "firewalld",
"state": "stopped",
"status": {
"ActiveEnterTimestamp": "Fri 2023-09-01 20:57:54 EDT",
"ActiveEnterTimestampMonotonic": "5622901",
"ActiveExitTimestampMonotonic": "0",
"ActiveState": "active",
"After": "system.slice polkit.service dbus.service basic.target",
"AllowIsolate": "no",
"AmbientCapabilities": "0",
"AssertResult": "yes",
"AssertTimestamp": "Fri 2023-09-01 20:57:54 EDT",
"AssertTimestampMonotonic": "5052989",
"Before": "multi-user.target shutdown.target network-pre.target",
"BlockIOAccounting": "no",
"BlockIOWeight": "18446744073709551615",
"BusName": "org.fedoraproject.FirewallD1",
"CPUAccounting": "no",
"CPUQuotaPerSecUSec": "infinity",
"CPUSchedulingPolicy": "0",
"CPUSchedulingPriority": "0",
"CPUSchedulingResetOnFork": "no",
"CPUShares": "18446744073709551615",
"CanIsolate": "no",
"CanReload": "yes",
"CanStart": "yes",
"CanStop": "yes",
"CapabilityBoundingSet": "18446744073709551615",
"CollectMode": "inactive",
"ConditionResult": "yes",
"ConditionTimestamp": "Fri 2023-09-01 20:57:54 EDT",
"ConditionTimestampMonotonic": "5052989",
"Conflicts": "iptables.service ebtables.service ip6tables.service ipset.service shutdown.target",
"ControlGroup": "/system.slice/firewalld.service",
"ControlPID": "0",
"DefaultDependencies": "yes",
"Delegate": "no",
"Description": "firewalld - dynamic firewall daemon",
"DevicePolicy": "auto",
"Documentation": "man:firewalld(1)",
"EnvironmentFile": "/etc/sysconfig/firewalld (ignore_errors=yes)",
"ExecMainCode": "0",
"ExecMainExitTimestampMonotonic": "0",
"ExecMainPID": "722",
"ExecMainStartTimestamp": "Fri 2023-09-01 20:57:54 EDT",
"ExecMainStartTimestampMonotonic": "5054660",
"ExecMainStatus": "0",
"ExecReload": "{ path=/bin/kill ; argv[]=/bin/kill -HUP $MAINPID ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }",
"ExecStart": "{ path=/usr/sbin/firewalld ; argv[]=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS ; ignore_errors=no ; start_time=[Fri 2023-09-01 20:57:54 EDT] ; stop_time=[n/a] ; pid=722 ; code=(null) ; status=0/0 }",
"FailureAction": "none",
"FileDescriptorStoreMax": "0",
"FragmentPath": "/usr/lib/systemd/system/firewalld.service",
"GuessMainPID": "yes",
"IOScheduling": "0",
"Id": "firewalld.service",
"IgnoreOnIsolate": "no",
"IgnoreOnSnapshot": "no",
"IgnoreSIGPIPE": "yes",
"InactiveEnterTimestampMonotonic": "0",
"InactiveExitTimestamp": "Fri 2023-09-01 20:57:54 EDT",
"InactiveExitTimestampMonotonic": "5055144",
"JobTimeoutAction": "none",
"JobTimeoutUSec": "0",
"KillMode": "mixed",
"KillSignal": "15",
"LimitAS": "18446744073709551615",
"LimitCORE": "18446744073709551615",
"LimitCPU": "18446744073709551615",
"LimitDATA": "18446744073709551615",
"LimitFSIZE": "18446744073709551615",
"LimitLOCKS": "18446744073709551615",
"LimitMEMLOCK": "65536",
"LimitMSGQUEUE": "819200",
"LimitNICE": "0",
"LimitNOFILE": "4096",
"LimitNPROC": "7183",
"LimitRSS": "18446744073709551615",
"LimitRTPRIO": "0",
"LimitRTTIME": "18446744073709551615",
"LimitSIGPENDING": "7183",
"LimitSTACK": "18446744073709551615",
"LoadState": "loaded",
"MainPID": "722",
"MemoryAccounting": "no",
"MemoryCurrent": "18446744073709551615",
"MemoryLimit": "18446744073709551615",
"MountFlags": "0",
"Names": "firewalld.service",
"NeedDaemonReload": "no",
"Nice": "0",
"NoNewPrivileges": "no",
"NonBlocking": "no",
"NotifyAccess": "none",
"OOMScoreAdjust": "0",
"OnFailureJobMode": "replace",
"PermissionsStartOnly": "no",
"PrivateDevices": "no",
"PrivateNetwork": "no",
"PrivateTmp": "no",
"ProtectHome": "no",
"ProtectSystem": "no",
"RefuseManualStart": "no",
"RefuseManualStop": "no",
"RemainAfterExit": "no",
"Requires": "system.slice basic.target",
"Restart": "no",
"RestartUSec": "100ms",
"Result": "success",
"RootDirectoryStartOnly": "no",
"RuntimeDirectoryMode": "0755",
"SameProcessGroup": "no",
"SecureBits": "0",
"SendSIGHUP": "no",
"SendSIGKILL": "yes",
"Slice": "system.slice",
"StandardError": "null",
"StandardInput": "null",
"StandardOutput": "null",
"StartLimitAction": "none",
"StartLimitBurst": "5",
"StartLimitInterval": "10000000",
"StartupBlockIOWeight": "18446744073709551615",
"StartupCPUShares": "18446744073709551615",
"StatusErrno": "0",
"StopWhenUnneeded": "no",
"SubState": "running",
"SyslogLevelPrefix": "yes",
"SyslogPriority": "30",
"SystemCallErrorNumber": "0",
"TTYReset": "no",
"TTYVHangup": "no",
"TTYVTDisallocate": "no",
"TasksAccounting": "no",
"TasksCurrent": "18446744073709551615",
"TasksMax": "18446744073709551615",
"TimeoutStartUSec": "1min 30s",
"TimeoutStopUSec": "1min 30s",
"TimerSlackNSec": "50000",
"Transient": "no",
"Type": "dbus",
"UMask": "0022",
"UnitFilePreset": "enabled",
"UnitFileState": "enabled",
"WantedBy": "multi-user.target",
"Wants": "network-pre.target",
"WatchdogTimestamp": "Fri 2023-09-01 20:57:54 EDT",
"WatchdogTimestampMonotonic": "5622374",
"WatchdogUSec": "0"
}
}
Ansible的script模块允许在远程主机上执行本地脚本或命令。
script
: 指定要执行的本地脚本文件或命令。可以是绝对路径或相对路径。args
: 指定要传递给脚本的参数。可以是一个字符串或一个列表。例如:args: "--arg1 value1 --arg2 value2"
。chdir
: 指定在目标主机上执行脚本时的工作目录。可以是绝对路径或相对路径。creates
: 指定一个文件路径,如果该文件存在,则不会执行脚本。这可以用于检查脚本是否已经执行过。removes
: 指定一个文件路径,如果该文件存在,则会执行脚本。这可以用于检查脚本是否需要重新执行。executable
: 指定要在目标主机上执行的脚本的可执行程序。例如:executable: /bin/bash
。stdin
: 指定一个字符串,作为脚本的标准输入。例如:stdin: "input data"
。stdin_add_newline
: 如果设置为no
,则不会在stdin的末尾添加换行符。默认为yes
。strip_empty_ends
: 如果设置为no
,则不会从脚本的输出中删除空行。默认为yes
。warn
: 如果设置为no
,则不会在脚本执行失败时生成警告。默认为yes
。become
: 如果设置为yes
,则以提升的权限(通常是sudo)执行脚本。默认为no
。become_user
: 指定以哪个用户的身份执行脚本,仅在become
设置为yes
时有效。become_method
: 指定使用哪种方法进行身份提升,例如sudo
或su
。默认为sudo
。environment
: 指定一个字典,包含要设置的环境变量。例如:environment: {PATH: "/usr/local/bin:/usr/bin:/bin"}
[root@ansible ~]# ansible host1 -m script -a "hello.sh"
host1 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to host1 closed.\r\n",
"stderr_lines": [
"Shared connection to host1 closed."
],
"stdout": "hello\r\n",
"stdout_lines": [
"hello"
]
}
fetch模块用于从远程主机上复制文件到控制主机上。
src
(必填):指定要从远程主机复制的文件路径。可以是绝对路径或相对路径。dest
(必填):指定要将文件复制到的本地目录路径。可以是绝对路径或相对路径。flat
(可选):如果设置为yes
,则将所有文件复制到dest
目录中,而不会保留原始的目录结构。默认为no
,即保留原始的目录结构。validate_checksum
(可选):如果设置为yes
,则在复制文件之前验证远程文件的校验和。默认为no
。checksum_algorithm
(可选):指定用于校验和计算的算法。默认为md5
。remote_src
(可选):如果设置为yes
,则将src
参数解释为远程主机上的路径,而不是控制主机上的路径。默认为no
。flat_suffix
(可选):如果设置了flat
参数,并且复制的文件名在目标目录中已存在,则使用此后缀进行重命名。默认为空字符串。fail_on_missing
(可选):如果设置为yes
,则在远程主机上的文件不存在时,任务将失败。默认为yes
。follow
(可选):如果设置为yes
,则跟随符号链接。默认为no
。get_checksum
(可选):如果设置为yes
,则在复制文件之后返回文件的校验和。默认为no
。get_md5
(可选):如果设置为yes
,则在复制文件之后返回文件的MD5校验和。默认为no
。get_sha1
(可选):如果设置为yes
,则在复制文件之后返回文件的SHA1校验和。默认为no
。get_sha256
(可选):如果设置为yes
,则在复制文件之后返回文件的SHA256校验和。默认为no
。
[root@ansible ~]# ansible host1 -m fetch -a "src=/tmp/a.txt dest=/root/"
host1 | CHANGED => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/root/host1/tmp/a.txt",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"remote_md5sum": null
}
Ansible的unarchive模块用于解压缩文件。它支持解压缩多种压缩格式,包括tar、gzip、bzip2、zip和rar等。
src
(必填):指定要解压缩的文件路径。可以是远程主机上的路径或控制主机上的路径。dest
(必填):指定解压缩后的文件存放路径。可以是远程主机上的路径或控制主机上的路径。remote_src
(可选):如果设置为yes
,则将src
参数解释为远程主机上的路径,而不是控制主机上的路径。默认为no
。format
(可选):指定要解压缩的文件格式。可选值包括tar
、gzip
、bzip2
、zip
和rar
。如果不指定该参数,Ansible会自动根据文件扩展名来确定格式。creates
(可选):指定一个文件路径,如果该文件已经存在,则不执行解压缩操作。extra_opts
(可选):指定额外的解压缩选项。可根据不同的格式提供不同的选项。remote_src
(可选):如果设置为yes
,则将src
参数解释为远程主机上的路径,而不是控制主机上的路径。默认为no
。
[root@ansible ~]# ansible host1 -m unarchive -a 'src=/root/1.tar dest=/tmp/'
host1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dest": "/tmp/",
"extract_results": {
"cmd": [
"/usr/bin/gtar",
"--extract",
"-C",
"/tmp/",
"-f",
"/root/.ansible/tmp/ansible-tmp-1693621741.48-31359-276269799795958/source"
],
"err": "",
"out": "",
"rc": 0
},
"gid": 0,
"group": "root",
"handler": "TarArchive",
"mode": "01777",
"owner": "root",
"secontext": "system_u:object_r:tmp_t:s0",
"size": 4096,
"src": "/root/.ansible/tmp/ansible-tmp-1693621741.48-31359-276269799795958/source",
"state": "directory",
"uid": 0
}